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

4
我已经花了大约一个小时来解决这个问题。
我有一个支持平移和缩放的视口,平移是通过存储X和Y轴的偏移量来处理的。缩放只是一个从0.2到14的浮点数。
我的问题是,当我缩放和平移时,需要能够在用户单击视口的位置放置物品,但鼠标坐标不正确。我一直没有能够弄清楚如何正确计算鼠标坐标。
这里有一张图片展示了我目前所拥有的:http://i.imgur.com/WQSXKJ2.png 正如您所看到的,鼠标原点始终位于视口组件的左上角。您可以在图像的左下角看到平移X和Y偏移以及缩放值。我还添加了一个关于鼠标坐标与视口左上角的示例。
现在,由于在该图像中它当前被缩放,因此我放置的对象将会被偏移。
感谢您的时间! 使用适用于我的情况的解决方案进行编辑:
void Viewport_MouseClick(object sender, MouseEventArgs e){
    Point mousePosition = new Point((int)((e.X - Pan.X) / Zoom),
                                    (int)((e.Y - Pan.Y) / Zoom));
}

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

你使用的是哪个平台?WPF,Winform..?? 你正在使用哪些控件,缩放是如何实现的? - TaW
这是一个Winform,我的控件派生自“UserControl”类。缩放只是一个浮点数,它被传递到“OnPaint”方法中的“ScaleTransform”方法中。 - user2728839
2个回答

2
使用TrackBar进行缩放,再加上两个用于偏移的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事件的代码,所以您可以看到是否以您处理它的方式进行。

谢谢您的回答,但是当我在缩放时像那样计算鼠标位置时,我会得到我的视口中放置对象的负偏移量。我处理Paint方法的方式是使用“TranslateTransform(pan.X,pan.Y)”,然后再使用“ScaleTransform(Zoom,Zoom)”。 - user2728839
我刚刚通过尝试您的示例弄明白了。我的做法是从鼠标位置中减去平移的偏移量,然后将结果除以缩放比例,代码如下:"(int)((e.X - Pan.X) / Zoom)" 和 "(int)((e.Y - Pan.Y) / Zoom)"。感谢您的帮助! :) - user2728839

0
将您的图片放入PictureBox中,然后计算鼠标的相对位置。
    double Pic_width = orginal_image_width/ pictureBox.width;
    double Pic_height = orginal_image_height/ pictureBox.height;
    var mouseArgs = (MouseEventArgs)e;
    int xpoint = Convert.ToInt16(mouseArgs.X * Pic_width);
    int ypoint = Convert.ToUInt16(mouseArgs.Y * Pic_height);

这段代码将会给你图像中光标的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接