更新四个点,使其在移动时保持矩形形状

本文关键字:移动 四个 更新 | 更新日期: 2023-09-27 18:08:59

我正在尝试绘制一个矩形对象,允许用户单击一个角点来调整大小,并在二维空间中旋转矩形。

因此,我使用一个由四个点组成的数组,依次为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);
}

更新四个点,使其在移动时保持矩形形状

听起来您可能想要使用转换矩阵,而不是手动更新X/Y坐标。请查看此链接:

GDI映射模式与GDI+变换的比较

MSDN引用:

https://learn.microsoft.com/en-us/dotnet/api/system.drawing.graphics.transform