《代码本色》试读: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
装帧: 平装