2013-01-02 12 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#での変換行列と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

を:

これは、変換行列の回転角をラジアンで表します:

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

、あなたが必要な場合は、ラジアンを度に変換することができます:

var degrees = radians * 180/Math.PI; 
関連する問題