c# - 使用平移和缩放计算正确的光标位置

标签 c# zooming mouse coordinates pan

我已经为这个问题纠结了大约一个小时。

我有一个支持平移和缩放的视口(viewport),平移是通过存储 X 轴和 Y 轴的偏移量来处理的。缩放只是一个从 0.2 到 14 的 float 。

我的问题是,我需要能够将内容放置在用户在视口(viewport)中单击的位置,但是当我缩放和平移时,鼠标坐标不正确。我一直无法弄清楚如何正确计算鼠标坐标。

这是一张显示我目前拥有的图片:http://i.imgur.com/WQSXKJ2.png

如您所见,鼠标原点始终位于视口(viewport)组件的左上角。您可以在图像的左下角看到平移 X 和 Y 偏移以及缩放值。我还添加了一个鼠标坐标相对于视口(viewport)左上角的示例。

现在因为在该图像中它当前放大了我放置的对象将被偏移。

感谢您的宝贵时间!

使用适合我的情况的解决方案进行编辑:

void Viewport_MouseClick(object sender, MouseEventArgs e){
    Point mousePosition = new Point((int)((e.X - Pan.X) / Zoom),
                                    (int)((e.Y - Pan.Y) / Zoom));
}

这会计算出正确的“屏幕空间”鼠标位置,同时考虑平移和缩放。 我通过玩弄 TaWs 答案得到了那个解决方案。感谢您的帮助! :)

最佳答案

使用 TrackBar 进行缩放,另外两个用于偏移,这似乎可行:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    using (Bitmap bmp = new Bitmap(filename))
    {
        e.Graphics.ScaleTransform(zoom, zoom);
        e.Graphics.DrawImage(bmp, trb_offsetX.Value, trb_offsetY.Value);
    }
}

float zoom = 1f;

private void panel1_MouseMove(object sender, MouseEventArgs e)
{

  Point mouseLocation = e.Location;
  Point imageLocation = new Point((int)((mouseLocation.X / zoom - trb_offsetX.Value)),
                                  (int)((mouseLocation.Y / zoom - trb_offsetY.Value)));

   st_mousePos.Text = "   "  +  imageLocation.ToString();

}


private void trackBar1_Scroll(object sender, EventArgs e)
{
    zoom = trackBar1.Value;
    panel1.Invalidate();
}

我已经添加了 Paint 事件的代码,所以您可以看看您是否也是这样处理它的。

关于c# - 使用平移和缩放计算正确的光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749318/

相关文章:

Java 读取原始鼠标输入

c# - 在 C# 中计算子网掩码中的位数

c# - 插入数据时不将数据复制到表中

c# - 当引用不在 ItemsSource 中时 WPF 绑定(bind)到 ComboBox SelectedItem

jquery 用户界面 : css scaled elements do not work with draggable()

javascript - 将运行时中的 maxZoom 选项更改为 Openlayers 3 中的 ol.View

java - LWJGL允许负鼠标坐标(窗口外)

jquery - 除了 Firefox 之外的所有浏览器中的 Mouseup 错误?

c# - 日期时间选择器自定义格式

android - 是否可以根据触摸事件设置动画枢轴值?