Обновление четырех точек, чтобы оставаться в форме прямоугольника при перемещении одного - PullRequest
1 голос
/ 18 сентября 2011

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

1 Ответ

0 голосов
/ 18 сентября 2011

Звучит так, что вы, возможно, захотите использовать матрицу преобразования вместо обновления координат X / Y вручную. Пожалуйста, проверьте эту ссылку:

http://www.bobpowell.net/mappingmodes.htm

Вот справочник MSDN:

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.transform.aspx

...