矢量
出自FlashWiki
目录 |
基本概念
矢量,指线性空间中需要大小和方向才能完整表示的物理量,通常绘画成箭号,因此叫矢量。现实世界有些东西只用数值是描述不出来的,因为它还包括方向,比如位移、速度、加速度、力、力矩、动量、冲量等,都是矢量。在数学中,矢量也常称为向量,意指有方向的数量。
向量的表示
在java中,要用code表示向量,你可能会先去找 java class Vector 但是事实上这个类只是数组类的一个扩展,其实对我们的意义并不大。而在Processing 中,我们有自己的向量类,这里介绍一下他的大概结构,要使用向量类的话直接用Processing 的就好了。
public class PVector {
public float x;
public float y;
public float z;
PVector(float x_, float y_, float z_) {
x = x_; y = y_; z = z_;
}
PVector(float x_, float y_) {
x = x_; y = y_; z = 0f;
}
/**functionality to go here -- see below**/
}
这里你可能会有二个好奇,第一这个向量类为什么只有x,y,z 3个表示的数量,方向信息在哪呢?第二为什么有2个同名的构造函数? 事实上在给定在三维空间中的任何一个向量,我们可以将其分解成与坐标轴平行的三个分向量表示;给定在二维空间中的任何一个向量,我们将其分解成与坐标轴平行的两个分向量表示。这些分向量因为其方向特殊,我们可以进一步将其简化成没有方向的数量,用x,y,z上的数量表示即可。至于为什么同名,是因为这是java的特性 重载,根据参数的不同而动态调用名字相同而方法不同的函数。这种语法在java中是合法的。
要描述一个物体在一个虚拟空间的运动,我们需要用一些信息来描述它。比如在一个二维空间(就像我们电脑的显示屏),一个方块从屏幕的一端移动到另一端。那么在每一个瞬间会有如下信息来描述它的状态:
- 位置 — 物体的位置,在二维空间里可以用一个点来表示。
- 速度 — 单位时间里物体位置的变化量,在二维空间里用一个向量来表示。
- 加速度 — 单位时间里物体速度的变化量,在二维空间里用一个向量来表示。
严格的来说,表示位置信息的是一个点,表示速度和加速度的是向量。然后为了简化我们的程序,我们将位置也用一个向量表示,其实这里只是借用了向量的属性来储存位置信息,意义上不是一样的。
好,现在我们有三个向量,下面介绍一种描述物体运动最简单的算法思路。
速度 += 加速度 位置 += 速度 得到新位置以后,在新位置绘制物体
这里你会发现需要给向量做加法了。然而对于二维向量,它是用一对数值来表示的,所以我们不能用传统的四则运算来做向量加法了,下面介绍一下如用向量来做加减法。
向量的运算
假设这里有3个向量 v = (vx,vy), u = (ux,uy), w = (wx,wy)
u = v + w --> ux = vx + wx, uy = vy + wy u = v - w --> ux = vx - wx, uy = vy - wy
同样的,加法的交换律和结合律同样适用:
v + w = w + v u + (v + w) = (u + v) + w
对于向量,还可以用一个向量乘以和除以一个数量
v = w * n --> vx = wx * n, vy = wy * n v = w / n --> vx = wx / n, vy = wy / n (n*m)*v = n*(m*v) (n+m)*v = n*v + m*v n*(v+u) = n*v + n*u
对于我们现在的应用,只需要掌握向量之间的加法和减法,以及向量和数量之间的乘法和除法。其实向量之间的运算一共只有三种,加法,减法和乘法,乘法这里我们就不与考虑了,可能将来会进一步介绍。
关于向量的另一项遇到的最多运算应该就是计算向量的长度(或数量),前面我们说过向量是有方向的数量,那么它的数量(这里我们称为长度可能更直观一些)如何计算呢?
向量的长度通常用 ||v|| 表示. 下面的公式你会发现其实就是勾股定理:
||v2|| = sqrt ( vx*vx + vy*vy ) //对于二维向量: ||v3|| = sqrt ( vx*vx + vy*vy + vz*vz) //对于三维向量:
参考阅读
- Some links about vectors: Working with vectors, Describing Motion, Vectors: Velocities, Accelerations, and Forces
- Mathematics and Physics for Programmers, Chapter 5 — Vectors, Danny Kodicek (suggested)
- Hackers and Painters, Paul Graham
