在XAML中为Rhomboid的倾斜因子创建偏斜AngleY

时间:2010-07-12 05:45:03

标签: wpf silverlight math geometry skew

我不确定这是否可行,但基本上我有两个度可以改变图像的宽度/大小和倾斜度。在转换矩阵(<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 

因此normal变为30x40

我想要使用的是<TransformGroup/>,但无法确定<SkewTransform AngleY="???"/>部分。使用<ScaleTransform/>上方的 M11 M22 值以及ScaleX中的ScaleY<ScaleTransform ScaleX=".866" ScaleY=".766"/>似乎很容易。< / p>

但我无法从AngleY 0.321 的值<SkewTransform/>中找出M12部分。我知道,通过手动操作,AngleY="20.3"的值似乎非常准确。但我无法弄清楚这背后的数学。

有人知道吗?

2 个答案:

答案 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代替?

如果是这样,而不是试图弄清楚如何使用ScaleTransformSkewTransform,只需使用MatrixTransform中的RenderTransform

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

OR

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