hay necesidad de hacer una función atan
si lo hace: y/x obtendrá la pendiente de la línea. A juzgar por el número que obtienes, puedes determinar el ángulo/octante.
para de positivos x (x> 0)
- (y/x)> 2.4 - => 90 grados (norte)
- 2.4> (y/x)> 0,4 - => 45 grados (noroeste)
- 0.4> (y/x)> -0.4 - => 0 grados (West)
- -0,4> (y/x)> -2,4 - => -45 grados (sudoeste)
- -2.4> (y/x) - => 90 grados (sur)
y una lista similar para de las x negativas
y, finalmente, los casos de excepción:
- (x == 0 & & y> 0) - => -90 grados (sur)
- (x == 0 & & y < 0) - => 90 grados (sur)
adición: Sólo informar de este método para el cálculo de valores atan es un no ir (por ejemplo, en un sistema embebido))
tuve que cavar un poco. Aquí hay una rutina altamente optimizada que uso (utilizada en juegos móviles).
de entrada: x1, y1 = punto inicial del vector de x2, y2 = punto final del vector salida (0-7) = 0 = norte, noroeste 1 =, 2 = oeste, etc ...
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);
}
Esto resultará en la siguiente salida:
t = 7
t = 6
t = 5
t = 4
t = 3
t = 2
t = 1
t = 0
(los vectores para la prueba puede tener un aspecto elegido de manera singular, pero yo les ajustado todo un poco que sea claramente en un octante y no en la frontera exacta)
alguna idea sobre cómo etiquetar esto correctamente? siéntase libre ... –
No, en mi respuesta (1, 0) está al este y va en sentido contrario a las agujas del reloj, ya que estoy haciendo las cosas matemáticamente aquí. Esto está en desacuerdo con el uso estándar de los ángulos en la navegación (0 = norte, en el sentido de las agujas del reloj). Puede adaptarlo agregando un desplazamiento apropiado al +8 y usando a - en frente del atan2. – starblue
Gracias por señalar que starblue, me estoy confundiendo con mis bocetos aquí - ¡tu respuesta es perfecta! –