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

时间:2018-06-06 18:39:01

标签: c# graphics zoom viewport pan

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

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

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

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

Scenario 1

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

Scenario 2

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

Test

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

1 个答案:

答案 0 :(得分:1)

也许这会有所帮助:

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;
}

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

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

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

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