Я пытаюсь нарисовать прямоугольный объект, который позволяет пользователю щелкнуть по угловой точке, чтобы изменить ее размер, а также повернуть прямоугольник в 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);
}