【问题标题】:given a MatrixTransform how do I determine its current angle?给定一个 MatrixTransform 我如何确定它的当前角度?
【发布时间】:2012-10-10 18:26:37
【问题描述】:

我正在使用 WPF 的 MatrixTransform 来管理我在 Canvas(全 2D)上的平移、缩放和旋转。它运作良好。但是,我希望能够计算当前的旋转角度。这是怎么做到的?我需要反转矩阵然后用它来旋转一些东西吗?如有必要,我可以提供一个“旋转点”。

【问题讨论】:

  • 除非矩阵完全是旋转变换矩阵(即:具有适当的对称性),否则变换本身没有“角度”。你必须定义你的意思——如果变换扭曲了原来的,那么你在哪里参考你的角度?想象一下,矩阵取一个正方形,只移动一个顶点——它的“角度”是如何变化的?
  • 如果您可以将 MatrixTransform 替换为包含其他变换(Rotate、Translate、Scale、Skew 等)的 TransformGroup,您可能会找到您要查找的内容。

标签: c# wpf transform


【解决方案1】:

假设:

  1. 矩阵绝对是平移/旋转/缩放矩阵(无偏斜或其他非正交性)。
  2. 指定的矩阵是首先应用缩放,然后是旋转,然后是平移。

步骤:

  1. 您可以忽略最终的平移分量,为您提供包含缩放和旋转的左上角 3x3 矩阵。

  2. 缩放只是乘以缩放因子的对角矩阵(缩放矩阵中的每一列),因此您可以对列向量进行归一化,从而得到一个纯粹表达旋转的正交矩阵。

    李>
  3. 要获得旋转角度,您需要选择旋转轴或要旋转的矢量(从中可以计算旋转轴和角度。)

后一种情况更简单:

  1. 采用幅度为 1 的样本向量 v(简化数学运算。)
  2. 通过旋转矩阵变换得到 v'。
  3. 对于旋转轴 (v x v'),它们之间的角度定义为 acos(v * v')。 “x”是叉积,“*”是点积。

【讨论】:

  • 它似乎只需将 OffsetX/Y 归零即可工作;不需要缩放,因为矢量长度不会改变角度。感谢您及时的回复。例如。 var mWithoutOffset = m; // it's a struct (copied by assignment) mWithoutOffset.OffsetX = mWithoutOffset.OffsetY = 0.0; var vector = mWithoutOffset.Transform(new Vector(1.0, 0.0)); var currentRotation = Math.Atan2(vector.Y, vector.X) * Constants.RAD_TO_DEG + 90.0; var assetAngle = ((double) _headingVal) * Constants.RAD_TO_DEG; m.RotateAt(assetAngle - currentRotation, ActualWidth * 0.5, ActualHeight * 0.5);
  • @Brannon,啊,我完全错过了这是 2D。在那种情况下,是的,有一个独特的旋转角度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多