我有一个相当简单的问题给你.. 我觉得我很久以前就应该找到答案但不知何故我无法解决这个微不足道的问题。

给定矢量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)。

有帮助吗?

解决方案

确实有一种方法。所有你必须意识到的是,如果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度角总是向左或向右。

其他提示

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

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

假设一个标准化的向量空间(编辑:意味着你的向量由组成)单位矢量)正如你似乎正在做的那样,你的方法是最常用的,也是最常用于2D游戏和动画的方法。不过,我会核实你的真相表。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top