Flash向量-2-长度和法线

基础。向量有什么?

对于每个向量来说,它已经拥有2个点和x,y方向分量,这似乎足以让它感到满足和快乐,但是,它还有更多有用的属性哦。每个向量都有长度,长度其实是向量的起点与终点之间的距离。因为我们已经知道向量的x,y方向的分量,我们可以很容易的计算出它的长度:

view source

print?

1.v.len=Math.sqrt(v.vx*v.vx+v.vy*v.vy);

这其实就是勾股定理【中国称为勾股定理,于公元前1000年发现。国外称为毕达哥拉斯定理,于公元前500年发现。】x分量的平方,加y分量的平方,再取平方根。

使用向量的一个好处是,你不需要使用角度或者sin等复杂的三角函数。但是,我知道很多人是喜欢角度的,我们需要能将向量转化成 角度/长度 的形式。幸运的是,这个操作还不是很麻烦:
(是的,到目前为止,所有的东西还不是很麻烦)

view source

print?

1.angle=Math.atan2(v.vy, v.vx)

你可能知道,flash比较喜欢用弧度来衡量角的大小,所以如果你想让影片剪辑总是朝着运动矢量的方向前进,您需要将弧度(radians )转换成度(degrees)。

view source

print?

1.angledeg=angle*180/Math.PI;

有时候,你知道角度和长度,要通过这些来计算向量,你可能不知道怎么办。不用担心,你很快就可以学会,它实际上不是非常的复杂(注意:这次我没有用“简单”这个词):

view source

print?

1.v.vx=v.len*Math.cos(angle);

2.v.vy=v.len*Math.sin(angle);

基础。什么是向量的归一化。
【注:原作者虽然用英文写作,但把normal这个单词,理解为“正常”,这是应该是不对的,在数学中,称为“归一化”。】
每个向量都可以被归一化,长度为1的向量,称为归一化向量。

view source

print?

1.v.dx=v.vx/v.len;

2.v.dy=v.vy/v.len;

将x,y分量除以向量的长度,我们得到了单位向量。和普通的向量一样,归一化的向量也可以分解为x和y方向的分量。单位向量的长度为1,这一点你可以测试一下。真的,你可以用勾股定理来计算dx,dy对应的向量长度。如果你懒于测试,而直接相信我说的,那当然更好。归一化的向量只告诉了我们方向信息,而不包含距离信息。就好比当你跟人家说:“地铁站往这走”,这句话包含了方向信息,但是没有包含有多远的信息。

做除法的时候一定要小心,不要除以0。向量的长度可以为0,而且为0的时候仍然是一个向量,但是没有办法归一化,所以向量做归一化操作时,一定要检查向量的长度是否为0。在flash中,除以0,返回的将是“Infinity”。

向量有“法线”。法线是指与向量垂直的向量。如果你还记得角度的话,那么法线就是将向量旋转90度。因为向量是有方向的,所以法线就会有2条,分别称为左法线和右法线。假如你起身站起来(我知道其实你现在正坐着在阅读文章,你可能想坐下来,但偶尔站起来一下有利于身体健康),你面向的方向有一个向量。然后,你向2边展开双手,此时你的左右手就好比左右法线。

右法线和左法线这样计算:

view source

print?

1.v.rx = -v.vy;

2.v.ry = v.vx;

3.v.lx = v.vy;

4.v.ly = -v.vx;

最后,我制作了一个小的flash,你可以到处拖动那个点,然后观察向量的变化。

黑色是向量,蓝色是单位向量,绿色是右法线,红色是左法线。你可以下载fla源文件

posted @ 2010-11-19 18:21  模西的哥哥  阅读(334)  评论(0编辑  收藏  举报