使用Processing表现随机行为及牛顿运动学
简介
本博客中做的五个实验均用Processing完成,
实验内容多半从书籍 The Nature of Code中学习而得,
甚至是在其参考程序的基础上进行拓展修改而成的。
实验一 生成色彩平滑变化的噪声地形图
效果展示
效果一 灰度变换
效果二 RGB颜色变化
效果三 将线框隐去
参考案例与规律介绍
第一个实验我参考的案例是书中的 示例代码 0-6 和练习 0.10
即 二维Perlin噪声 和 噪声地形图
在原案例中,为了实现噪声地形图,代码中使得矩形顶点的Z轴坐标由 noise() 函数决定
z[i][j] = 0.5*map(noise(xoff, yoff,zoff), 0, 1, -120, 120);
在此处,noise() 函数为三维的Perlin噪声,其噪声波形由三个值决定。
其中 xoff 与 yoff 两个值分别为行列的漂移值,这个两个值在地形图坐标循环计算过程中递增,使得不同的矩形高低不同。
但是 xoff 和 yoff 的递增值很小,这样做是为了保证相邻的矩形之间高度相差不会过于大,使得整体地形看起来平滑、和谐。
其中 map() 函数为映射函数,将 noise() 的返回值由(0,1)映射到(-120,120).
在认真分析原案例后,我发现原案例的矩形是只有一种颜色的,看起来过于单调。
所以就有了让地形图呈现彩色的想法。
代码分析
为了让矩形呈现彩色,那就要分别给矩形的RGB赋值。每个矩形的颜色要不一样,要想让效果变得炫酷,最好颜色是随机变换的。但是随机性又不能太强,如果一个红色矩形四周的八个矩形都是绿色的,那就太丑了。所以相邻矩形的RGB要平滑的随机变化。
Perlin噪声就能很好的满足这个需求。
R = map(noise(xoff, yoff,t_coff), 0, 1, 0, 255);
G = map(noise(xoff, yoff,t_coff+10000), 0, 1, 0, 255);
B = map(noise(xoff, yoff,t_coff+20000), 0, 1, 0, 255);
fill(R,G,B);
上面的代码实现了效果一,相邻矩形之间的灰度不同,且随着时间矩形的灰度也会变化。
但是上述代码却没有实现彩色的效果,分析后发现可能是和 noise() 的参数有关,虽然 RGB 的第三个参数不同,但是前两个参数相同,导致其返回值的差异有限,只能产生灰度图的效果。
R = map(noise(xoff, yoff,t_coff), 0, 1, 0, 255);
G = map(noise(xoff+10000, yoff+10000,t_coff+10000), 0, 1, 0, 255);
B = map(noise(xoff+20000, yoff+20000,t_coff+20000), 0, 1, 0, 255);
fill(R,G,B);
在修改代码后就实现了效果二。
但是地形图中矩形边上还是有黑黑的边框,不是特别美观。将边框隐去有两个方法,一个是让边框颜色和矩形一样,另一个是直接不绘制线框,两个方法都可以,我使用了第一个。
stroke(R,G,B);
noStroke();
实验二 蚊虫群模拟
效果展示
效果一
效果二
参考案例与规律介绍
第二个实验我参考的案例是书中的 示例代码 1-5 和 示例代码 1-11
即 向量的长度 和 一组同时朝着鼠标加速的运动物体
本实验的规律是蚊虫群与人的交互。
假设一个人身处傍晚时的草坪上,那这个人的头上可能就密密麻麻的飞着非常多的小蚊子。当这个人保持静止或者是走路时,蚊群就会跟着这个人,当你想要挥手去赶这些“烦人”的小东西时,它们就会一哄而散。
在本实验中,当鼠标静止不动或者是运动趋势为远离小球时,小球会受到一个方向为小球