Como Marcel señala con razón, módulo de números negativos es potencialmente problemática. Además, ¿cuál es la diferencia entre 355 y 5 grados? Podría ser calculado en 350 grados, pero 10 grados es probablemente lo que la gente está esperando. Hacemos los siguientes supuestos:
- queremos que el ángulo positivo más pequeño entre los otros dos ángulos para
0 <= diff <= 180
;
- estamos trabajando en grados. Si radianes, sustituye 360 por
2*PI
;
- ángulos pueden ser positivos o negativos pueden estar fuera del rango
-360 < x < 360
donde x es un ángulo de entrada y
- orden de los ángulos de entrada o la dirección de la diferencia es irrelevante.
Entradas: ángulos a y b. Entonces el algoritmo es simple:
- Normaliza ayb a
0 <= x < 360
;
- Calcule el ángulo más corto entre los dos ángulos normales.
Para el primer paso, para convertir el ángulo con respecto a la gama deseada, hay dos posibilidades:
x >= 0
: normal = x% 360
x < 0
: normal = (-x/360 + 1) * 360 + x
El segundo está diseñado para eliminar cualquier ambigüedad en la diferencia en la interpretación de las operaciones de módulo negativo. Así que para dar un ejemplo trabajado para x = -400:
-x/360 + 1
= -(-400)/360 + 1
= 400/360 + 1
= 1 + 1
= 2
continuación
normal = 2 * 360 + (-400)
= 320
por lo que para las entradas 10 y -400 los ángulos normales son 10 y 320.
Ahora se calcula la el ángulo más corto entre ellos. Como un control de cordura, la suma de esos dos ángulos debe ser 360. En este caso, las posibilidades son 50 y 310 (dibuja y verás esto).Para trabajar estos fuera:
normal1 = min(normal(a), normal(b))
normal2 = max(normal(a), normal(b))
angle1 = normal2 - normal1
angle2 = 360 + normal1 - normal2
Así que para nuestro ejemplo:
normal1 = min(320, 10) = 10
normal2 = max(320, 10) = 320
angle1 = normal2 - normal1 = 320 - 10 = 310
angle2 = 360 + normal1 - normal2 = 360 + 10 - 320 = 50
Se habrá dado cuenta normal1 + normal2 = 360
(e incluso se puede demostrar que este será el caso si se quiere).
Por último:
diff = min(normal1, normal2)
o 50 en nuestro caso.
probar la versión actualizada. – cletus