Dados 2 ángulos en el rango -PI -> PI alrededor de una coordenada, ¿cuál es el valor del menor de los 2 ángulos entre ellos?
Teniendo en cuenta que la diferencia entre PI y -PI no es 2 PI sino cero.
Ejemplo:
Imagine un círculo, con 2 líneas que salen del centro, hay 2 ángulos entre esas líneas, el ángulo que forman en el interior, también conocido como el ángulo más pequeño , y el ángulo que forman en el exterior, también conocido como el ángulo más grande. Ambos ángulos cuando se suman forman un círculo completo. Dado que cada ángulo puede caber dentro de un cierto rango, ¿cuál es el valor de los ángulos más pequeños, teniendo en cuenta el rollover?
language-agnostic
geometry
angle
Tom J Nowell
fuente
fuente
Respuestas:
Esto proporciona un ángulo con signo para cualquier ángulo:
Tenga cuidado con que en muchos idiomas la
modulo
operación devuelve un valor con el mismo signo que el dividendo (como C, C ++, C #, JavaScript, lista completa aquí ). Esto requiere unamod
función personalizada como esta:Más o menos:
Si los ángulos están dentro de [-180, 180] esto también funciona:
De una manera más detallada:
fuente
a -= 360*sgn(a)*(abs(a) > 180)
. (Ahora que lo pienso, si tiene implementaciones sin ramificaciones desgn
yabs
, entonces esa característica podría comenzar a compensar la necesidad de dos multiplicaciones.)double targetA = 2; double sourceA = 359;
'a' será igual a -357.0 en lugar de 3.0x es el ángulo objetivo. y es la fuente o ángulo de inicio:
Devuelve el ángulo delta firmado. Tenga en cuenta que, según su API, el orden de los parámetros para la función atan2 () puede ser diferente.
fuente
x-y
le da la diferencia en ángulo, pero puede estar fuera de los límites deseados. Piense en este ángulo que define un punto en el círculo unitario. Las coordenadas de ese punto son(cos(x-y), sin(x-y))
.atan2
devuelve el ángulo para ese punto (que es equivalente ax-y
) excepto que su rango es [-PI, PI].Si sus dos ángulos son x e y, entonces uno de los ángulos entre ellos es abs (x - y). El otro ángulo es (2 * PI) - abs (x - y). Entonces el valor del más pequeño de los 2 ángulos es:
Esto le da el valor absoluto del ángulo y supone que las entradas están normalizadas (es decir, dentro del rango
[0, 2π)
).Si desea conservar el signo (es decir, la dirección) del ángulo y también acepta ángulos fuera del rango
[0, 2π)
, puede generalizar lo anterior. Aquí está el código de Python para la versión generalizada:Tenga en cuenta que el
%
operador no se comporta de la misma manera en todos los idiomas, especialmente cuando hay valores negativos, por lo tanto, si se transfieren algunos signos, puede ser necesario.fuente
from math import tau
.Acepto el desafío de proporcionar la respuesta firmada:
fuente
Para los usuarios de UnityEngine, la manera fácil es usar Mathf.DeltaAngle .
fuente
Solución aritmética (en oposición a algorítmica):
fuente
Un código eficiente en C ++ que funciona para cualquier ángulo y en ambos: radianes y grados es:
fuente
No hay necesidad de calcular funciones trigonométricas. El código simple en lenguaje C es:
deje dif = a - b, en radianes
deje dif = a - b, en grados
Sin pecado, sin cos, sin bronceado ... ¡¡¡solo geometría !!!!
fuente
arg = arg - PIV2;
expandearg = arg - M_PI + M_PI
y no hace nada.