我目前正在使用画布上的WPF Shapes创建绘图软件。
我创建了一个系统,允许用户在形状上使用透明画布(随形状旋转)在Canvas上移动和旋转形状:
绿点用于旋转形状,矩形上的蓝色区域用于移动形状。我想用我的4个红点重新调整形状。
但是形状是可旋转的,因此角坐标与调整形状的大小并不完全相关。在我看来,似乎只有在旋转等于0时才有意义,因为在180度旋转后,左上角可以是右下角。
现在我正在使用RotateTransform
通过0.5, 0.5
RenderTransformOrigin
来实现轮换。我想避免使用ScaleTransform
,因为我希望保持StrokeThickness
的大小。
所有红点都是伪可拖动的(使用MouseDown,MouseMove,MouseUp事件)。我使用一个缓冲点,它给出了两个鼠标事件之间X和Y的增量。
如果使用增量来调整形状大小,即使它被旋转或移动了?
答案 0 :(得分:4)
如果旋转,您可以使用增量来调整形状的大小。你唯一要做的就是旋转鼠标移动。如你所见:
vectorrotate http://s1.directupload.net/images/140313/ajrbvy55.jpg
鼠标从原点移动到位置描述了一个二维矢量。您可以使用以下公式以数学方式旋转此向量:
x'= cos(theta)* x - sin(theta)* y
y'= sin(theta)* x + cos(theta)* y
其中x / y是鼠标相对于调整大小原点的当前位置,而θ是旋转角度,可以在形状的RotateTransform-object(Angle-Property)中找到。此时我不确切知道你是否必须使用-theta,因为向量必须以相反的方向旋转。
您可以选择x'/ y'来计算增量并调整形状,就好像它没有旋转一样。
我自己没有实现这一点。这只是一个普遍的想法。如果您尝试这样做并提供反馈或更深入地指出问题或使用某些代码更新您的问题,也许我可以提供一些代码。
<强>附录强>
如果可以访问形状的width-height属性,则使用增量调整大小应该很容易。您只需在宽度上添加/减去x-delta和/或根据抓取的点添加/减去y-delta到/从高度。这不受画布内形状位置的影响。 也许你必须调整形状的Canvas.Left / Canvas.Top-Property。即如果用户抓住左上点并将其调整为左/上,则还应从左上角和上边界中减去增量。否则它会向右/向下扩展。