受力作用的粒子系统

2022-05-15  本文已影响0人  大龙10

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

4.11 受力作用的粒子系统

1、受力作用的粒子系统

  以上粒子类(Particle)中的加速度是一个常量,它从来不会发生变化。然而,一个更好的模拟框架应该遵循牛顿第二定律(F = M * A),并能将第2章中力的累加算法作用在粒子上,下面就让我实现这样的特性。

void draw() {
    background(100);
    PVector gravity = new PVector(0, 0.1);
    ps.applyForce(gravity); 把力作用在粒子系统上
    ps.addParticle();
    ps.run();
}
void applyForce(PVector f) {
    for (Particle p: particles) {
        p.applyForce(f);
    }
}

这个函数实现起来非常简单,它的功能只是“将力作用在粒子系统上,系统再将力作用在每个粒子上”。这是一种非常合理的程序结构。因为粒子系统对象的职责是管理粒子,如果要操纵粒子,我们必须通过粒子的管理者——粒子系统。(还有,这里可以使用改进型for循环,因为我们不会在遍历过程中删除任何元素!)

2、示例

示例代码 4-6 受力作用的粒子系统

ParticleSystem ps;

void setup() {
  size(640,360);
  ps = new ParticleSystem(new PVector(width/2,50));
}

void draw() {
  background(255);
  
  // Apply gravity force to all Particles
  PVector gravity = new PVector(0,0.1);
  ps.applyForce(gravity);
  
  ps.addParticle();
  ps.run();
}

ParticleSystem.pde

class ParticleSystem {
  ArrayList<Particle> particles;
  PVector origin;

  ParticleSystem(PVector position) {
    origin = position.get();
    particles = new ArrayList<Particle>();
  }

  void addParticle() {
    particles.add(new Particle(origin));
  }

  // A function to apply a force to all Particles
  void applyForce(PVector f) {
    for (Particle p: particles) {
      p.applyForce(f);
    }
  }

  void run() {
    for (int i = particles.size()-1; i >= 0; i--) {
      Particle p = particles.get(i);
      p.run();
      if (p.isDead()) {
        particles.remove(i);
      }
    }
  }
}

3、运行结果

上一篇下一篇

猜你喜欢

热点阅读