atan2(y, x) tiene esa discontinuidad en 180 ° donde cambia a -180 ° ..0 ° en sentido horario.
¿Cómo mapeo el rango de valores a 0 ° ..360 °?
aquí está mi código:
CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);
Estoy calculando la dirección de un evento táctil de deslizamiento dado el startPointy endPoint, ambas estructuras de puntos XY. El código es para iPhone, pero cualquier idioma que lo admita atan2f()servirá.

Respuestas:
fuente
(x >= 0 ? x : (2*PI + x)) * 180/PIcomo en(x < 0 ? 2*PI + x : x) * 180/PISolución usando Modulo
Una solución simple que atrapa todos los casos.
Explicación
Positivo: 1 a 180
Si modifica cualquier número positivo entre 1 y 180 por 360, obtendrá exactamente el mismo número que ingresó. Mod aquí solo asegura que estos números positivos se devuelvan con el mismo valor.
Negativo: -180 a -1
El uso de mod aquí devolverá valores en el rango de 180 y 359 grados.
Casos especiales: 0 y 360
El uso de mod significa que se devuelve 0, lo que la convierte en una solución segura de 0 a 359 grados.
fuente
-1 % 360 = -1Simplemente agregue 360 ° si la respuesta de atan2 es menor que 0 °.
fuente
O si no le gusta la ramificación, simplemente niegue los dos parámetros y agregue 180 ° a la respuesta.
(Agregar 180 ° al valor de retorno lo coloca bien en el rango de 0 a 360, pero cambia el ángulo. Negar ambos parámetros de entrada lo invierte).
fuente
@erikkallen está cerca pero no del todo bien.
Esto debería funcionar en C ++: (dependiendo de cómo se implemente fmod, puede ser más rápido o más lento que la expresión condicional)
Alternativamente, puede hacer esto:
ya que (x, y) y (-x, -y) difieren en ángulos 180 grados.
fuente
Tengo 2 soluciones que parecen funcionar para todas las combinaciones de x e y positivas y negativas.
1) Abuso de atan2 ()
De acuerdo con los documentos, atan2 toma los parámetros y y x en ese orden. Sin embargo, si los invierte, puede hacer lo siguiente:
2) Use atan2 () correctamente y conviértalo después
fuente
@Jason S: su variante "fmod" no funcionará en una implementación que cumpla con los estándares. El estándar C es explícito y claro (7.12.10.1, "las funciones fmod"):
así,
en realidad es solo una reescritura detallada de:
Sin embargo, su tercera sugerencia es acertada.
fuente
Esto es lo que hago normalmente:
fuente
He hecho una fórmula para orientar el ángulo de 0 a 360
fuente
Una solución alternativa es utilizar la función mod () definida como:
function mod(a, b) {return a - Math.floor (a / b) * b;}Luego, con la siguiente función, se obtiene el ángulo entre los puntos ini (x, y) y end (x, y) . El ángulo se expresa en grados normalizados a [0, 360] grados. y Norte haciendo referencia a 360 grados.
fuente
La geosfera de los paquetes R calculará el rumbo de rumbo, que es una línea de rumbo constante dado un punto de origen y un este / norte. El este y el norte deben estar en una matriz o vector. El punto de origen de una rosa de los vientos es 0,0. El siguiente código parece resolver fácilmente el problema:
fuente
-1 grado se convierte en (-1 + 360) = 359 grados
-179 grados se convierte en (-179 + 360) = 181 grados
fuente
Math.PI? ¿Es lo mismo queM_PI?Esto devolverá el grado de 0 ° -360 ° en sentido antihorario, 0 ° es a las 3 en punto.
fuente
Una fórmula para tener un rango de valores de 0 a 360 grados.
f (x, y) = 180-90 * (1 + signo (x)) * (1-signo (y ^ 2)) - 45 * (2 + signo (x)) * signo (y)
fuente
Aquí hay algo de javascript. Simplemente ingrese los valores xey.
fuente