正如我在标题中指出的那样,我已经开始研究一个简单的应用程序,它包含在主框架窗口中,一个双缓冲面板。在这个面板中可以绘制一些图形,我们可以认为这个面板是内部绘制元素的简单视口。
这里添加了两个功能,平移和缩放可以使用在MouseDown和Move事件上更新的delta和OnMouseWheel更新缩放变换来缩放转换和转换内部转换内部的变换。
在尝试添加一项功能以支持在视口内创建节点(图形元素)到缩放大于1(缩放100%)时的精确位置时,真正的问题已经到来。
场景1 - >黄色矩形已正确创建,并且位于鼠标指针位置,如下图所示(比例== 1)。
场景2 - >黄色矩形相对于鼠标位置高度偏移,视口范围为aprox。 40%,如下图所示(比例== 1.4)。红色填充的圆圈是鼠标按下的(光标位置保持不变,只进行了缩放)。
测试方案 - >在发布之前我尝试了很多方法而没有成功,这是其中之一:
我非常感谢任何类型的输入,甚至是与更改OXY图表方法相关的想法(因为翻译函数使用相对坐标)。
答案 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);