我正在尝试编写一个应用程序来绘制包含矩形,直线和圆的示意图。现在我想添加另一个功能来将矩形拖动到不同的位置。我面临的问题是检测我是否在矩形内点击了。我知道有一个像Rectangle.Contains(Point)
这样的函数。要使用这种方法,我需要使用for循环来检查每个矩形。如果我有大量的矩形,那么使用这种方法是不明智的。有没有其他方法可以完成这项任务。
答案 0 :(得分:3)
你需要一个计算机图形学教科书,这个和类似的问题经常被讨论。
如果记忆为我服务,请确保该点位于矩形的上边缘下方,下边缘上方,右边缘左侧和左边缘右侧。
关于在循环中测试一堆矩形。考虑使用每个矩形适合的圆,一个边界圆。首先测试该点是否远离圆的原点而不是圆的半径。如果是这样,就没有必要测试矩形,这是一个未命中。好的,这是一个非常理论上的答案。实际上,计算从点到原点的距离可能是非常昂贵的计算,它涉及平方根,在矩形检查中进行四点比较可能更快。再次,如果内存服务器我,我们真的不关心与原点的距离是什么只有它大于半径。因此,仅部分执行距离计算,省略最终的平方根,并与半径的平方进行比较。当然你仍然需要进行实验和剖析以确保这个边界圆检查比仅仅在矩形检查和中执行常规点更快,你需要确保你有足够的未命中来抵消命中的命中你最终会做边界圆和矩形检查。
答案 1 :(得分:1)
您需要使用空间索引快速查找鼠标所在的矩形。我建议使用R树,这是理论部分:
http://en.wikipedia.org/wiki/R-tree
和c#,实现:
http://sourceforge.net/projects/cspatialindexrt/
创建一个rtee,添加矩形,然后使用鼠标坐标调用rtree.nearest方法,以了解包含鼠标光标的矩形。您可以使用距离参数。
希望它有所帮助,
Anben Panglose。
答案 2 :(得分:0)
我会将显示区域划分为象限。 然后将矩形放入左上角,右上角,左下角,右下角的网格中。 放置它们意味着,为每个象限创建一个列表并将矩形放入其中。
单击该点后,确定它属于哪个季度并仅搜索这些矩形。此方法可将线性搜索减少4倍。
请记住,您还需要处理点可以属于许多矩形的重叠点。这里矩形的z顺序很重要。因此,虽然列表是为象限维护的,但它应该以它的z顺序作为键进行排序。
希望这有帮助。
答案 3 :(得分:0)
可能是这样的吗?
public bool isRectangelContainPoint(RectangleF rec, PointF pt)
{
if (pt.X >= rec.Left && pt.X <= rec.Right && pt.Y <= rec.Bottom && pt.Y >= rec.Top)
return true;
else
return false;
}