制造外力(多个受力小球)

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

2.5 制造外力

3、示例代码2-2

  • Mover类
    不同点主要集中在两个方面——质量和applyForce()函数的实现
  • 在数组中创建100个Mover对象。
  • 在setup()函数中用循环对这些对象进行初始化。
  • 在构造函数中添加几个参数,让它变得更灵活。
    物体的质量和初始位置就不再是硬性编码的数值了,我们可以通过构造函数来确定它们
      
Mover[] movers = new Mover[20];

void setup() {
  size(640,360);
  for (int i = 0; i < movers.length; i++) {
    movers[i] = new Mover(random(0.1,4),0,0); 
  }
}

void draw() {
  background(255);
  
  for (int i = 0; i < movers.length; i++) {

    PVector wind = new PVector(0.01,0);
    PVector gravity = new PVector(0,0.1);
    
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);

    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }

}

mover.pde

class Mover {

  PVector position;
  PVector velocity;
  PVector acceleration;
  float mass;
  color c;

  Mover(float m, float x , float y) {
    mass = m;
    position = new PVector(x,y);
    velocity = new PVector(0,0);
    acceleration = new PVector(0,0);
    c = color(random(255),random(255),random(255));
  }
  
  void applyForce(PVector force) {
    PVector f = PVector.div(force,mass);
    acceleration.add(f);
  }
  
  void update() {
    velocity.add(acceleration);
    position.add(velocity);
    acceleration.mult(0);
  }

  void display() {
    stroke(0);
    strokeWeight(2);
    //fill(0,127);
    fill(c);
    ellipse(position.x,position.y,mass*16,mass*16);
  }

  void checkEdges() {

    if (position.x > width) {
      position.x = width;
      velocity.x *= -1;
    } else if (position.x < 0) {
      velocity.x *= -1;
      position.x = 0;
    }

    if (position.y > height) {
      velocity.y *= -1;
      position.y = height;
    }

  }

}
多个受力小球

请注意:在上图中,小圆到达窗口右侧比大圆更快,这是因为加速度=力除以质量,
质量越大,加速度越小。

版权声明:
作者:Alex
链接:https://www.techfm.club/p/61783.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>