Dans un langage de programmation (Python, C #, etc), je dois déterminer comment calculer l'angle entre une ligne et l'axe horizontal?
Je pense qu'une image décrit le mieux ce que je veux:
Étant donné (P1 x , P1 y ) et (P2 x , P2 y ) quelle est la meilleure façon de calculer cet angle? L'origine est dans le topleft et seul le quadrant positif est utilisé.
c#
python
trigonometry
orlp
la source
la source
Réponses:
Trouvez d'abord la différence entre le point de départ et le point d'arrivée (ici, il s'agit plus d'un segment de ligne dirigé, pas d'une "ligne", car les lignes s'étendent à l'infini et ne commencent pas à un point particulier).
Calculez ensuite l'angle (qui va de l'axe X positif à
P1
à l'axe Y positif àP1
).Mais
arctan
peut ne pas être idéal, car la division des différences de cette façon effacera la distinction nécessaire pour distinguer dans quel quadrant l'angle se trouve (voir ci-dessous). Utilisez plutôt ce qui suit si votre langue comprend uneatan2
fonction:EDIT (22 février 2017): En général, cependant, appeler
atan2(deltaY,deltaX)
juste pour obtenir l'angle appropriécos
etsin
peut être inélégant. Dans ces cas, vous pouvez souvent effectuer les opérations suivantes à la place:(deltaX, deltaY)
comme un vecteur.deltaX
etdeltaY
par la longueur du vecteur (sqrt(deltaX*deltaX+deltaY*deltaY)
), sauf si la longueur est 0.deltaX
sera maintenant le cosinus de l'angle entre le vecteur et l'axe horizontal (dans la direction du X positif vers l'axe Y positif enP1
).deltaY
sera maintenant le sinus de cet angle.EDIT (28 février 2017): Même sans normalisation
(deltaX, deltaY)
:deltaX
vous indiquera si le cosinus décrit à l'étape 3 est positif ou négatif.deltaY
vous indiquera si le sinus décrit à l'étape 4 est positif ou négatif.deltaX
etdeltaY
vous indiqueront dans quel quadrant l'angle se trouve, par rapport à l'axe X positif àP1
:+deltaX
,+deltaY
: 0 à 90 degrés.-deltaX
,+deltaY
: 90 à 180 degrés.-deltaX
,-deltaY
: 180 à 270 degrés (-180 à -90 degrés).+deltaX
,-deltaY
: 270 à 360 degrés (-90 à 0 degrés).Une implémentation en Python utilisant des radians (fournie le 19 juillet 2015 par Eric Leschinski, qui a édité ma réponse):
Tous les tests réussissent. Voir https://en.wikipedia.org/wiki/Unit_circle
la source
90 - angleInDegrees
?Désolé, mais je suis sûr que la réponse de Peter est fausse. Notez que l'axe y descend la page (commun dans les graphiques). En tant que tel, le calcul deltaY doit être inversé, ou vous obtenez la mauvaise réponse.
Considérer:
donne
Donc, si dans l'exemple ci-dessus, P1 est (1,1) et P2 est (2,2) [parce que Y augmente vers le bas de la page], le code ci-dessus donnera 45,0 degrés pour l'exemple illustré, ce qui est faux. Modifiez l'ordre du calcul deltaY et cela fonctionne correctement.
la source
double arc = Math.atan2(mouse.y - obj.getPy(), mouse.x - obj.getPx()); degrees = Math.toDegrees(arc); if (degrees < 0) degrees += 360; else if (degrees > 360) degrees -= 360;
J'ai trouvé une solution en Python qui fonctionne bien!
la source
Considérant la question exacte, nous plaçant dans un système de coordonnées "spécial" où l'axe positif signifie descendre (comme un écran ou une vue d'interface), vous devez adapter cette fonction comme ceci, et négativement les coordonnées Y:
Exemple dans Swift 2.0
Cette fonction donne une réponse correcte à la question. La réponse est en radians, donc l'utilisation, pour visualiser les angles en degrés, est:
la source
Basé sur la référence "Peter O" .. Voici la version java
la source
fonction matlab:
la source
Une formule pour un angle de 0 à 2pi.
Il y a x = x2-x1 et y = y2-y1.La formule fonctionne pour
toute valeur de x et y. Pour x = y = 0, le résultat n'est pas défini.
f (x, y) = pi () - pi () / 2 * (1 + signe (x)) * (1-signe (y ^ 2))
la source
la source
Essai
Pour les tests, je laisse l' hypothèse générer des cas de test.
la source