2014-09-27 13 views
9

Ich muss den Winkel in Grad zwischen zwei Punkten, mit einem festen Punkt, der mit den angegebenen zwei Punkten durch eine Linie verbunden ist, berechnen. HierBerechnung Winkel zwischen zwei Punkten - Java

ist ein Bild, das zeigt, was ich brauche:

enter image description here

Hier ist, was ich versucht habe, so weit:

public static float GetAngleOfLineBetweenTwoPoints(float x1, float x2, float y1, float y2) { 
     float xDiff = x2 - x1; 
     float yDiff = y2 - y1; 
     return (float) (Math.atan2(yDiff, xDiff) * (180/Math.PI)); 
} 

Es ist sinnlos zu sagen, dass es nicht zur Verfügung stellt der korrekte Antwort.

+0

Sie berücksichtigen nicht einmal die Koordinaten des „Ursprung“ Punkt zur Zeit, nicht wahr? – qqilihq

+2

Was ist Ihr Fixpunkt? Sie brauchen auch diesen Punkt –

+0

dritten Punkt hinzufügen (wie @getlost erwähnt) und verwenden Vektorwinkelformel: http://www.vitutor.com/geometry/vec/angle_vectors.html – maskacovnik

Antwort

13

Sie können die folgende Methode, die den Winkel in Radianten mit der Math.atan2 Methode berechnet:

public static double angleBetweenTwoPointsWithFixedPoint(double point1X, double point1Y, 
     double point2X, double point2Y, 
     double fixedX, double fixedY) { 

    double angle1 = Math.atan2(point1Y - fixedY, point1X - fixedX); 
    double angle2 = Math.atan2(point2Y - fixedY, point2X - fixedX); 

    return angle1 - angle2; 
} 

Und nennen Sie es mit drei Punkten (unter Verwendung von Math.toDregrees zu transformieren resultierenden Winkel von Radianten in Grad):

System.out.println(Math.toDegrees(
      angleBetweenTwoPointsWithFixedPoint(0, 0, // point 1's x and y 
               1, 1, // point 2 
               1, 0 // fixed point 
               ))); 

Ausgang: 90,0

Fühlen Sie sich frei von Java zu verwenden Standard-Point oder Line2D Klassen in Ihrer Lösung jedoch. Das war nur um zu demonstrieren, dass es funktioniert.

6

Hier ist ein Code-Snippet aus meiner Android-Gestenbibliothek. Es funktioniert und ist vollständig getestet.

public double getAngleFromPoint(Point firstPoint, Point secondPoint) { 

    if((secondPoint.x > firstPoint.x)) {//above 0 to 180 degrees 

     return (Math.atan2((secondPoint.x - firstPoint.x), (firstPoint.y - secondPoint.y)) * 180/Math.PI); 

    } 
    else if((secondPoint.x < firstPoint.x)) {//above 180 degrees to 360/0 

     return 360 - (Math.atan2((firstPoint.x - secondPoint.x), (firstPoint.y - secondPoint.y)) * 180/Math.PI); 

    }//End if((secondPoint.x > firstPoint.x) && (secondPoint.y <= firstPoint.y)) 

    return Math.atan2(0 ,0); 

}//End public float getAngleFromPoint(Point firstPoint, Point secondPoint) 
+0

Mann, das ist eigentlich die nur gültige Antwort, die ich in Stack Overflow gefunden habe. Alle anderen arbeiten nicht! Danke vielmals! – DccBr

+0

Wie bekomme ich den Wert von 'x' –

1

Ich weiß nicht, @ user2288580 aber auch für einfache, Testfälle Code versagt.

firstPoint = (0,0) secondPoint = (0, 5), (5,5), (5,0), (5, -5) (0, -5) (-5, -5), (-5, 0)

Bitte sehen, ob dies für Sie @ David arbeitet -

public double angleBetween2CartesianPoints(double firstX, double firstY, double secondX, double secondY) { 
    double angle = Math.atan2((secondX - firstX), (secondY - firstY)) * 180/Math.PI; 
    if (angle < 0) { 
     return (360 + angle); 
    } else { 
     return (angle); 
    } 
}