视口内图形的实际坐标相对于鼠标坐标

Real coordinates for graph inside viewport relative to mouse coordinates

正如我在标题中指定的那样,我已经开始开发一个简单的应用程序,它包含在主框架 window 中,一个双缓冲面板。在这个面板里面可以绘制一些图形,让我们认为这个面板是一个简单的视口,用于在里面绘制的元素。

这里添加了两个功能,平移和缩放可以使用在 MouseDown 和 Move 事件上更新的增量以及用于更新缩放变换的 OnMouseWheel 在绘画事件中缩放变换和平移变换。

在尝试添加功能以支持在缩放大于 1(比例 100%)时在视口内创建节点(图形元素)到精确位置后,真正的问题出现了。

场景 1 -> 黄色矩形已正确创建并准确定位在鼠标指针位置,如下图所示(比例 == 1)。

场景 2 -> 黄色矩形相对于鼠标位置有很大偏移,视口比例约为 aprox。 40%,如下图所示(比例 == 1.4)。红色实心圆是鼠标按下的地方(光标位置不变,只是做了缩放)

测试场景 -> 我试了很多方法都没有成功,这就是其中之一:

我非常感谢任何类型的输入,甚至是与更改 OXY 图方法相关的想法(因为翻译函数使用相对坐标)。

也许这会有所帮助:

PointF ScaleUnscale(PointF p, float offX, float offY, float sX, float sY, bool scale)
{
    PointF pf = p;

    if (scale)
    {
        pf = new PointF( ( p.X  - offX )/ sX, (p.Y - offY)/ sY) ;
    }
    else
    {
        pf = new PointF( p.X * sX + offX, p.Y * sY + offY);
    }
    return pf;
}

这会将鼠标点缩放到 canvas 点或返回:

cPoints.Add(ScaleUnscale(e.Location, .., true));

使用经过平移和缩放的图形对象进行测试:

g.TranslateTransform(offX, offY);
g.ScaleTransform(scaleX, scaleY);