我正在尝试绘制一个矩形对象,允许用户单击一个角点来调整大小,并在2D空间中旋转矩形。
因此,我使用从左上角到左下角按顺时针顺序排列A,B,C,D(或0,1,2,3)的四点阵列。
旋转工作正常,我计算中心点并围绕它旋转一个角度。
通过确定按下哪个点,然后在每个MouseMove事件上将其新位置设置为鼠标位置来完成调整大小。然后需要更新两个相邻点以保持矩形形状。调整大小是间歇性的不起作用。我已经尝试了很多方法来进行错误检查,但是所有这些都让我遇到了同样的问题,如果我在移动一个点的同时在相对的点上来回移动鼠标,这些点会变形并且不再是矩形。
此处的源代码
https://www.assembla.com/code/moozhe-testing/subversion/nodes/rotateRectangle
问题代码的执行
private void MovePoint(int id, PointF newPoint)
{
PointF oldPoint = points[id];
PointF delta = newPoint.Substract(oldPoint);
PointF pointPrevious = points[(id + 3) % 4];
PointF pointNext = points[(id + 1) % 4];
PointF sidePrevious = pointPrevious.Substract(oldPoint);
PointF sideNext = pointNext.Substract(oldPoint);
PointF previousProjection = Projection(delta, sidePrevious);
PointF nextProjection = Projection(delta, sideNext);
pointNext = pointNext.AddPoints(previousProjection);
pointPrevious = pointPrevious.AddPoints(nextProjection);
points[(id + 3) % 4] = pointPrevious;
points[(id + 1) % 4] = pointNext;
points[id] = newPoint;
}
private PointF Projection(PointF vectorA, PointF vectorB)
{
PointF vectorBUnit = new PointF(vectorB.X, vectorB.Y);
vectorBUnit = vectorBUnit.Normalize();
float dotProduct = vectorA.X * vectorBUnit.X + vectorA.Y * vectorBUnit.Y;
return vectorBUnit.MultiplyByDecimal(dotProduct);
}
答案 0 :(得分:0)
听起来您可能想要使用变换矩阵,而不是手动更新X / Y坐标。请查看此链接:
http://www.bobpowell.net/mappingmodes.htm
这是MSDN参考:
http://msdn.microsoft.com/en-us/library/system.drawing.graphics.transform.aspx