2013-01-02 67 views
7

Tôi có dòng mã sau đây: Tôi đã áp dụng vài vòng quay vào hình chữ nhật mà không biết giá trị (bao nhiêu độ). Bây giờ tôi muốn có được Xoay hoặc góc của phần tử trong 2D.Tính góc từ ma trận biến đổi

Rectangle element = (Rectangle)sender; 
MatrixTransform xform = element.RenderTransform as MatrixTransform; 
Matrix matrix = xform.Matrix; 
third.Content = (Math.Atan(matrix.M21/matrix.M22)*(180/Math.PI)).ToString(); 

and the matrix is like following 
|M11 M12 0| 
|M21 M22 0| 
|dx dy 1| which is Transformation Matrix I guess !! 

Giá trị này dường như không đúng. Tôi muốn nhận các góc trong 0 tới 360 độ

+0

Tôi đoán đó là một ma trận chuyển đổi. –

+0

có đó là ma trận chuyển đổi và loại ma trận của nó trong C#. Tôi muốn lấy Góc sau khi chuyển đổi được áp dụng. –

Trả lời

9

Bạn có thể sử dụng này:

var x = new Vector(1, 0); 
Vector rotated = Vector.Multiply(x, matrix); 
double angleBetween = Vector.AngleBetween(x, rotated); 

Ý tưởng là:

  1. Chúng tôi tạo ra một tempvector (1.0)
  2. Chúng tôi áp dụng phép biến đổi ma trận trên vectơ và có được một vector tạm xoay
  3. Chúng tôi tính toán góc giữa bản gốc và các vector tạm xoay

Bạn có thể chơi xung quanh với điều này:

[TestCase(0,0)] 
[TestCase(90,90)] 
[TestCase(180,180)] 
[TestCase(270,-90)] 
[TestCase(-90, -90)] 
public void GetAngleTest(int angle, int expected) 
{ 
    var matrix = new RotateTransform(angle).Value; 
    var x = new Vector(1, 0); 
    Vector rotated = Vector.Multiply(x, matrix); 
    double angleBetween = Vector.AngleBetween(x, rotated); 
    Assert.AreEqual(expected,(int)angleBetween); 
} 
+0

Cảm ơn mọi người đã trả lời ngay. –

8

CHO TƯƠNG LAI THAM KHẢO:

Điều này sẽ cung cấp cho bạn góc quay của ma trận chuyển đổi theo radian:

var radians = Math.Atan2(matrix.M21, matrix.M11); 

và bạn có thể chuyển đổi các radian sang độ nếu bạn cần:

var degrees = radians * 180/Math.PI; 
Các vấn đề liên quan