zoukankan      html  css  js  c++  java
  • 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源文件

  • 相关阅读:
    Java 对文件的操作
    快速排序算法
    Java 时间和字符换的处理
    Redis 数据结构之Keys
    [转] Redis系统性介绍
    【转】JAVA 接口
    [转] Python 代码性能优化技巧
    几道关于面试的题目
    随手笔记2
    随手笔记
  • 原文地址:https://www.cnblogs.com/happysky97/p/1882105.html
Copyright © 2011-2022 走看看