2012-01-26 38 views
5

Tôi đang xoay các điểm quanh điểm trung tâm trong không gian 2D. Các điểm là điểm trung tâm, vị trí chuột cũ và vị trí chuột mới. Chức năng xoay của tôi hoạt động tốt và tôi có thể tính toán góc một cách hoàn hảo. Nhưng tôi muốn tính toán góc âm nếu người dùng di chuyển chuột theo hướng mà nên được hiểu là ngược chiều kim đồng hồ. Ví dụ, di chuyển chuột về phía bên phải (trục x dương) nên xoay theo chiều kim đồng hồ nếu bạn ở trên (nhỏ hơn) giá trị y của điểm giữa, nhưng nó sẽ xoay ngược chiều kim đồng hồ nếu bạn thực sự dưới đây (lớn hơn) giá trị y của điểm trung tâm.Lấy một góc dương hoặc âm từ 3 điểm

Dưới đây là những gì tôi có:

PointF centerPoint; 
PointF oldPoint; 
PointF newPoint; 

double Xc = centerPoint.X; 
double Yc = centerPoint.Y; 
double Xb = oldPoint.X; 
double Yb = oldPoint.Y; 
double Xa = newPoint.X; 
double Ya = newPoint.Y; 

double c2 = (Math.Pow(Xb - Xa, 2) + Math.Pow(Yb - Ya, 2)); 
double a2 = (Math.Pow(Xb - Xc, 2) + Math.Pow(Yb - Yc, 2)); 
double b2 = (Math.Pow(Xa - Xc, 2) + Math.Pow(Ya - Yc, 2)); 

double a = Math.Sqrt(a2); 
double b = Math.Sqrt(b2); 

double val = (a2 + b2 - c2)/(2 * a * b); 
double angle = Math.Acos(val); 

Vì vậy, tôi cần một cách để làm cho góc tiêu cực khi nó cần phải được, vì vậy những điểm xoay chiều kim đồng hồ hoặc ngược chiều kim đồng hồ để theo dõi vị trí chuột.

Trả lời

7

Hãy thử điều này, nhưng tôi không chắc chắn:

double v1x = Xb - Xc; 
double v1y = Yb - Yc; 
double v2x = Xa - Xc; 
double v2y = Ya - Yc; 

double angle = Math.Atan2(v1x, v1y) - Math.Atan2(v2x, v2y); 
+0

Điều này dường như hoạt động. Nó đi ngược chiều kim đồng hồ khi nó được cho là. –

0

Nó có vẻ như tất cả các bạn cần làm là

angle = angle > Math.PI ? angle - 2*Math.PI : angle; 

ở phần cuối của mã của bạn. Điều đó sẽ cung cấp cho bạn một vòng quay theo chiều kim đồng hồ ở bên phải của dòng được xác định bởi centerPoint và oldPoint và ngược chiều kim đồng hồ ở bên trái của nó, bất kể định hướng.

+0

góc là không bao giờ lớn hơn Math.PI. –

+0

Hmmm. Bạn có thể cần phải cải cách tính toán góc của bạn để sử dụng Math.atan2(), để bạn có được một góc trong góc phần tư chính xác. –

0

Cho các vectơ (x1, y1) và (x2, y2), tôi khuyên bạn nên tính toán sản phẩm chéo và dấu chấm, sau đó sử dụng Atan2() trên chúng. Điều đó sẽ làm việc trong mọi trường hợp cả hai vectơ đều khác 0 và độ dài vectơ là "hợp lý".

3
private double AngleFrom3PointsInDegrees(double x1, double y1, double x2, double y2, double x3, double y3) 
{ 
    double a = x2 - x1; 
    double b = y2 - y1; 
    double c = x3 - x2; 
    double d = y3 - y2; 

    double atanA = Math.Atan2(a, b); 
    double atanB = Math.Atan2(c, d); 

    return (atanA - atanB) * (-180/Math.PI); 
    // if Second line is counterclockwise from 1st line angle is 
    // positive, else negative 
} 
+0

tôi đã phải thêm các giá trị X âm để làm cho nó hoạt động cho tôi (các phép tính giờ đây khớp với AutoCAD) – DarkPh03n1X

Các vấn đề liên quan