【问题标题】:Real coordinates for graph inside viewport relative to mouse coordinates相对于鼠标坐标的视口内图形的真实坐标
【发布时间】:2018-11-16 13:14:06
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您需要将鼠标点转换为图像点的缩放/取消缩放功能吗?你能显示 Graphics.xxxTransForms 吗?

标签: c# graphics zooming viewport pan


【解决方案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);

【讨论】:

  • 太棒了。这完美地工作。非常感谢你
  • 我在附近...我尝试的第一件事是 delta / scroll,这是错误的。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多