2010-07-12 33 views
3

我不确定这是否可能,但基本上我有两个度数会改变图像的宽度/大小和斜度。在穿越 - 矩阵(<Matrix3DProjection/>),它的工作原理是这样的:从XAML中的斜纹因素的斜度因子创建斜度AngleY

 
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 

所以normal成为30x40

我”什么D喜欢使用,而不是一个<TransformGroup/>,但不能完全弄清楚<SkewTransform AngleY="???"/>部分。该<ScaleTransform/>似乎用M11M22值以上ScaleXScaleY<ScaleTransform ScaleX=".866" ScaleY=".766"/>很容易。

但我不能从0.321一个M12值计算出的所述<SkewTransform/>AngleY。我知道,通过手动解决这个问题,AngleY="20.3"的值似乎非常准确。但我无法弄清楚这背后的数学。

有谁知道吗?

回答

3

您可以使用在SkewTransform类反射来找出数学。它调用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

+0

呵呵,我对此有很高的期望。不幸的是,对于AngleY来说,22.76的值无法显示与“M12 = 0.321”相同的剪切。我也尝试过其他计算,也不适用于他们。它也可能与其他东西有关,如矩形的宽度/高度? – 2010-07-12 16:54:28

+0

@Otaku:啊,我是在跟着规模做倾斜,但是你在做规模跟着倾斜。这应该只是在我的公式中反转X和Y,产生'atan(tan(30度)* sin(40度))= 20.3605749度。 – Quartermeister 2010-07-12 17:47:28

+0

辉煌,就是这样!谢谢! – 2010-07-12 18:11:17

0

试图在行间读一点你想避免使用Projection属性并使用RenderTransform来代替?

如果是这样,而不是试图找出如何使用ScaleTransformSkewTransform只使用MatrixTransformRenderTransform

<MatrixTransform Matrix=".866, .321, 0, .766, 0, 0" /> 

OR

<MatrixTransform M11="0.866" M12="0.321", M22="0.766" />