2017-02-13 4 views
2

Ich erstelle eine Karte und berechne den Winkel der Linien, um die Ausrichtung einer Straße (NSEW) zu bestimmen.Winkel der Linie mit negativer Steigung berechnen

Unten ist die Formel I den Winkel einer Linie berechnen bin mit:

Math.tan(slope)/(Math::PI/180)

Das funktioniert, bis die Steigung von meiner Linie negativ ist. Wie kann ich den Winkel einer Linie mit negativer Steigung richtig berechnen?

aktualisieren Um den Winkel der Linie zu berechnen, die ich jetzt mit

Math.atan2(delta_y, delta_x)/(Math::PI/180) 

Das Problem, von dem Einhalt zu gebieten scheint Punkte, die ich wählen Sie die Zeile beginnt bei/endet an. Abhängig davon, welche ich nehme, sind einige richtig, andere nicht, und umgekehrt. Hier ist ein Bild der Karte I erstellen:

enter image description here

ich nur versuchen, den Winkel der Linien zu berechnen, die mit dem Begrenzungsrahmen schneiden. Einer der Punkte ist immer dort, wo die Linie die Begrenzungsbox schneidet, der andere Punkt ist immer gleich dahinter.

Mein Ursprung (0,0) ist oben links.

+3

Hat die Sprache, in der Sie programmieren, eine 'Math.atan2 (y, x)' Funktion? Das gibt Ihnen den richtigen Wert in allen vier Quadranten. –

+0

@AndrewMorton es tut. Ich benutze Ruby. Wäre 'y = (y1 - y2)' und 'x = (x1-x2)'? – theartofbeing

+0

@AndrewMorton so '(Math.atan2 (delta_y, delta_x)/(Mathematik :: PI/180))' - Ich habe nicht den richtigen Winkel. Ja auf 'E = 0, N = 90, W = 180, S = 270' – theartofbeing

Antwort

0

Ich konnte dies lösen, indem Sie Folgendes tun. Beachten Sie, dass dies eine umgekehrte Achse ist, bei der der Ursprung (0, 0) oben links liegt.

def angle(point1, point2) 
    return 90 if vertical?(point1, point2) 
    return 0 if horizontal?(point1, point2) 
    point1, point2 = [point1, point2].sort_by(&:x) 
    delta_x = point1.x - point2.x 
    delta_y = point1.y - point2.y 

    if point1.y > point2.y # inverted axis/origin 
    Geometry.to_degrees(Math.atan(delta_y/delta_x)).abs 
    else 
    # Add 90 degrees when angle is in 3rd quadrant 
    Geometry.to_degrees(Math.atan(delta_x/delta_y)).abs + 90 
    end 
end 
Verwandte Themen