2

かなり単純な質問があります。ずっと前に答え​​を見つけるべきだったような気がしますが、どういうわけか、この些細な問題に頭を悩ませることができません。

ベクトル v = (x,y) が与えられた場合、それが「一般的な」向きであることを知りたいです。それは、「上」、「下」、「左」、または「右」のいずれかです

ベクトルの方向が 45 ~ 135 度の場合、ベクトルの一般的な方向は「上」です。「左」は 135 ~ 225 度です。「下」は 225 ~ 315 度です。「右」は 315 ~ 45 度です。

角度が正確に 45 度、135 度、225 度、または 315 度の場合はあまり気にしません。

問題は、三角法を使いたくないということです。簡単な解決策があると確信しています。

円全体を 8 つに分割できる解決策があると思います。これが私がこれまでに持っているものです。

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
}

45 度の角度は常に左または右になります。

于 2009-06-19T02:26:50.367 に答える
0

正規化されたベクトル空間(編集:ベクトルが単位ベクトルで構成されていることを意味します)を想定すると、あなたのアプローチは的を射ており、2Dゲームやアニメーションに最もよく使用されます。ただし、真理値表を確認します。

@ダニエルのアプローチは、よりエレガントなIMOです。

于 2009-06-19T02:18:32.613 に答える
0

三角関数を避けたいとおっしゃっていましたが、atan2関数を使用したことがありますか? ベクトルの角度を決定するために使用するのは非常に簡単です。

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