Étant donné 2 angles dans la plage -PI -> PI autour d'une coordonnée, quelle est la valeur du plus petit des 2 angles entre eux?
Tenant compte du fait que la différence entre PI et -PI n'est pas de 2 PI mais de zéro.
Exemple:
Imaginez un cercle, avec 2 lignes sortant du centre, il y a 2 angles entre ces lignes, l'angle qu'elles forment à l'intérieur, c'est-à-dire le plus petit angle , et l'angle qu'elles forment à l'extérieur, c'est-à-dire le plus grand angle. Les deux angles lorsqu'ils sont additionnés forment un cercle complet. Étant donné que chaque angle peut tenir dans une certaine plage, quelle est la valeur des angles les plus petits, en tenant compte du survol
language-agnostic
geometry
angle
Tom J Nowell
la source
la source
Réponses:
Cela donne un angle signé pour tous les angles:
Attention dans de nombreux langages, l'
modulo
opération renvoie une valeur avec le même signe que le dividende (comme C, C ++, C #, JavaScript, liste complète ici ). Cela nécessite unemod
fonction personnalisée comme celle-ci:Ou alors:
Si les angles sont compris entre [-180, 180], cela fonctionne également:
De manière plus verbeuse:
la source
a -= 360*sgn(a)*(abs(a) > 180)
. (À bien y penser, si vous avez des implémentations sans branche desgn
etabs
, alors cette caractéristique pourrait en fait commencer à compenser le besoin de deux multiplications.)double targetA = 2; double sourceA = 359;
'a' sera égal à -357,0 au lieu de 3,0x est l'angle cible. y est la source ou l'angle de départ:
Il renvoie l'angle delta signé. Notez que selon votre API, l'ordre des paramètres de la fonction atan2 () peut être différent.
la source
x-y
vous donne la différence d'angle, mais elle peut être hors des limites souhaitées. Pensez à cet angle définissant un point sur le cercle unité. Les coordonnées de ce point sont(cos(x-y), sin(x-y))
.atan2
renvoie l'angle pour ce point (qui équivaut àx-y
) sauf que sa plage est [-PI, PI].Si vos deux angles sont x et y, l'un des angles entre eux est abs (x - y). L'autre angle est (2 * PI) - abs (x - y). Ainsi, la valeur du plus petit des 2 angles est:
Cela vous donne la valeur absolue de l'angle et suppose que les entrées sont normalisées (c'est-à-dire: dans la plage
[0, 2π)
).Si vous souhaitez conserver le signe (c'est-à-dire la direction) de l'angle et accepter également des angles en dehors de la plage,
[0, 2π)
vous pouvez généraliser ce qui précède. Voici le code Python pour la version généralisée:Notez que l'
%
opérateur ne se comporte pas de la même manière dans toutes les langues, en particulier lorsque des valeurs négatives sont impliquées, donc en cas de portage, des ajustements de signe peuvent être nécessaires.la source
from math import tau
.Je relève le défi de fournir la réponse signée:
la source
Pour les utilisateurs d'UnityEngine, le moyen le plus simple consiste simplement à utiliser Mathf.DeltaAngle .
la source
Solution arithmétique (par opposition à algorithmique):
la source
Un code efficace en C ++ qui fonctionne pour n'importe quel angle et dans les deux: radians et degrés est:
la source
Il n'est pas nécessaire de calculer des fonctions trigonométriques. Le code simple en langage C est:
soit dif = a - b, en radians
soit dif = a - b, en degrés
Pas de péché, pas de cos, pas de bronzage, .... seulement la géométrie !!!!
la source
arg = arg - PIV2;
développearg = arg - M_PI + M_PI
et ne fait rien.