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

发布于 2024-07-10 22:16:49 字数 178 浏览 5 评论 0原文

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

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

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

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

你能帮我吗?

Given I have a canvas that contains many shapes, lets say rectangles for now.

Each shape has a location (inches), size(inches) and rotation angle(degrees).

When a mouse click event happen inside the canvas for a location (x,y) in pixels.

I want to check if the clicked mouse position is inside/within a specific shape, considering the rotation angle and measurement unit conversion.

Can you help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七色彩虹 2024-07-17 22:16:49

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

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

I found the answer (I have to convert al measurements to pixels to make sure it will calculate correctly):

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);
                }
            }
        }
追星践月 2024-07-17 22:16:49

你的问题太缺乏细节,我只能提供一个笼统的答案。 用数学方法来做是最快的方法。 轮换会使这变得困难。

您可以通过使用命中测试位图缓慢但轻松地解决它。 使用您现在用于将其渲染到屏幕上的相同代码将形状渲染为位图。 但现在使用编码形状编号的颜色。 现在,使用 GetPixel() 进行命中测试既简单又快速。 请小心关闭图像增强设置,例如抗锯齿。 首先将其渲染到屏幕上,然后使用 ZoomIt 仔细查看像素。

Your question is awfully short on details, I can only provide a generic answer. Do it mathematically is the fastest way. Rotation can make that difficult.

You can solve it slowly but easily by using a hit-test bitmap. Render the shapes to a Bitmap, using the same code you now use to render it to the screen. But now using a color that encodes the shape number. Hit testing is now simple and quick with GetPixel(). Be careful to turn off image enhancement settings, like anti-aliasing. Render it to the screen first and take a good look at the pixels with ZoomIt.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文