鉴于我有一个包含许多形状的画布,现在让我们说矩形。
每个形状都有一个位置(英寸)、大小(英寸)和旋转角度(度)。
当鼠标单击事件发生在画布内时,位置 (x,y) 以像素为单位。
考虑到旋转角度和测量单位转换,我想检查单击的鼠标位置是否在特定形状内/内。
你能帮我吗?
您的问题非常缺乏细节,我只能提供一个通用的答案。用数学方法做是最快的方法。旋转会使这变得困难。
您可以使用命中测试位图缓慢但轻松地解决它。使用您现在用于将形状渲染到屏幕的相同代码将形状渲染到位图。但现在使用编码形状编号的颜色。命中测试现在使用 GetPixel() 变得简单快捷。小心关闭图像增强设置,如抗锯齿。首先将其渲染到屏幕上,然后使用 ZoomIt 仔细查看像素。
我找到了答案(我必须将所有测量值转换为像素以确保它能够正确计算):
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);
}
}
}