向量的运动:加速度

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

1.8 向量的运动:加速度

一、加速度

  为了让101运动的运行效果更有趣,更接近现实生活中的运动,我们需要在Mover类中加入一个新的PVector对象——acceleration(加速度)。

  • 加速度的严格定义是:速度的变化率。
  • 这是一种“涓滴”效应。加速度影响速度,继而影响位置

二、获取加速度的算法

  • 1.常量加速度
  • 2.完全随机的加速度
  • 3.朝着鼠标所在方向的加速度

1、常量加速度

  算法1用的是一个常量加速度,这不是很有趣,却是最简单的算法,我们可以通过它学习如何在代码中实现加速度。

  • 在Mover类中添加一个新的PVector对象:
    在update()函数中加入加速度:
class Mover {
    PVector location;
    PVector velocity;
    PVector acceleration;  //新的加速度向量

    void update() {
        velocity.add(acceleration); //运动算法现在只有两行代码
        location.add(velocity);
      }
  • 构造函数中的初始化代码
Mover(){
    location = new PVector(width/2,height/2); //开始把Mover对象放在屏幕的正中间
    velocity = new PVector(0,0); //初始速度为0
    acceleration = new PVector(-0.001,0.01); //
}
  • 控制速度向量的大小
    为了把速度向量的大小控制在一定范围内,加速度必须非常小。我们还可以用PVector的limit()函数限制速度的大小
    velocity.limit(10); limit()函数限制了向量的长度

三、示例代码1-8

运动101(速度和恒定的加速度)

Mover mover;

void setup() {
  size(200,200);
  mover = new Mover(); 
}

void draw() {
  background(255);
  
  mover.update();
  mover.checkEdges();
  mover.display(); 
}  
 
//---mover.pde
class Mover {

  PVector position;
  PVector velocity;
  PVector acceleration;
  float topspeed;

  Mover() {
    position = new PVector(width/2, height/2);
    velocity = new PVector(0, 0);
    acceleration = new PVector(-0.001, 0.01);
    topspeed = 10;
  }

  void update() {
    velocity.add(acceleration);
    velocity.limit(topspeed);
    position.add(velocity);
  }

  void display() {
    stroke(0);
    strokeWeight(2);
    fill(127);
    ellipse(position.x, position.y, 18, 18);
  }

  void checkEdges() {

    if (position.x > width) {
      position.x = 0;
    } 
    else if (position.x < 0) {
      position.x = width;
    }

    if (position.y > height) {
      position.y = 0;
    } 
    else if (position.y < 0) {
      position.y = height;
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容