262 votes

Comment calculer l'angle entre une ligne et l'axe horizontal ?

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 :

no words can describe this

Étant donné (P1 x ,P1 y ) et (P2 x ,P2 y ) Quelle est la meilleure façon de calculer cet angle ? L'origine se trouve dans la partie supérieure gauche et seul le quadrant positif est utilisé.

0 votes

1voto

philippe Points 214

Si l'on considère la question exacte, en nous plaçant dans un système de coordonnées "spécial" où l'axe positif signifie que l'on se déplace vers le BAS (comme un écran ou une vue d'interface), il faut adapter cette fonction comme suit, et mettre les coordonnées Y en négatif :

Exemple en Swift 2.0

func angle_between_two_points(pa:CGPoint,pb:CGPoint)->Double{
    let deltaY:Double = (Double(-pb.y) - Double(-pa.y))
    let deltaX:Double = (Double(pb.x) - Double(pa.x))
    var a = atan2(deltaY,deltaX)
    while a < 0.0 {
        a = a + M_PI*2
    }
    return a
}

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 :

let p1 = CGPoint(x: 1.5, y: 2) //estimated coords of p1 in question
let p2 = CGPoint(x: 2, y : 3) //estimated coords of p2 in question

print(angle_between_two_points(p1, pb: p2) / (M_PI/180))
//returns 296.56

0voto

mamashare Points 26
deltaY = Math.Abs(P2.y - P1.y);
deltaX = Math.Abs(P2.x - P1.x);

angleInDegrees = Math.atan2(deltaY, deltaX) * 180 / PI

if(p2.y > p1.y) // Second point is lower than first, angle goes down (180-360)
{
  if(p2.x < p1.x)//Second point is to the left of first (180-270)
    angleInDegrees += 180;
  else //(270-360)
    angleInDegrees += 270;
}
else if (p2.x < p1.x) //Second point is top left of first (90-180)
  angleInDegrees += 90;

0voto

Benas Points 576

Fonction matlab :

function [lineAngle] = getLineAngle(x1, y1, x2, y2) 
    deltaY = y2 - y1;
    deltaX = x2 - x1;

    lineAngle = rad2deg(atan2(deltaY, deltaX));

    if deltaY < 0
        lineAngle = lineAngle + 360;
    end
end

0voto

Formule pour un angle compris entre 0 et 2pi.

Il y a x=x2-x1 et y=y2-y1. La formule fonctionne pour

n'importe quelle valeur de x et y. Pour x=y=0, le résultat est indéfini.

f(x,y)=pi()-pi()/2*(1+signe(x))*(1-signe(y^2))

     -pi()/4*(2+sign(x))*sign(y)

     -sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))

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