参考“自然代码”描述牛顿随机行为(第一章)

参考《自然代码》一书的前五章来描述牛顿随机行为。
平台: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的聚集程度,乘的数越大聚集程度越高,越“甩不开”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值