我输入了一个游戏手柄拇指杆,它是一个矢量。矢量值的范围定义了一个矩形,该矩形跨越-1,-1到+1,+ 1。
我想知道向量关闭的8个可能方向中的哪一个。不要担心向量是(0,0)的情况,我将分别处理这个问题。 我该怎么做?
注意:这适用于游戏,因此此功能将非常频繁地运行。任何加速函数的东西都会有所帮助,例如我知道我可以使用点积和trig来计算出我的向量和每个方向向量之间的角度,但是我想知道是否可以做更好的事情,因为我不需要确切的角度。
答案 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,您将得到角度。
编辑:在一个完整的圆圈中,有两个角度具有相同的正切值(a
和a
+ pi
)。使用X和Y的符号来确定哪一个是有效的。
答案 2 :(得分:0)
您可以使用预先建立的tan ^ -1近似表。根据输入矢量的大小计算角度应该非常快,并且您可能不需要在表格中使用非常大的分辨率(事实上,如果您只需要8个离散方向,表格中的8个条目就足够了)。