Comme Marcel le souligne à juste titre, modulo sur les nombres négatifs est potentiellement problématique. Aussi, quelle est la différence entre 355 et 5 degrés? Il pourrait être élaboré à 350 degrés, mais 10 degrés est probablement ce que les gens attendent. Nous faisons les hypothèses suivantes:
- nous voulons que l'angle positif le plus petit entre deux autres angles donc
0 <= diff <= 180
;
- Nous travaillons en degrés. Si radians, remplacez 360 par
2*PI
;
- les angles peuvent être positifs ou négatifs peuvent être en dehors de la plage
-360 < x < 360
où x est un angle d'entrée et
- l'angle d'entrée ou la direction de la différence est sans importance.
Entrées: angles a et b. L'algorithme est donc simplement:
- Normaliser a et b à
0 <= x < 360
;
- Calculer l'angle le plus court entre les deux angles normaux.
Pour la première étape, pour convertir l'angle de la gamme désirée, il existe deux possibilités:
x >= 0
: normal = x% 360
x < 0
: normal = (-x/360 + 1) * 360 + x
Le second est conçu pour éliminer toute ambiguïté sur la différence d'interprétation des opérations de module négatif. Donc, pour donner un exemple travaillé pour x = -400:
-x/360 + 1
= -(-400)/360 + 1
= 400/360 + 1
= 1 + 1
= 2
puis
normal = 2 * 360 + (-400)
= 320
donc pour les entrées 10 et -400 les angles normaux sont 10 et 320.
Maintenant, on calcule la le plus petit angle entre eux. Comme un contrôle de santé mentale, la somme de ces deux angles doit être 360. Dans ce cas, les possibilités sont 50 et 310 (dessinez-le et vous verrez cela).Pour ceux-ci sur:
normal1 = min(normal(a), normal(b))
normal2 = max(normal(a), normal(b))
angle1 = normal2 - normal1
angle2 = 360 + normal1 - normal2
Donc, pour notre exemple:
normal1 = min(320, 10) = 10
normal2 = max(320, 10) = 320
angle1 = normal2 - normal1 = 320 - 10 = 310
angle2 = 360 + normal1 - normal2 = 360 + 10 - 320 = 50
Vous remarquerez normal1 + normal2 = 360
(et vous pouvez même prouver que ce sera le cas si vous le souhaitez).
Enfin:
diff = min(normal1, normal2)
ou 50 dans notre cas.
Essayez la version mise à jour. – cletus