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 startPoint
y 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/PI
como en(x < 0 ? 2*PI + x : x) * 180/PI
Solució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 = -1
Simplemente 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