2

我有一个相当简单的问题要问你。我觉得我早就应该找到答案,但不知何故我无法解决这个微不足道的问题。

给定一个向量 v = (x,y) ,我想知道它的“一般”方向。即“上”、“下”、“左”或“右”

如果矢量的方向在 45 到 135 度之间,则矢量的一般方向为“向上”。“左”在 135 到 225 度之间。“向下”在 225 到 315 度之间。“右”在 315 到 45 度之间。

我真的不关心角度正好是 45、135、225 或 315 度的情况。

问题是,我不想使用三角函数。我很确定有一个简单的解决方案。

我认为一个解决方案可以将整个圈子分成八部分。这是我到目前为止所拥有的。

if(x > 0 && y > x)
    return Up
if(x > 0 && y > 0 && y < x )
    return Right

... etc ...

基本上,我知道我可以找到解决方案。我对你自己解决这个问题的方法更感兴趣。

谢谢 !

编辑:使用的向量未标准化。您可以使用一对点来表示任何向量。简单地假设向量的原点是(0,0)。

4

3 回答 3

7

确实有办法。你所要意识到的是,如果 abs(y) > abs(x),那么方向是垂直的,否则方向是水平的。如果是垂直的,y 上的符号将指示上/下,否则,x 上的符号将指示左/右。所以:

if (abs(y) > abs(x)) {
  if (y > 0) up else down
} else {
  if (x > 0) right else left
}

45ish 角总是向左或向右。

于 2009-06-19T02:26:50.367 回答
0

我知道你说过你想避免触发,但你曾经使用过atan2函数吗?确定矢量的角度非常容易:

double ldAngle = atan2(vector.y, vector.x) * 180 / PI;
于 2009-06-19T02:17:38.340 回答
0

假设您正在做一个归一化的向量空间(编辑:意味着您的向量由单位向量组成),您的方法是正确的,并且是最常用于 2d 游戏和动画的方法。不过,我会验证你的真值表。

@Daniel 的方法是更优雅的 IMO。

于 2009-06-19T02:18:32.613 回答