受力作用的粒子体系

手机软件开发 2024-9-2 23:39:02 29 0 来自 中国
书名:代码本色:用编程模拟自然体系
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目次
4.11 受力作用的粒子体系

1、受力作用的粒子体系

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

  • 第一步,我们需要添加一个applyForce()函数。(记着:在将力向量除以质量之前,我们要先创建一个副本。)
    我们还要在update()函数中多加一行代码,用于扫除之前的加速率。
  • 完成Particle类之后,我们尚有一个很紧张的题目:
    在那边调用applyForce()函数,即在代码的哪个位置实现力对粒子的作用?
    事实上,这个题目没有绝对正确的答案,它取决于你的具体需求。话虽云云,但我们还是可以实现一种实用于大部门环境的通用办理方案,并构造一个模子应用于每个粒子都受力的作用的体系。
  • 如今我们遇到了一个小题目,applyForce()是粒子类的方法,但是我们没法在draw()函数中引用任何粒子对象,这里只有一个粒子体系对象:变量ps。
    由于体系内的全部粒子都受力的作用,以是我们可以把力作用在粒子体系上,粒子体系再将这个力转达给每个粒子。
void draw() {    background(100);    PVector gravity = new PVector(0, 0.1);    ps.applyForce(gravity); 把力作用在粒子体系上    ps.addParticle();    ps.run();}

  • 如果要在draw()函数中调用粒子体系的新函数,我们必须在粒子体系类中界说这个函数。该函数的作用是:传入力向量,将力作用在每个粒子上。
    代码如下:
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<article> particles;  PVector origin;  ParticleSystem(PVector position) {    origin = position.get();    particles = new ArrayList<article>();  }  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、运行结果

您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 12:29, Processed in 0.148954 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表