查找包含点的矩形



在Java SE 7中,我试图解决我有一系列矩形的问题。通过一些用户互动,我得到了一个点。我需要做的是找到包含点(如果有的话)的(第一个)矩形。

目前,我是通过非常幼稚的解决方案来做到这一点的,该解决方案只是将矩形存储在 ArrayList 中,并通过迭代列表并使用 contains() 来搜索包含的矩形。问题是,因为这需要对用户进行交互,所以即使对于相对较少的矩形(例如,200),这种技术也开始太慢了。

我当前的代码如下所示:

// Given rects is an ArrayList<Rectangle>, and p is a Point:
for(Rectangle r : rects)
{
    if(r.contains(p))
    {
        return r;
    }
}
return null;

有没有更聪明的方法来解决这个问题(即,用 O(log n) 代替 O(n),和/或通过尽早消除明显不好的候选者来减少对contains()的调用)?

是的,有。构建 2 个区间树,它会告诉您 x1 到 x2 之间以及 y1 和 y2 之间是否有一个矩形。然后,当您拥有该点的坐标时,在两棵树中执行 O(log n) 搜索。

这会告诉您兴趣点周围是否有矩形。您仍然需要检查两棵树是否给出了一个公共矩形。

最新更新