0

我正在尝试在 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);

任何有关如何使其与累积缩放一起使用的建议将不胜感激。

4

0 回答 0