书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
1.7 向量的运动:速度
一、丹尼尔的吐槽
上面说到的向量运算是我们必须掌握的基础知识,为什么它们如此重要?它们对编码有何帮助?对此我们要有一点点耐心。
- 在能完全使用PVector类的强大功能之前,我们还需要走很长的路。
- 掌握任何新的数据结构,都需要一段漫长的学习过程。
- 举个例子,你刚开始学习数组时可能会觉得,比起用多变量实现功能,使用数组貌似要做更多的事情,但当涉及成百上千的变量时,数组的作用就马上显现出来了。
- 对于PVector类,情况也是如此。
- 现在的学习会在以后给你带来更好的收益。
- 对于向量的运算,你不必等太长时间,因为在下一章我们就会得到回报。
二、运动101
我们要介绍的第一个运动模拟程序(我们称为运动101)
- 1.当前位置加上速度得到一个新的位置;
- 2.在新的位置上绘制对象。
三、通用的Mover类
把运动的逻辑封装到一个类中。
通过这种方式,我们可以构建一个与物体运动相关的基础类库。
我们将创建一个通用的Mover类,用来实现物体在屏幕上的运动模拟。
在此之前,我们必须考虑下面两个问题:
- 1.Mover有哪些数据;
- 2.Mover有哪些功能。
1、Mover数据
运动101的模拟程序已经告诉我们这两个问题的答案。
一个Mover对象有两部分数据:位置和速度,这两个数据都是PVector对象。
class Mover {
PVector location;
PVector velocity;
2、Mover功能
Mover对象的功能也很简单。它需要能够移动,还需要被显示出来。
我们将这两个功能实现为update()函数和display()函数。
所有的运动逻辑代码都放在update()函数中,而显示代码放在display()函数中。
void update() {
location.add(velocity); Mover对象开始移动
}
void display() {
stroke(0);
fill(175);
ellipse(location.x,location.y,16,16); 绘制Mover对象
}
}
3、构造函数
一个关键的函数,就是对象的构造函数。
构造函数是个特殊的类成员函数,用于创建对象本身的实例。
- 在构造函数中,我们指定一个对象如何创建。
- 它的函数名总是和类名一样,并通过new操作符调用:
- 在构造函数中,我们用随机的位置和速度初始化这个Mover对象:
Mover m = new Mover();
Mover() {
location = new PVector(random(width),random(height));
velocity = new PVector(random(-2,2),random(-2,2));
}
4、边界判断处理
添加一个函数,用于定义对象达到屏幕边缘时的行为。我们可以简单地实现它,让它环绕边缘运动。
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;
}
}
四、示例代码1-7
运动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;
Mover() {
position = new PVector(random(width), random(height));
velocity = new PVector(random(-2, 2), random(-2, 2));
}
void update() {
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;
}
}
}