Java 查找包含点的矩形

Java 查找包含点的矩形,java,java-2d,Java,Java 2d,在JavaSE7中,我试图解决一个有一系列矩形的问题。通过一些用户交互,我得到了一个要点。我需要做的是找到包含点(如果有的话)的(第一个)矩形 目前,我正通过naieve解决方案来实现这一点,该解决方案只是将矩形存储在ArrayList中,并通过迭代列表和使用contains()来搜索包含矩形。问题是,因为这需要用户交互,所以即使是相对较少的矩形(比如200个),这项技术也开始太慢 我当前的代码如下所示: // Given rects is an ArrayList<Rectangle&g

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

目前,我正通过naieve解决方案来实现这一点,该解决方案只是将矩形存储在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;
//给定的rects是一个ArrayList,p是一个点:
用于(矩形r:矩形)
{
如果(r.包含(p))
{
返回r;
}
}
返回null;
有没有更聪明的方法来解决这个问题(即,用O(logn)代替O(n),和/或通过尽早消除明显不好的候选项来减少对
contains()
的调用)?

是的,有。构建2,它将告诉您x1到x2之间以及y1到y2之间是否存在矩形。然后,在获得点的坐标后,在两棵树中执行O(logn)搜索


这会告诉你在兴趣点周围是否有矩形。您仍然需要检查这两棵树是否有一个共同的矩形。

维基百科文章提到了几种将标准间隔树扩展到二维的方法。这对我的问题应该很有效。然而,问题是,是否有一个现有的Java实现?本文本身就有一个Java实现。还可以阅读Java实现之后的部分,了解如何使用相同的代码构建二维树。就我个人而言,我觉得这太复杂了,尽量保持简单。下面是一个完整的插入、删除和搜索实现:
问题是,因为这需要用户交互,所以这项技术开始太慢,即使是相对较少的矩形(比如,200个).
该代码肯定还有其他问题。迭代200个矩形不会花费任何时间。你是对的。一个简单的配置文件显示,这甚至不接近我处理鼠标点击的大部分时间(在我相当普通的笔记本电脑上大约需要8毫秒)。不过,从更一般的意义上讲,我仍然对这个问题感到好奇。