使用WPF在画布上创建可由用户调整大小和旋转的形状

11

我目前正在使用WPF Shapes在画布上创建绘图软件。

我已经创建了一个系统,允许用户使用形状上的透明画布(与形状一起旋转)在画布上移动和旋转形状:

当前系统

绿色点用于旋转形状,矩形上方的蓝色区域用于移动形状。我想使用我的四个红点重新调整形状的大小。

但是形状是可旋转的,因此角落的坐标并不完全相关于调整形状的大小。在我看来,仅当旋转等于0时,它似乎是相关的,因为左上角可以是180度旋转后的右下角。

现在我正在使用RotateTransform通过0.5, 0.5RenderTransformOrigin实现旋转。我想避免使用ScaleTransform,因为我希望保持StrokeThickness的大小。

所有的红点都是伪可拖动的(使用MouseDown、MouseMove、MouseUp事件)。我使用缓冲点来获取两个鼠标事件之间的X和Y增量。

即使形状被旋转或移动,我如何使用增量来调整形状的大小?


2
明天我会回来看这个问题,但是有两种解决方案。第一种是停止将点绑定到对象的角落,而是将它们放在矩形边界上。如果您打算拥有复杂的形状(特别是非凸包形状),这可能更合理。第二个想法是找到形状的中心,将其用作原点,并将所选比例点用作比例向量的起始参考,然后相对于原点缩放所有点(因此整个形状在所有方向上都会缩放,而不仅仅是您正在拉伸的方向)。 - Firoso
我正在尝试应用你提到的第二种方法,你能给我提供一个样例吗? - Bahaïka
3
您可能希望使用 Adorners。这篇文章可能会有所帮助 - http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part。 - Phil
我想在 WPF 中做类似的事情。请问您能否提供如何旋转、调整大小等方面的代码? - mrid
1个回答

7

如果形状被旋转了,您可以使用增量来调整其大小。您需要做的唯一一件事就是旋转鼠标移动。如下所示:

vectorrotate

鼠标从原点到位置的移动描述了一个二维向量。您可以使用以下公式在数学上旋转此向量:
x' = cos(theta) * x - sin(theta) * y
y' = sin(theta) * x + cos(theta) * y
其中,x/y是鼠标相对于调整大小的原点的当前位置,theta是旋转角度,可以在形状的RotateTransform对象(Angle属性)中找到。此时我不确定是否必须使用-theta,因为向量必须向相反方向旋转。
您可以选择x'/y'来计算增量并调整形状,就像它没有被旋转一样。
我自己没有实现这个。这只是一个一般性的想法。如果您尝试这个并提供反馈或更深入地说明问题或更新您的问题,请让我知道,也许我可以提供一些代码。
附录:
使用增量调整形状大小应该很容易,如果您可以访问形状的宽度和高度属性。您只需将x增量加/减到宽度上,并将y增量加/减到高度上,具体取决于所抓取的点。这不会受到形状在画布内的位置的影响。 也许您需要调整形状的Canvas.Left/Canvas.Top属性。例如,如果用户抓住左上角并将其调整为左上方,则还应从左侧和顶部属性中减去增量。否则,它将向右下方扩展。

1
你解决了我的问题 :) 谢谢。我以一种计算的方式提出了我的问题,因此我担心它不会被回答。我给你这个赏金 :) 我可以访问我的形状的硬件,一旦我弄清楚了一切,我将编辑我的第一个帖子,并使用您的方法提供代码示例。 - Bahaïka

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