我已经为这个问题纠结了大约一个小时。
我有一个支持平移和缩放的视口(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/