C# 使用WPF在画布上显示用户可调整大小和用户可旋转的形状

C# 使用WPF在画布上显示用户可调整大小和用户可旋转的形状,c#,wpf,C#,Wpf,我目前正在使用画布上的WPF形状创建一个绘图软件 我创建了一个系统,允许用户在画布上使用透明画布移动和旋转形状(随形状旋转): 绿色点用于旋转形状,矩形上的蓝色区域用于移动形状。我想用我的4个红点来重新调整形状的大小 但是形状是可旋转的,因此角点坐标与调整形状大小并不完全相关。在我看来,这似乎只有在旋转等于0时才相关,因为旋转180度后,左上角可能是右下角 现在我正在使用RotateTransform来实现0.5,0.5renderTransferorMorigin的旋转。我希望避免使用Sca

我目前正在使用画布上的WPF形状创建一个绘图软件

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

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

但是形状是可旋转的,因此角点坐标与调整形状大小并不完全相关。在我看来,这似乎只有在旋转等于0时才相关,因为旋转180度后,左上角可能是右下角

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

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


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

如果形状旋转,可以使用增量调整形状大小。你唯一要做的就是旋转鼠标移动。如你所见:

鼠标从原点到位置的移动描述了二维向量。可以使用以下公式以数学方式旋转此向量:

x'=cos(θ)*x-sin(θ)*y

y'=sin(θ)*x+cos(θ)*y

其中,x/y是鼠标相对于调整大小原点的当前位置,θ是可在形状的RotateTransform对象(角度属性)中找到的旋转角度。在这一点上,我不知道是否必须使用-θ,因为向量必须以相反的方向旋转

您可以选择x'/y'来计算增量,并调整形状大小,就像它没有旋转一样

我自己并没有实现这一点。这只是一个大概的想法。如果您尝试此方法并给出反馈,或者更深入地指定问题,或者使用一些代码更新您的问题,或许我可以提供一些代码

附录:

如果可以访问形状的“宽度”和“高度”属性,则使用增量调整形状大小应该很容易。您只需根据抓取的点,将x-增量添加/减去宽度和/或将y-增量添加/减去高度。这不受图形在画布中的位置影响。
可能需要调整形状的Canvas.Left/Canvas.Top属性。也就是说,如果用户抓住左上角点并将其调整为左/上,则还应从左和上角减去增量。否则它将扩展到右/下。

我明天将回到这里,但有两种解决方案。第一种方法是停止将点绑定到对象的角上,而是将它们放置在矩形边界上。如果您想要具有复杂的形状(特别是具有非凸面外壳的形状),那么这可能更符合逻辑。这里的第二个想法是找到形状的中间,将其用作原点,并将选定的缩放点作为缩放向量的起始参考,然后参照原点缩放所有点(因此整个形状在所有方向上缩放,而不仅仅是拉伸的方向)。我试着应用你说的第二种方法,你能给我一个样品吗?你可能想用装饰品。这可能会有所帮助-我想在wpf中做类似的事情。你能提供你如何旋转和调整大小的代码吗?你解决了我的问题:)谢谢。我以一种计算的方式问了我的问题,我担心它不会因此得到回答。我给你这个赏金:)我可以访问我的形状的H/W,我会在我弄明白所有事情后编辑我的第一篇文章,并提供一个使用你的方法的代码示例。