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. 我们创建一个临时向量 (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 回答