Динамическое увеличение на 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);

Любой совет о том, как заставить это работать с кумулятивным увеличением, был бы очень признателен.

0 ответов

Другие вопросы по тегам