c'è bisogno di fare una funzione atan.
se lo fai: y/x otterrai la pendenza della linea. A giudicare dal numero che ottieni puoi determinare l'angolo/ottante.
per xe positivi (x> 0)
- (y/x)> 2.4 - => 90 gradi (nord)
- 2.4> (y/x)> 0,4 - => 45 gradi (ovest)
- 0,4> (y/x)> -0.4 -> = 0 gradi (ovest)
- -0.4> (y/x)> -2.4 - => -45 gradi (sud-ovest)
- -2.4> (y/x) - => 90 gradi (sud)
e un elenco analogo per quelli del x negativi
ed infine i casi eccezione:
- (x == 0 & & y> 0) -> = -90 gradi (sud)
- (x == 0 & & y < 0) -> = 90 gradi (sud)
01.235.164,106174 millions
addendum: Riporto solo questo metodo per il calcolo di un'Atan è un no go (ad esempio in un sistema embedded))
Ho dovuto scavare un po '. Ecco una routine altamente ottimizzata che uso (usata nei giochi mobili).
ingresso: x1, y1 = punto di inizio della vettore x2, y2 = punto finale del vettore uscita (0-7) = 0 = nord, 1 = nord-ovest, 2 = ovest, ... ecc
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);
}
Ciò comporterà il seguente output:
t = 7
t = 6
t = 5
t = 4
t = 3
t = 2
t = 1
t = 0
(I vettori per il test potrebbe sembrare stranamente scelto, ma li ho ottimizzato tutti un po 'per essere univocamente a un'ottante e non al confine esatto)
qualche idea su come etichettarlo correttamente? sentiti libero ... –
No, nella mia risposta (1, 0) è est e sta andando in senso antiorario, poiché sto facendo le cose matematicamente qui. Ciò è in contrasto con l'uso standard degli angoli nella navigazione (0 = nord, in senso orario). Puoi adattarlo aggiungendo un offset appropriato al +8 e usando a - davanti a atan2. – starblue
Grazie per avermi segnalato starblue, mi sto confondendo con i miei schizzi qui - la tua risposta è azzeccata! –