2014-09-27 23 views
9

İki nokta arasındaki açıyı, verilen iki nokta ile bir çizgi ile bağlı olan sabit bir nokta ile hesaplamalıyım.İki nokta arasındaki açı hesaplaması - java

İşte

enter image description here

Ben şimdiye kadar denedim budur: İşte

ihtiyacım olanı gösterir o bir görüntü

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)); 
} 

O sağlamadığını söylemek anlamsız doğru cevap.

+0

hatta sağ, şu anda "köken" noktanın koordinatlarını düşünmüyoruz? – qqilihq

+2

sabit noktanız nedir? Ayrıca –

+0

üçüncü noktayı (@getlost belirtildiği gibi) ekleyin ve vektör açı formülünü kullanın: http://www.vitutor.com/geometry/vec/angle_vectors.html – maskacovnik

cevap

13

için Math.atan2 yöntemiyle radyan cinsinden açısına hesaplar aşağıdaki yöntemi olabilir:

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; 
} 

ve (Radyan açısı elde edilen transforme etmek Math.toDregrees kullanılarak) üç nokta ile çağırır:

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

Çıktı: 90.0

Java standart Point veyakullanmak için çekinmeyin Çözümünüzdesınıfları var. Bu sadece işe yaradığını göstermek içindi.

6

Android Gesture kitaplığımdan bir kod snippet'i. Çalışır ve tamamen test edilir.

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

adam, bu aslında Yığın Taşması'nda sadece geçerli bir cevap buldum. Diğerleri çalışmıyor! Çok teşekkürler! – DccBr

+0

"x" değerini nasıl alabilirim –

1

@ user2288580 bilmiyorum, ancak basit, test durumları için kodunuz başarısız oluyor.

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

bu @ David açısından uygun olup olmadığına bakınız -

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); 
    } 
} 
İlgili konular