如何在GDI +中对具有真实形状测量(英寸)的旋转形状进行命中测试?

时间:2009-01-13 08:36:55

标签: c# winforms math gdi+ mouse

鉴于我有一个包含许多形状的画布,现在就说矩形。

每个形状都有一个位置(英寸),大小(英寸)和旋转角度(度)。

当画布内的鼠标单击事件发生位置(x,y)时,以像素为单位。

考虑到旋转角度和测量单位转换,我想检查点击的鼠标位置是否在特定形状内/内。

你能帮忙吗?

2 个答案:

答案 0 :(得分:4)

你的问题在细节上非常简短,我只能提供一般答案。在数学上做它是最快的方法。轮换会使这很困难。

您可以使用命中测试位图缓慢但轻松地解决问题。使用您现在用于将其渲染到屏幕的相同代码将形状渲染为位图。但现在使用编码形状编号的颜色。使用GetPixel(),命中测试现在变得简单快捷。请小心关闭图像增强设置,例如消除锯齿。首先将其渲染到屏幕上并使用ZoomIt仔细查看像素。

答案 1 :(得分:3)

我找到了答案(我必须将测量值转换为像素以确保它能够正确计算):

public static bool HitTest(Rectangle bounds, float angle, Point location)
        {
            if (angle == 0) return bounds.Contains(location);

            using (Matrix matrix = new Matrix())
            {
                matrix.RotateAt(angle, Center(bounds));
                using (GraphicsPath path = new GraphicsPath())
                {
                    path.AddRectangle(bounds);
                    path.Transform(matrix);
                    return path.IsVisible(location.X, location.Y);
                }
            }
        }