2013-01-02 14 views
7

Mam następujący wiersz kodu: Zastosowałem kilka obrotów do prostokąta w bez wiedzy wartości (o ile stopni). Teraz chcę uzyskać obrót lub kąt elementu w 2D.Oblicz kąt z transformacji macierzy

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 !! 

To nie wydaje się być poprawna wartość. chcę uzyskać kąty w 0 do 360 stopni

+0

Chyba jest to macierz transformacji. –

+0

tak to macierz transformacji i typ MatrixTransform IT w języku C#. Chcę uzyskać kąt po zastosowaniu transformacji. –

Odpowiedz

9

Można to wykorzystać:

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

Chodzi o to:

  1. Tworzymy tempvector (1,0)
  2. Stosujemy transformację macierzy na wektorze i dostać obrócony wektor temp
  3. Mamy obliczyć kąt między oryginałem i obróconego wektora temp

Możesz poeksperymentować z tym:

[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

Dziękuję ludziom za natychmiastową odpowiedź. –

8

NA PRZYSZŁOŚĆ:

Da ci to kąt obrotu macierzy transformacji w radianach:

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

i można przekształcić radiany na stopnie, jeśli potrzebujesz:

var degrees = radians * 180/Math.PI; 
Powiązane problemy