《代码本色》试读:1.1 向量
“收到,收到。维克多,我们的航向指示(vector)是什么?”
——Oveur机长(电影《空前绝后满天飞》)
本书主要通过观察周围的世界,提出一些巧妙的方法来利用代码对其建模。本书主要分为3部分,在第一部分,我们研究基础物理学,比如苹果怎么会从树上掉下来,钟摆如何在空中摆动,地球如何围绕太阳转动,等等。本书的前5章内容都离不开运动建模的基本组件——向量(vector)。我们的故事也从向量开始。
如今,vector一词有很多含义。它是20世纪80年代初加州萨克拉门托的一支新浪潮摇滚乐队的名称,还是加拿大凯洛格公司生产的一种早餐麦片的品牌。在流行病学中,vector(媒介)是将传染病从一个宿主传播到另一个宿主的有机体;在C++编程语言中,vector(std::vector)代表可动态增长的数组。以上这些定义都非常有趣,但它们并不是我们要研究的话题。我们要谈论的是欧几里得向量(Euclidean vector,以希腊数学家欧几里得的名字命名,也称作几何向量),本书中出现的“向量”均指欧几里得向量,它的定义是:一个既有大小又有方向的几何对象。
向量通常被绘制为一个带箭头的线段,线段的长度代表向量的大小,箭头所指的方向就是向量的方向。
图1-1 一个向量(绘制成带箭头的线段)有大小(线段的长度)和方向(箭头所指的方向)
在上图中,向量被绘制为从A点到B点的带箭头的线段,并说明了物体如何从A点运动到B点。
1.1 向量
在深入探究向量这个概念之前,我们先从一个例子入手,看看为什么要把向量放在如此重要的位置。如果你读过关于Processing的介绍性书籍或上过Processing编程课(我非常希望你在看本书之前已经做了这些准备),你可能学过如何在Sketch中写一个简单的弹球模拟程序。
如果你阅读的是本书的PDF版或印刷版,那么只能看到代码运行结果的截图。而运动是本书谈论的重点,因此,为了凸显运动效果,我尽可能在静态截图中加上了弹球的运动轨迹。如果你想知道如何绘制运动轨迹,请下载本例的源代码
示例代码1-1 没有使用向量的弹球程序
float x = 100; 小球的位置和速度变量
float y = 100;
float xspeed = 1;
float yspeed = 3.3;
void setup() { 还记得Processing的运行方式吗?setup()函
size(200,200); 数在Sketch启动时被调用,draw()函数在退出
smooth(); 之前一直被调用
background(255);
}
void draw() {
background(255);
x = x + xspeed; 根据速度移动小球
y = y + yspeed;
if ((x > width) || (x < 0)) { 检查边缘,改变运动方向
xspeed = xspeed * 1;
}
if ((y > height) || (y < 0)) {
yspeed = yspeed * 1;
}
stroke(0);
fill(175);
ellipse(x,y,16,16); 在(x,y)位置绘制小球
}
上例中,我们在空白的画板上创建了一个到处移动的圆球。它有很多属性,在代码中,我们用变量表示它的属性。
位置 x和y
速度 xspeed和yspeed
在以后更高级的例子中,我们还可以加入这些变量:
加速度 xacceleration和yacceleration
目标位置 xtarget和ytarget
风 xwind和ywind
摩擦力 xfriction和yfriction
从中可以看出,对于自然界的每个类似概念(风、位置、加速度等),我们都需要用两个变量表示。这只是在二维世界中,如果在三维世界中,我们就需要用3个变量表示,如x、y、z,以及xspeed、yspeed、zspeed,等等。
如果我们能简化这些代码并使用更少的变量,岂不是很好?
对于下面这些变量:
float x;
float y;
float xspeed;
float yspeed;
可以把它们替换成:
Vector location;
Vector speed;
在这里引入向量并不会给我们增添新工作,单纯地在代码中加入向量也不会让Sketch自己去模拟物理现象。但是,它会简化你的代码,对于在运动模拟中经常出现的数学运算,向量提供了很多现成的函数。
学习向量的相关知识时,我们将使用二维空间(至少在本书的前几章)。所有这些例子都可以轻松地扩展到三维空间(我们使用的PVector 类也适用于三维空间)。但是,从二维空间入手比较容易。
>代码本色
作者: Daniel Shiffman
副标题: 用编程模拟自然系统
原作名: The Nature of Code: Simulating Natural Systems with Processing
isbn: 711536947X
书名: 代码本色
页数: 406
译者: 周晗彬
定价: 99.00元
出版社: 人民邮电出版社
出版年: 2014-10
装帧: 平装