nie trzeba zrobić funkcja atan.
jeśli wykonasz: y/x otrzymasz nachylenie linii. Sądząc po uzyskanej liczbie, możesz określić kąt/oś.
dla dodatnich wartości x (x> 0)
- (y/x)> 2,4 - => 90 ° (North)
- 2,4> (y/x)> 0,4 - => 45 stopni (zachód)
- 0,4> (y/x)> -0.4 - => 0 stopni (zachodnia)
- -0.4> (y/x)> -2,4 - => -45 stopni (zachód)
- -2.4> (Y/X) - => 90 ° (południowym)
i podobną listę za negatywne X.
i wreszcie przypadki wyjątek:
- (x == 0 & & y> 0) - => -90 ° (południowym)
- (x == 0 & & Y < 0) - => 90 ° (południowym)
addendum: Zgłaszam tylko tę metodę, ponieważ przy obliczaniu atanu nie ma wyjścia (na przykład w systemie wbudowanym))
Musiałem trochę się wykopać. Oto wysoce zoptymalizowana rutyna, której używam (używana w grach mobilnych).
wejściowy: x1, y1 = startowy wektora x2, y2 = końcowego wektora wyjścia (0-7) = 0 = północ, zachód 1 = 2 = zachód, ... itd
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);
}
spowoduje to następujący wynik:
t = 7
t = 6
t = 5
t = 4
t = 3
t = 2
t = 1
t = 0
(wektory do testu może wyglądać dziwnie dobrane, ale manipulowane im wszystko nieco się wyraźnie w jednym oktantu a nie na dokładnym granicy)
wszelkie pomysły na prawidłowe oznaczenie tego tagu? Czuję się swobodnie ... –
Nie, w mojej odpowiedzi (1, 0) jest wschód i idzie w lewo, ponieważ robię to matematycznie tutaj. Jest to sprzeczne ze standardowym stosowaniem kątów w nawigacji (0 = północ, zgodnie z ruchem wskazówek zegara). Możesz go dostosować, dodając odpowiednie przesunięcie do +8 i używając znaku - przed atan2. – starblue
Dziękuję za wskazanie tego, że starblue, myliłem się tutaj z moimi szkicami - twoja odpowiedź jest na miejscu! –