189 votes

La plus petite différence entre 2 angles

2 angles dans la gamme de -PI -> PI autour d'une coordonnée, quelle est la valeur de la plus petite des 2 angles entre eux?

Tenant compte du fait que la différence entre PI et PI n'est pas 2 PI mais de zéro.

Exemple:

Imaginez un cercle, avec 2 lignes provenant du centre, il y a 2 angles entre les lignes, l'angle qu'ils font à l'intérieur aka le plus petit angle, et l'angle qu'ils font à l'extérieur, aka le plus grand angle. Les deux angles lorsqu'il est ajouté jusqu'à faire un cercle complet. Étant donné que chaque angle peut s'adapter dans une certaine gamme, ce qui est le plus petit des angles de valeur, en tenant compte de la substitution

263voto

bennedich Points 4745

Cela donne un signé angle pour tout les angles:

a = targetA - sourceA
a = (a + 180) % 360 - 180

Méfiez-vous dans de nombreuses langues, l' modulo opération retourne une valeur avec le même signe que le dividende (comme en C, C++, C#, JavaScript, liste complète ici). Cela nécessite une coutume mod de la fonction comme ceci:

mod = (a, n) -> (a % n + n) % n

Si les angles sont à l'intérieur de [-180, 180] cela fonctionne aussi:

a = targetA - sourceA
a += (a>180) ? -360 : (a<-180) ? 360 : 0

En plus verbeux:

a = targetA - sourceA
a -= 360 if a > 180
a += 360 if a < -180

184voto

Peter B Points 5523

x est l'angle cible. y est la source ou l'angle de départ:

 atan2(sin(x-y), cos(x-y))
 

Il retourne l'angle delta signé. Notez que selon votre API, l'ordre des paramètres de la fonction atan2 () peut être différent.

58voto

Laurence Gonsalves Points 50783

Si vos deux angles sont x et y, l’un des angles qui les sépare est abs (x - y). L'autre angle est (2 * PI) - abs (x - y). Donc, la valeur du plus petit des 2 angles est:

 min((2 * PI) - abs(x - y), abs(x - y))
 

11voto

David Jones Points 307

Je relève le défi de fournir la réponse signée:

 def f(x,y):
  import math
  return min(y-x, y-x+2*math.pi, y-x-2*math.pi, key=abs)
 

5voto

Rudolf Meijering Points 793

Solution arithmétique (par opposition à algorithmique):

 angle = Pi - abs(abs(a1 - a2) - Pi);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X