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

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

这里添加了两个function,平移和缩放可以使用在MouseDown上更新的delta和Move事件以及OnMouseWheel更新缩放变换来缩放转换和转换内部转换内部的转换。

在尝试添加function以支持在视口内创建节点(图形元素)到缩放大于1(缩放100%)时的精确位置时,真正的问题已经到来。

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

情景1

场景2 – >黄色矩形相对于鼠标位置高度移动,视口比例为aprox。 40%,如下图所示(比例== 1.4)。 红色填充的圆圈是鼠标按下的(光标位置保持不变,只进行了缩放)。

场景2

测试场景 – >在发布之前我尝试了很多方法而没有成功,这是其中之一:

测试

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

也许这会有所帮助:

PointF ScaleUnscale(PointF p, float offX, float offY, float sX, float sY, bool scale) { PointF pf = p; if (scale) { pf = new PointF( ( pX - offX )/ sX, (pY - offY)/ sY) ; } else { pf = new PointF( pX * sX + offX, pY * sY + offY); } return pf; } 

这会将鼠标指针缩放到canvas点或背面:

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

使用已翻译和缩放的Graphics对象进行测试:

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