缩放旋转的元素

时间:2013-04-18 19:04:48

标签: c# wpf math rotation scaling

假设我有一个想要在可视化设计器中旋转和缩放的元素: 用户应该能够拖动边缘,图形应该适当缩放 旋转以度数输入。



以下事实是旋转元素的问题:
当拖动左上角时,不仅宽度和高度会改变,而且左上角位置也会改变。 拖动右上角后,尺寸也会改变,Y位置也会改变

如果元素旋转(WPF RenderTransform,围绕它的中心旋转),那么行为必须相应地改变,我不知道如何。假设元素旋转90°,则之前左上角的点是右上角的点 这意味着我必须转变一些东西,但我完全被难倒了,我害怕了 我正在寻找在任何图形程序中实现的行为。
用户基本上拖动边界框的点,图形应该投射到框内。

如何在WPF中解决这个问题?
绘制的元素派生自UIElement,因此我可以访问所需的所有变换属性。该解决方案适用于输入的任何旋转。
如果你能帮助我,或者指出我正确的方向,我将不胜感激。

修改
我知道如何缩放和旋转元素。期望的结果是元素完全适合用户拖动的框。所以这个问题比WPF相关的数学更多。

修改
感谢downvoting而没有向我提出我可以改进的建议 为了解问题,请尝试以下方法:
创建一个新的WPF项目,添加ANY UIElement并旋转它,例如90° 现在记住拖动之前的边距,并将右下角拖动到某处。如您所见,保证金(=位置)也会发生变化。我的问题是如何计算这种补偿,以便在拖动时为用户提供所需的结果。因为如果我改变位置以补偿比例,那么结果只是奇怪而且不符合预期。
补偿取决于元素的规模。明显。
请参考下图:
你在这里看到的是我拖动右下角之前的Canvas.Top和Canvas.Left属性,以及在我拖动右下角之后的下方。
http://imageshack.us/photo/my-images/268/beforeaftert.png/?sa=0

2 个答案:

答案 0 :(得分:1)

您应该使用TransformGroup。

在TransformGroup中,您可以同时拥有ScaleTransform,RotateTransform,TranslateTransform和SkewTransform(按此顺序,这很重要)。

这样您就可以将每个动作映射到不同的变换。

您实际上不需要考虑不同的点,您只需要将鼠标移动映射到不同的变换。例如:

如果单击其中一个角,则每次移动鼠标都会触发ScaleTransform的更改。 如果单击旋转点,则可以在RotateTransform中触发更改。

如果您需要围绕中心的不同点进行缩放,倾斜或旋转,则需要对当前正在执行的变换进行补偿变换:

  • ScaleTransform需要translateTransformation来补偿因缩放造成的横向/垂直差异。
  • 围绕不同的中心点旋转时,您只需更改rotatetransform的centerX / centerY

答案 1 :(得分:1)

也许看看http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part-1 调整大小部分涵盖了这些问题。基本的想法是识别你点击调整大小的元素(左角,右角等)然后有'数学'的东西来设置你的画布的左边和顶部。