通过平移和缩放计算正确的光标位置

本文关键字:光标 位置 计算 缩放 | 更新日期: 2023-09-27 18:13:00

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

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

我的问题是,我需要能够放置的东西,用户点击在视口,但当我缩放和平移鼠标坐标不正确。我还没能弄清楚如何正确地计算鼠标坐标。

这是一个图像显示我目前为止的:https://i.stack.imgur.com/3hKHH.png

正如你所看到的,鼠标原点总是在viewport组件的左上角。您可以在图像的左下角看到平移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));
}

这计算一个正确的"屏幕空间"鼠标位置,同时考虑平移和缩放。我是通过计算它的答案得到这个解的。谢谢你的帮助!:)

通过平移和缩放计算正确的光标位置

使用一个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事件的代码,所以你可以看看你是否也是这样处理它的

将图片放入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);

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