确定具有8个离散方向(水平,垂直和对角线)的2D矢量的方向

时间:2011-11-20 16:20:17

标签: c# xna trigonometry 2d-vector

我输入了一个游戏手柄拇指杆,它是一个矢量。矢量值的范围定义了一个矩形,该矩形跨越-1,-1到+1,+ 1。

我想知道向量关闭的8个可能方向中的哪一个。不要担心向量是(0,0)的情况,我将分别处理这个问题。 我该怎么做?

注意:这适用于游戏,因此此功能将非常频繁地运行。任何加速函数的东西都会有所帮助,例如我知道我可以使用点积和trig来计算出我的向量和每个方向向量之间的角度,但是我想知道是否可以做更好的事情,因为我不需要确切的角度。

3 个答案:

答案 0 :(得分:2)

想象一下在-1..1方格内的一个正方形,其中一个方位(X)位于其中一个边上:

+-----------------+  +-----------------+
|                 |  |                 |
|                 |  |                 |
|          X      |  |    +-----X-+    |
|                 |  |    |       |    |
|        O        |  |    |   O   |    |
|                 |  |    |       |    |
|                 |  |    +-------+    |
|                 |  |                 |
|                 |  |                 |
+-----------------+  +-----------------+

您只需找出坐标所在的一侧,并检查它是否更靠近侧面的中心或角落。如果内部正方形太小,您可以认为指针要居中。

类似的东西:

Public enum Direction {
  None,
  LeftUp, Up, RightUp, Right, RightDown, Down, LeftDown, Left
}

public Direction GetDirection(double x, double y) {
  double absX = Math.Abs(x);
  double absY = Math.Abs(y);
  if (absX < 0.1 && absY < 0.1) {
    // close to center
    return Direction.None;
  }
  if (absX > absY) {
    // vertical side
    double half = absX * 0.4142;
    if (x > 0) {
      // left side
      if (y > half) return Direction.LeftDown;
      if (y < -half) return Diretion.LeftUp;
      return Direction.Left;
    } else {
      // right side
      if (y > half) return Direction.RightDown;
      if (y < -half) return Direction.RightUp;
      return Direction.Right;
    }
  } else {
    // horisontal side
    double half = absY * 0.4142;
    if (y > 0) {
      // bottom
      if (x > half) return Direction.RightDown;
      if (x < -half) return Direction.LeftDown;
      return Direction.Down;
    } else {
      // top
      if (x > half) return Direction.RightUp;
      if (x < -half) return Direction.LeftUp;
      return Direction.Up;
    }
  }
}

没有三角学,只是简单的比较,所以它应该非常快。 :)

(虽然我使用三角法计算点0.4142,即tan(22.5),或角度为45/2的一侧的位置。)

答案 1 :(得分:1)

犯罪a / cos a = tan a,

你有

Y =罪恶

X = cos a

因此,将反正切函数应用于Y / X,您将得到角度。

编辑:在一个完整的圆圈中,有两个角度具有相同的正切值(aa + pi)。使用X和Y的符号来确定哪一个是有效的。

答案 2 :(得分:0)

您可以使用预先建立的tan ^ -1近似表。根据输入矢量的大小计算角度应该非常快,并且您可能不需要在表格中使用非常大的分辨率(事实上,如果您只需要8个离散方向,表格中的8个条目就足够了)。