Vector.2D:
加法:a+b = ( (ax+bx) , (ay+by) )
意义:a向量和b向量首尾相连。以a的始点为始,以b的终点为终的向量就是a+b
减法:a-b = ( (ax-bx) , (ay-by) )
意义:两个向量始点重合,从b的终点开始到a的终点结束的向量就是a-b了
和常数相乘:a*n=e=(n*ax,n*ay)意义:乘一个大于0的数,则向量的方向不变,只是在同方向上伸缩。乘一个小于0的数,则反方向伸缩。常数的大小决定伸缩程度
点乘:a·b= a.x * b.x + a.y * b.y意义:a的长度与b在a上的投影长度的乘积,或者是b的长度与a在b上投影长的乘积,它是一个标量,而且可正可负。
向量的基本性质:1) a + b = b + a
2) (a + b) + c = a + (b + c)
3) a + 0 = 0 + a = a
4) a + (-a) = 0
5) k*(l*a) = (k*l)*a = a*(k*l)
6) k*(a + b) = k*a + k*b
7) (k + l)*a = k*a + l*a
8) 1*a = a
9) a·b = b·a
11) k*(a·b) = (k*a)·b = a·(k*b)
12) 0·a = 0
13)a·a = |a|^2
向量的移动:
v2.x = v1.x + vx; // vx代表x方向位移
v2.y = v1.y + vy; // vy代表y方向位移
向量的投影:
dp = v1.x * v2.x + v1.y * v2.y; // dp为v0,v1向量点乘的结果
dp 即v1向量在v2向量方向上的投影长度,或者说v2在v1方向上的投影。如果dp是正数则两个向量指向相同的方向,如果是负数则他们的方向相对。
投影向量:
proj.vx=dp*v2.dx; proj.vy=dp*v2.dy // 即v1向量在v2向量上的投影向量,v2.dx、v2.dy分别表示v2向量x、y方向的单位向量。
Vector.3D:
3D的笛卡尔坐标系有两种,左手坐标系和右手坐标系。我们采用左手坐标系。
由于2D只是3D的一种特殊情况,所以向量在3D中的特性。有很多地方都是与3D相似的:
向量相等:每个分量相等(v0.x==v1.x && v0.y==v1.y && v0.z==v1.z)
向量相加:每个分量相加(v0.x+v1.x,v0.y+v1.y,v0.z+v1.z)
向量相减:每个分量相减(v0.x-v1.x,v0.y-v1.y,v0.z-v1.z)
向量的模:即向量的长度
{
Math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
}
向量的归一化:即单位向量
{
var vlen:Number = Math.sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
if( n != 0)
{
v.x = v.x / vlen;
v.y = v.y / vlen;
v.z = v.z / vlen;
}
}
向量与标量的乘法:=v0.x* k + v0.y * k + v0.z * k;
向量的点乘dot: = v0.x*v1.x+v0.y*v1.y+v0.z*v1.z;
我们经常利用点乘来求两向量的夹角,如下:(v0 dot v1 = |v0|*|v1|*cos(θ)) (θ即两向量夹角)
θ = Math.acos( v0 dot v1 / |v0|*|v1| );
p.s:
v0 dot v1=0
两个向量互相垂直
v0 dot v1>0
两个向量的夹角小于90度
v0 dot v1<0
两个向量的夹角大于90度
(*)向量的叉乘cross:
向量的叉乘结果出来同样还是一个向量,该向量垂直与叉乘的俩向量。
该向量的方向通过左手法则确定,即从第一个向量向第二个向量弯曲左手,左手大拇指所指向的方向即求得向量的方向。
v0 = (x0,y0,z0) , v1 = (x1,y1,z1) .
v0 cross v1= ( y0*z1 - y1*z0 , z0*x1 - z1*x0 , x0*y1 - x1*y0 )
如果两个向量方向相同或者相反,他们的结果向量是一个零向量。
向量的叉乘主要应用求法向量:
假设一个三角形的顶点为: p0,p1,p2 。 那么法向量求法如下:
var v1 = ( p1.x - p0.x , p1.y - p0.y , p1.z - p0.z );
var v2 = ( p2.x - p0.x , p2.y - p0.y , p2.z - p0.z );
法向量 v = v1 cross v2;