书名:代码本色:用编程模拟自然系统
作者: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;
}
}
}