变换鼠标坐标
Transforming mouse coordinates
我正在制作一个图形程序,但我卡在需要使鼠标坐标等于图形比例的地方。对于图片框,我使用变换来缩放我的图形:
RectangleF world = new RectangleF(wxmin, wymin, wwid, whgt);
PointF[] device_points =
{
new PointF(0, PictureBox1.ClientSize.Height),
new PointF(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height),
new PointF(0, 0),
};
Matrix transform = new Matrix(world, device_points);
gr.Transform = transform;
我正在使用 MouseMove 功能。有没有办法转换鼠标坐标?当我将鼠标放在 x=9 上时,我需要鼠标坐标为 9。
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Console.WriteLine(e.X);
}
正如 Hans 的评论所暗示的,您可以使用第二个 Matrix
来完成此操作。您可以通过复制原始 Matrix
并调用副本的 Invert()
方法来获得它,或者您可以通过反转原始输入矩形从头开始创建新的 Matrix
。
恕我直言,求逆更容易,但这确实意味着您需要创建逆矩阵并将其存储在某处。例如:
Matrix transform = new Matrix(world, device_points);
gr.Transform = transform;
inverseTransform = transform.Clone();
inverseTransform.Invert();
其中 inverseTransform
是您 class 中的一个字段而不是局部变量,以便您的鼠标处理代码稍后可以使用它。
如果以后一定要构造Matrix
,可以这样:
RectangleF device = new RectangleF(new Point(), PictureBox1.ClientSize);
PointF[] world_points =
{
new PointF(wxmin, wymin + whgt),
new PointF(wxmin + wwid, wymin + whgt),
new PointF(wxmin, wymin),
};
Matrix inverseTransform = new Matrix(device, world_points);
在任何一种情况下,您只需在鼠标处理代码中使用 Matrix.TransformPoints()
方法将逆变换应用于鼠标坐标以返回您的世界坐标。
我正在制作一个图形程序,但我卡在需要使鼠标坐标等于图形比例的地方。对于图片框,我使用变换来缩放我的图形:
RectangleF world = new RectangleF(wxmin, wymin, wwid, whgt);
PointF[] device_points =
{
new PointF(0, PictureBox1.ClientSize.Height),
new PointF(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height),
new PointF(0, 0),
};
Matrix transform = new Matrix(world, device_points);
gr.Transform = transform;
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Console.WriteLine(e.X);
}
正如 Hans 的评论所暗示的,您可以使用第二个 Matrix
来完成此操作。您可以通过复制原始 Matrix
并调用副本的 Invert()
方法来获得它,或者您可以通过反转原始输入矩形从头开始创建新的 Matrix
。
恕我直言,求逆更容易,但这确实意味着您需要创建逆矩阵并将其存储在某处。例如:
Matrix transform = new Matrix(world, device_points);
gr.Transform = transform;
inverseTransform = transform.Clone();
inverseTransform.Invert();
其中 inverseTransform
是您 class 中的一个字段而不是局部变量,以便您的鼠标处理代码稍后可以使用它。
如果以后一定要构造Matrix
,可以这样:
RectangleF device = new RectangleF(new Point(), PictureBox1.ClientSize);
PointF[] world_points =
{
new PointF(wxmin, wymin + whgt),
new PointF(wxmin + wwid, wymin + whgt),
new PointF(wxmin, wymin),
};
Matrix inverseTransform = new Matrix(device, world_points);
在任何一种情况下,您只需在鼠标处理代码中使用 Matrix.TransformPoints()
方法将逆变换应用于鼠标坐标以返回您的世界坐标。