8

次のコード行があります。値(度数)がわからないまま、長方形にいくつかの回転を適用しました。次に、要素の回転または角度を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度の角度を取得したい

4

3 に答える 3

11

将来の参考のために:

これにより、変換行列の回転角がラジアンで表示されます。

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

必要に応じて、ラジアンを度に変換できます。

var degrees = radians * 180 / Math.PI;
于 2014-05-09T09:36:05.533 に答える
10

あなたはこれを使うことができます:

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);
}
于 2013-01-02T16:57:32.277 に答える
0

回答はラジアンで表示されます。http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/c14fd846-19b9-4e8a-ba6c-0b885b424439/

したがって、以下を使用して、値を度に戻すだけです。

double deg = angle * (180.0 / Math.PI);
于 2013-01-02T16:51:25.460 に答える