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

时间:2014-07-15 03:18:17

标签: c# zoom mouse coordinates pan

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

我有一个支持平移和缩放的视口,通过存储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答案得到了解决方案。感谢您的帮助! :)

2 个答案:

答案 0 :(得分:1)

使用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事件的代码,因此您可以看到这是否也是您处理它的方式。

答案 1 :(得分: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);

此代码将为您提供光标在图像中的位置。