atan 関数を実行する必要はありません。
y/x とすると、直線の傾きが得られます。取得した数値から判断すると、角度/八分円を決定できます。
正の x (x>0)
- (y/x) > 2.4 -=> 90 度 (北)
- 2.4 > (y/x) > 0.4 -=> 45 度 (北西)
- 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 つの八分円内にあるように、それらすべてを微調整しました)