参考《自然代码》一书的前五章来描述牛顿随机行为。
平台:processing
第一章主要是描述processing中的向量的使用方法
再放代码之前先列出几个比较常用的向量使用方法:
①用PVector v = new PVector(x,y),向量可以使用实例调用向量的坐标位置:v.x , v.y
②.mag()函数来获取向量的长度
③.mult(int)函数来进行向量的数乘
④.add(PVector)函数进行向量之间的加法 .sub(PVector)减法
⑤.dist(PVector)函数计算两个向量之间的距离
⑥.dot(PVector)函数计算两个向量的点积
⑦.normalize(PVector)函数将向量进行归一化处理
⑧.limit(int)函数对向量长度进行限制
参考第一章的代码我们实现多个圆跟随鼠标运动(有加速度),当圆碰到边缘时会反弹。
先给圆编写一个类,最后用数组创建类的实例,再用循环给实例进行实例化,这样一次就可以创建多个圆。
圆类:mover
确定mover类有哪些属性,就是实例化出来的圆有哪些能力。
三个PVector类型的变量,分别是:位置,向量(速度和方向)、加速度,一个float类型的变量:最大速度
PVector position;
PVector velocity;
PVector acceleration;
float topspeed;
然后就是创建实例的函数:(实例初始的位置是画布长和宽的随机数)
Mover()
{
position = new PVector(random(width),random(height));
velocity = new PVector(0,0);
topspeed = 5;
}
最后就是两个类函数,通过类的实例可以调用:
1、更新位置的函数
加速度向量等于鼠标向量减去目前的mover位置,进行归一化,再乘上0.2(一会我们会去掉乘上0.2看看会怎么样)
用limit函数用刚才的最大速度限制向量。
void update()
{
//计算一个向量从小球位置到鼠标位置
PVector mouse = new PVector(mouseX,mouseY);
acceleration = PVector.sub(mouse,position); //向量相减
//acceleration.setMag(0.2);
acceleration.normalize(); //加速度向量归一化
acceleration.mult(0.2);
velocity.add(acceleration); // 向量的改变依据加速度
velocity.limit(topspeed); // 限制向量长度
position.add(velocity); //位置的改变依据向量
}
2、显示函数
显示函数只是设置了边缘宽度,填充色,再用ellipse函数画出圆
void display()
{
stroke(0);
strokeWeight(2);
fill(127,200);
ellipse(position.x,position.y,48,48);
}
主函数:
还是setup和draw两个函数,用数组创建,用循环实例化,在draw中调用两个类函数:
Mover[] movers = new Mover[20];
void setup()
{
size(800,800);
for (int i = 0; i < movers.length; i++)
{
movers[i] = new Mover();
}
}
void draw()
{
background(255);
for (int i = 0; i < movers.length; i++)
{
movers[i].update();
movers[i].display();
}
}
效果演示:
现在mover到图的边缘的时候会穿过,现在我们加几行函数让它到边缘的时候会反弹回来(就是将向量的方向改一下)
加在position.add(velocity); 后面
if ((position.x > width) || (position.x < 0))
{
velocity.x = velocity.x * -1;
}
if ((position.y > height) || (position.y < 0))
{
velocity.y = velocity.y * -1;
}
在给mover的移动添加一些轨迹,在draw中替代background():
fill(255,50);
rect(-1,-1,width,height);
看看效果:
上面我们说到将加速度向量乘上0.2把它去掉或者改掉会怎么样,现在把0.2改为2看看效果:
这里把这个数乘的过程可以看作是mover的聚集程度,乘的数越大聚集程度越高,越“甩不开”。