我不确定这是否可行,但基本上我有两个度可以改变图像的宽度/大小和倾斜度。在转换矩阵(<Matrix3DProjection/>
)中,它的工作方式如下:
M11:cos(x) M12:sin(y)*sin(x) M11:0 M21:0 M22:cos(y) M23:0 M31:0 M32:0 M33:1
因此,如果我有X = 30°
和Y=40°
,我的矩阵就是:
M11:0.866 M12:0.321 M11:0 M21:0 M22:0.766 M23:0 M31:0 M32:0 M33:1
因此变为
我想要使用的是<TransformGroup/>
,但无法确定<SkewTransform AngleY="???"/>
部分。使用<ScaleTransform/>
上方的 M11 和 M22 值以及ScaleX
中的ScaleY
,<ScaleTransform ScaleX=".866" ScaleY=".766"/>
似乎很容易。< / p>
但我无法从AngleY
0.321 的值<SkewTransform/>
中找出M12
部分。我知道,通过手动操作,AngleY="20.3"
的值似乎非常准确。但我无法弄清楚这背后的数学。
有人知道吗?
答案 0 :(得分:3)
您可以在SkewTransform类上使用Reflector来查找数学。它调用Matrix.Skew,它使用矩阵:
1.0 tan(skewY) 0.0
tax(skewX) 1.0 0.0
由于您需要tan(skewY) * 0.766 = 0.321
,因此获得skewY = atan(0.321 / 0.766) = 22.7366108 degrees
。或者,返回原始数字skewY = atan(sin(y) * sin(x) / cos(y)) = atan(tan(y) * sin(x))
,即atan(tan(40 degrees) * sin(30 degrees)) = 22.7604763 degrees
。
答案 1 :(得分:0)
尝试在行之间阅读一些您想要避免使用Projection
属性并使用RenderTransform
代替?
如果是这样,而不是试图弄清楚如何使用ScaleTransform
和SkewTransform
,只需使用MatrixTransform
中的RenderTransform
。
<MatrixTransform Matrix=".866, .321, 0, .766, 0, 0" />
OR
<MatrixTransform M11="0.866" M12="0.321", M22="0.766" />