Динамическое увеличение на GraphicsPath с использованием матричных преобразований GDI+
Я пытаюсь реализовать динамическое масштабирование на GraphicsPath, где пользователь рисует прямоугольник, чтобы определить область масштабирования (см. SelectRect в коде ниже). Когда пользователь отпускает мышь, GraphicsPath масштабируется и переводится (с помощью матрицы) в правильное положение, чтобы отобразить увеличенную область в прямоугольнике, заданном параметром drawArea.
Цель состоит в том, чтобы позволить пользователю динамически увеличивать количество раз.
Приведенный ниже код для вычисления масштаба и значений перевода отлично работает при первом увеличении масштаба пользователем. Однако любое последующее увеличение не дает ожидаемого результата.
if (e.Button == MouseButtons.Left)
{
PointF p = ConvertScreenToWorld(new PointF(selectRect.Width, selectRect.Height));
PointF p2 = ConvertScreenToWorld(new PointF(selectRect.X, selectRect.Y));
tmpScale = new PointF(drawArea.Width / Math.Max(1, p.X) , drawArea.Height / Math.Max(1, p.Y));
tmpTranslate = new PointF(-p2.X * tmpScale.X, -p2.Y * tmpScale.Y);
this.Invalidate();
}
ConvertScreenToWorld ()
private PointF ConvertScreenToWorld(PointF PointIn)
{
PointF[] p = new PointF[] { PointIn };
Matrix m = new Matrix();
m.Translate(tmpTranslate.X, tmpTranslate.Y);
m.Scale(tmpScale .X, tmpScale .Y);
m.Invert();
m.TransformPoints(p);
return p[0];
}
Код рисования: (обратите внимание, что намерение - сохранить исходные данные пути, поэтому я использую клон)
Matrix m2 = new Matrix();
m2.Translate(tmpTranslate.X, tmpTranslate.Y);
m2.Scale(tmpScale.X, tmpScale.Y);
GraphicsPath gpClone2;
gpClone2 = (GraphicsPath)gp.Clone();
gpClone2.Transform(m2);
g.DrawPath(Pens.Blue, gpClone2);
Любой совет о том, как заставить это работать с кумулятивным увеличением, был бы очень признателен.