非重叠矩形中命中测试的算法

时间:2008-09-18 22:46:18

标签: .net geometry

我有一组非重叠的矩形,它们覆盖了一个封闭的矩形。找到鼠标单击的包含矩形的最佳方法是什么?

显而易见的答案是拥有一个矩形数组并按顺序搜索它们,使搜索O(n)。有没有办法按位置排序,以便算法小于O(n),比如O(log n)或O(sqrt(n))?

4 个答案:

答案 0 :(得分:6)

您可以在四元组或kd树中组织矩形。这给你O(log n)。这是主流方法。

这个问题的另一个有趣的数据结构是R树。如果你必须处理很多矩形,这些可以非常有效。

http://en.wikipedia.org/wiki/R-tree

然后有O(1)方法简单地生成与屏幕大小相同的位图,用“无矩形”的占位符填充它,并将命中矩形索引绘制到该位图中。查找变得如此简单:

  int id = bitmap_getpixel (mouse.x, mouse.y)
  if (id != -1)
  {
    hit_rectange (id);
  }
  else
  {
    no_hit();
  }

显然,如果您的矩形不经常更改,并且您可以为位图节省内存,那么该方法才能正常工作。

答案 1 :(得分:1)

创建一个间隔树。查询间隔树。请参阅麻省理工学院出版社的“算法”。

间隔树最好实现为红黑树。

请记住,如果你要点击它们,那么通常只需要对你的位置进行排序,通常会改变它们的位置。

您必须记住,您已经构建了不同轴的索引。例如,你必须看看你是否重叠X和Y上的间隔。一个明显的优化是只检查X间隔的重叠,然后立即检查Y上的重叠。

此外,大多数股票或'classbook'间隔树只检查一个间隔,并且只返回一个间隔(但你说“非重叠”不是吗?)

答案 2 :(得分:0)

将它们推到quadtree

答案 3 :(得分:0)

使用BSP树来存储矩形。