libGdx #4 数学库(1) Vector2

Vector2,顾名思义就是二维向量。

预备知识:矢量

何为向量?最基本的来说,就是一组数。二维向量,就是两个数。
两个数,可以表示一个点,也可以表示一条有向线段。
为了区分,在这节课中,将数学意义上的有向线段称为“矢量”,而将此处用来储存和计算数据的Vector2称为“向量”

矢量

将一个矢量的起点平移到原点,其终点的坐标(如例中A(61.27, 50.69))就代表了这一个矢量。
同样,一个点可以表示为一段从原点指向这个点的矢量。

矢量加法

两个矢量的加法,直接将其平移至首尾相接,从第一个矢量的起点指向第二个矢量的终点的矢量就是他们的和。
在坐标系下,只要将两个矢量的X、Y分量简单地相加就可以了。
将一个点坐标和一个矢量相加,就得到了这个点向 矢量方向 平移 矢量长度 之后得到的点的坐标。
如上节课中,

      
      
1
      
      
Center.add(Velocity);

就可以达到位置移动的效果。

矢量减法

将要减去的矢量绕起点旋转180°,再相加即可。
在坐标系下,旋转180度就是X、Y均取其相反数,变成-X -Y。
因此相减只要将两个矢量的X Y分量分别相减即可。

矢量的旋转就是绕着起点旋转。
矢量可以和一个数相乘,此时为等比例缩放。
一个矢量和他的2.5倍

矢量和矢量的乘法比较复杂,我们暂且不说。

Vector2类

  1. 构造函数:
    new Vector2(); 创建一个(x, y) = (0, 0)的向量
    new Vector2(float x, float y); 用指定的(x, y)创建一个向量
    new Vector2(Vector2 another); 复制一个向量
    
  2. vector2.cpy() 赋值一个新的Vector2对象,与new Vector2(Vector2)效果相同,写起来比较简便。
  3. vector2.add(Vector2 another) 将两个向量相加。注意:vector2的值会改变为两者的和。
    vector2.add(float x, float y) 将向量的X Y分量分别加上x y。注意:vector2的值会改变为两者的和。
  4. vector2.sub(Vector2 another) 将两个向量相减。注意:vector2的值会改变为两者的差。
    vector2.sub(float x, float y) 将向量的X Y分量分别减去x y。注意:vector2的值会改变为两者的差。
  5. vector2.nor() 将向量长度缩放为1,即变成单位向量,方向不变。这个操作一般不对点坐标使用,只对矢量使用。
  6. vector2.scl(float scalar) 将向量缩放为原来的scalar倍,即乘法。
  7. vector2.rotate(float degrees) 将向量旋转一定角度,单位是度而不是弧度。
  8. vector2.set(float x, float y) 将向量赋值为x y。

以上的所有操作在改变vector2的值的同时,会将其返回,因此可以连着写,比如我需要在X Y加1后放大为2倍:

Vector2 vector2 = new Vector2(10, 80);
System.out.println(vector2.add(1, 1).scl(2)); 
//安卓中这样的输出会被输出到Logcat中,可以在Eclipse内查看
//当前vector2的值:(22, 162)

也可以通过vector2.x vector2.y直接获取和改变X Y分量的大小。注意大小写

  1. vector2.len() 获取向量大小(长度)。计算公式是:sqrt(X^2+Y^2)(sqrt表示开根号)
    由于开根号需要时间,在比较时可以使用vector2.len2()获取长度的平方进行比较,节省一定的时间。
  2. vector2.angle() 获取向量和X轴之间的角度。

其他的函数还有很多,但最常用的就是这些了。我们在用到时可能会提一提,在这里就不说了。
提醒:手机性能有限,不建议过多使用cpy()和构造函数创建新的临时Vector2进行计算。

原文:大专栏  libGdx #4 数学库(1) Vector2


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11584620.html