Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用平移和缩放计算正确的光标位置_C#_Zooming_Mouse_Coordinates_Pan - Fatal编程技术网

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

C# 使用平移和缩放计算正确的光标位置,c#,zooming,mouse,coordinates,pan,C#,Zooming,Mouse,Coordinates,Pan,我已经把这个问题胡闹了大约一个小时了 我有一个支持平移和缩放的视口,通过存储X轴和Y轴的偏移来处理平移。缩放只是一个从0.2到14的浮动 我的问题是,我需要能够将东西放在用户在视口中单击的位置,但当我缩放和平移鼠标时,鼠标坐标不正确。我还没有弄清楚如何正确计算鼠标坐标 下面是一张图片,展示了我目前所拥有的: 如您所见,鼠标原点始终位于视口组件的左上角。在图像的左下角可以看到平移X和Y偏移以及缩放值。我还添加了一个鼠标坐标相对于视口左上角的示例 现在,因为在该图像中,它当前已放大,所以我放置的对象

我已经把这个问题胡闹了大约一个小时了

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

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

下面是一张图片,展示了我目前所拥有的:

如您所见,鼠标原点始终位于视口组件的左上角。在图像的左下角可以看到平移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答案得到了解决方案。谢谢你的帮助!:)

使用一个轨迹条进行缩放,再使用两个轨迹条进行偏移,这似乎有效:

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();
}

我已经添加了绘制事件的代码,因此您可以查看是否也是这样处理的。

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

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

您使用的是哪个平台?WPF,Winform。。??您使用的控件是什么?缩放是如何实现的?它是一个winform,我的控件派生自“UserControl”类。缩放只是一个浮点数,它被传递到“OnPaint”方法中的“ScaleTransform”方法。谢谢你的回答,但是当我在放大时这样计算鼠标位置时,我在视口中放置的对象会得到负偏移。我处理绘画方法的方式是使用“TranslateTransform(pan.X,pan.Y)”,然后使用“ScaleTransform(Zoom,Zoom)”。我只是通过玩你的示例来解决这个问题。我所做的是从鼠标位置减去平移偏移量,然后将结果除以缩放,如:“(int)((e.X-pan.X)/zoom)”和“(int)((e.Y-pan.Y)/zoom)”。谢谢你的帮助!:)