C# 使用GDI+;矩阵变换

C# 使用GDI+;矩阵变换,c#,winforms,gdi+,graphicspath,matrix-transform,C#,Winforms,Gdi+,Graphicspath,Matrix Transform,我试图在图形上实现动态缩放,用户在其中绘制一个矩形来定义缩放区域(请参见下面代码中的selectRect)。当用户释放鼠标时,GraphicsPath将缩放并转换(通过矩阵)到正确位置,以在“drawArea”定义的矩形中显示缩放区域 其目的是允许用户动态放大多次 下面用于计算缩放和平移值的代码在用户第一次缩放时非常有效。但是,任何后续缩放都不会产生预期的结果 if (e.Button == MouseButtons.Left) { Poi

我试图在图形上实现动态缩放,用户在其中绘制一个矩形来定义缩放区域(请参见下面代码中的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()

图纸代码: (注意,目的是保留原始路径数据,这就是我使用克隆的原因)


如果您能就如何使用累积缩放提供任何建议,我们将不胜感激。

这不是答案,但您最好在图形上下文中设置转换,而不是在每个可绘制元素上设置转换。这不是答案,但是,用户使用鼠标滚轮进行缩放可能会比必须进入某些特殊模式(应用程序无法使用)要高兴得多,同时要求用户定义一个要放大的矩形,然后才能继续操作。@MikeNakis感谢您的评论。GraphicsPath基本上是一个X/Y图形,因此我需要用户能够以任何方式缩放X和Y,以放大特定区域。如果我使用鼠标滚轮,那么我正在确定我可以在每个轴上缩放的量。不会产生预期的结果没有应有的帮助。
    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);