2009-06-19 112 views
2

我对你有一个相当简单的问题..我觉得我很早以前应该找到答案,但不知何故,我无法将我的头围绕这个微不足道的问题。给定一个向量v =(x,y),我想知道它是'一般'方向。即'向上','向下','向左'或'向右'确定一个2D矢量的大致方向

如果矢量的方向介于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)。

+0

好的,我可能会感到困惑,但你如何将一个向量表示为x和y,然后将x和y比较,就好像它们都是位置的?应该不是一个方向,另一个方向呢? – 2009-06-19 02:06:08

+1

@Michael:有两种方法来表示一个Vector。你可以有一个方向和一个量级(如一个角度和一个直角三角形的斜边)。另一种方法是使用x和y分量,如直角三角形的腿。由于OP正试图避免触发,x/y方法似乎更合适。 – 2009-06-19 02:09:24

+0

@Micheal:请参阅http://en.wikipedia.org/wiki/Unit_vector – Randolpho 2009-06-19 02:24:14

回答

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 
} 

45个角度将始终向左或向右。

0

我知道你说过你想避免触发,但你有没有使用过atan2函数?这是超级好用用于确定矢量的角度:

double ldAngle = atan2(vector.y, vector.x) * 180/PI; 
0

假设归一化向量空间(编辑:这意味着你的载体是由unit vectors),你似乎做,你的做法是点上以及最常用于2D游戏和动画的人。但是,我会验证你的真值表。

@丹尼尔的做法是更优雅的国际海事组织。