2.4>(Y/X)> 0.4 - - => 45度の正のx(x> 0)
- (Y/X)> 2.4
(北西)
- 0.4>(Y/X)> -0.4 - => 0度(西)
- -0.4>(Y/X)> -2.4 - => -45度(南西)
- -2。4>(Y/X) - => 90度(南)
そして最後に負のxの
とするための同様のリストの例外ケース:
- (x == 0 & & Y> 0) - => -90度(南)
- (x == 0 & & Y < 0) - => 90度(南)
補遺:私はatanを計算しない場合(例えば組み込みシステムの場合)にのみ報告します)
私はちょっと掘り下げました。ここで私が使用する高度に最適化されたルーチンがあります(モバイルゲームで使用されます)。
入力:X1、Y1 =ベクトル X2、Y2 =ベクトルの終点の始点 出力(0-7)= 0 =北、1 =北西、2 =西、...等
int CalcDir(int x1, int y1, int x2, int y2)
{
int dx = x2 - x1, dy = y2 - y1;
int adx = (dx<0)?-dx:dx, ady = (dy<0)?-dy:dy, r;
r=(dy>0?4:0)+(dx>0?2:0)+(adx>ady?1:0);
r=(int []){2,3,1,0,5,4,6,7}[r];
return r;
}
void CalcDirTest(){
int t = CalcDir(0, 0, 10, 1);
printf("t = %d",t);
t = CalcDir(0, 0, 9, 10);
printf("t = %d",t);
t = CalcDir(0, 0, -1, 10);
printf("t = %d",t);
t = CalcDir(0, 0, -10, 9);
printf("t = %d",t);
t = CalcDir(0, 0, -10, -1);
printf("t = %d",t);
t = CalcDir(0, 0, -9, -10);
printf("t = %d",t);
t = CalcDir(0, 0, 1, -10);
printf("t = %d",t);
t = CalcDir(0, 0, 10, -9);
printf("t = %d",t);
}
t = 7
t = 6
t = 5
t = 4
t = 3
t = 2
t = 1
t = 0
(テスト用ベクトルが妙に選ばれた見えるかもしれませんが、私はすべてのビットが明確に1八分円ではなく、正確な境界線上にあるように、それらを微調整)
: これは、次のような出力になります
これを正しくタグ付けする方法はありますか?自由に感じてください... –
私の答え(1、0)は東で、反時計回りです。ここで数学的にやっています。これは航行中の角度の標準的な使用とは異なる(0 =北、時計回り)。適切なオフセットを+8に追加し、atan2の前に - を使用すると、それを適応させることができます。 – starblue
スターブルーを指摘してくれてありがとう、私はここに私のスケッチと自分自身を混乱させている - あなたの答えはスポットです! –