2013-01-02 5 views
7

다음 코드 줄이 있습니다 : 값을 알지 못해서 회전을 거의 적용하지 않았습니다. 이제 2D에서 Rotation 또는 angle을 얻고 싶습니다.행렬 변환에서 각도 계산

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#의 변환 매트릭스 및 IT의 MatrixTransform 유형입니다. 변환을 적용한 후에 각도를 가져 오려고합니다. –

답변

9

당신은 사용할 수 있습니다

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

아이디어는 : 우리는 tempvector을 만들

  1. (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

미래의 참고 :

그러면 변환 행렬의 회전 각도가 라디안 단위로 표시됩니다 :

당신이 필요로하는 경우3210

그리고 당신도까지 라디안을 변환 할 수 있습니다

var degrees = radians * 180/Math.PI;