在XAML中为菱形创建一个倾斜角度Y,其倾斜因子为Skew Factor。

3
我不确定是否可能,但是基本上我有两个度数,它们会改变图像的宽度/大小和倾斜。在转换矩阵(<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/>似乎很容易,只需要在ScaleXScaleY中使用上面的M11M22值,例如:<ScaleTransform ScaleX=".866" ScaleY=".766"/>
但是我无法从M12值为0.321的情况中确定SkewTransform部分的AngleY。我知道通过手动操作,AngleY="20.3"的值似乎非常准确。但我无法弄清楚背后的数学原理。
有人知道吗?
2个回答

3

您可以使用Reflector工具来查找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 度。或者,回到你最初的数字,skewY = atan(sin(y) * sin(x) / cos(y)) = atan(tan(y) * sin(x)),这将产生 atan(tan(40度) * sin(30度)) = 22.7604763 度


哎呀,我对这个有很高的期望。遗憾的是,一个值为22.76不能显示与“M12=0.321”相同的角度剪切效果。我也尝试了其他计算,但它们也无法正常工作。这可能与其他因素有关吗,比如我的矩形的宽度/高度? - Todd Main
@Otaku:啊,我先做了Skew再做Scale,但你是先做了Scale再做Skew。这只需要在我的公式中反转X和Y即可,得到atan(tan(30度)*sin(40度))=20.3605749度 - Quartermeister
太棒了,就是这样!谢谢你! - Todd Main

0

从字里行间来看,您想避免使用Projection属性,改用RenderTransform是吗?

如果是这样,与其试图弄清如何使用ScaleTransformSkewTransform,不如在RenderTransform中使用MatrixTransform

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

或者

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

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