2013-01-02 78 views
7

我有以下的代码行: 我已经在矩形上应用了少量旋转,而不知道数值(多少度)。现在我想要在2D中获得元素的旋转或角度。从矩阵变换计算角度

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

这似乎不是正确的值。 我想要在角度0到360度

+0

我想这是一个变换矩阵。 –

+0

是的,它是C#中Transformation Matrix和IT类型的MatrixTransform。 我想在应用转换后获得角度。 –

回答

9

您可以使用此:

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

的理念是:

  1. 我们创建了一个tempvector( 1,0)
  2. 我们对矢量应用矩阵变换,得到一个旋转的临时矢量
  3. 我们计算原始和旋转临时矢量之间的角度

可以玩弄这样的:

[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

感谢人们的即时回复。 –

8

供日后参考:

这会给你一个弧度变换矩阵的旋转角度:

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

,你可以将弧度转换为度,如果你需要:

var degrees = radians * 180/Math.PI;