视口内图形的实际坐标相对于鼠标坐标
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);
正如我在标题中指定的那样,我已经开始开发一个简单的应用程序,它包含在主框架 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);