2009-06-19 7 views
2

私はあなたにはかなり単純な質問があります.. 私は長い時間前に答えを見つけたはずですが、どうにかして私はこの些細な問題の周りに私の頭を包むことはできません。2Dベクトルの一般的な方向を決定します

与えられたベクトルv =(x、y)、私はそれが「一般的な」方向であることを知りたいと思います。

ベクトルの向きが45度から135度の間であれば、ベクトルの一般的な向きは「上向き」です。これは「上」、「下」、「左」または「右」です。 'Left'は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 ... 

基本的には、私は解決策を見つけることができます。私はこの問題に対するあなた自身のアプローチにもっと興味があります。

ありがとうございます!

EDIT:使用されたベクターが正規化されていません。一対の点を使って任意のベクトルを表すことができます。単にベクトルの原点が(0,0)であるとふりまえてください。

+0

私は混乱するかもしれませんが、どのようにベクトルをxとyとして表現し、次にxとyを両方とも位置的であるかのように比較していますか?一つは方向であり、もう一つは大きさではいけないのか? –

+1

@Michael:ベクトルを表すには2通りの方法があります。方向と大きさ(角度と直角三角形の斜辺のような)を持つことができます。もう1つの方法は、直角三角形の脚のようなxとy成分を使うことです。 OPがトリグを避けようとしているので、x/yアプローチはより適切と思われる。 –

+0

@Micheal:http://en.wikipedia.org/wiki/Unit_vectorを参照してください – Randolpho

答えて

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

これは私の必要と同じように聞こえる。ありがとうたくさん:) – GuiSim

+1

まあ、答えを受け入れる。 ;-) –

+0

答えを受け入れるだけで+10の報酬が得られます。投票すると+10も得られますので、実際にあなたはあなたの投票バッジを除いて投票します。 –

0

私はあなたがトリグを避けたかったとお知りになりましたが、atan2機能を使用したことがありますか?これは、ベクトルの角度を決定するために使用する超簡単です:

正規化されたベクトル空間( 編集:あなたのベクトルがunit vectorsで構成されている意味)を想定すると
double ldAngle = atan2(vector.y, vector.x) * 180/PI; 
+0

はい、わかっています。しかし、質問が述べるように、私はtrigを使いたくありません。私はちょうど一般的な方向、正確な角度を知る必要はないので、単に別のアプローチを試みています。 – GuiSim

0

あなたがやっているように見えるように、あなたのアプローチは現場であります2dゲームやアニメーションに最もよく使用されるものです。私はあなたの真理の表を確認したいと思います。

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

+0

このアプローチはどのベクターでも機能するはずです。ベクトルは正規化されていません。 – GuiSim

+0

申し訳ありませんが、私は編集してあなたの編集を読んだ。私は、ベクトルが正規化されたこと(1の長さを有する)が、単位ベクトル、すなわち正規化されたベクトル空間内で構成されていることを意味しなかった。あなたは何をしているのですか?私たちは異なった言葉で同じことを話しています、すべてです。 :) – Randolpho

関連する問題