从矩阵变换计算角度

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度之间获得角度。

我猜这是一个变换矩阵。 - Shotgun Ninja
是的,这就是变换矩阵,它是C#中MatrixTransform类型的一种。 我想要在应用变换后得到角度。 - Hiren Desai
3个回答

11

供日后参考:

这将为您提供变换矩阵的旋转角度(弧度制):

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

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

var degrees = radians * 180 / Math.PI;

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);
}

感谢大家的即时回复。 - Hiren Desai

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接