1

我正在创建一个应用程序,我需要使用 java 建模(并显示)大量二维“球”(圆圈)。我首先创建了一个ArrayList对象Circle(我定义的一个类,它具有圆心的 x/y 像素坐标、半径、颜色和 x 和 y 方向的速度)。我使用java.util.Timer一个重复的对象TimerTask来控制圆圈的运动。圆圈的大小从大约 10-50 像素半径不等。

我想要发生的是让球从屏幕顶部落下(随机分布在 x 轴上)直到它们到达屏幕底部,这就像地板一样 - 到达它的球停止移动,而球到达停止的球在其他球上滚下山,直到它们停留在低/平坦点。将来我可能想让他们的行为更复杂一些,所以我想创建灵活的代码,以便我可以轻松扩展。现在它的工作原理是每个时间段每个圈子都会检查它们与其他圈子的距离。如果附近没有其他圆圈,它们会继续正常下降。如果两个(或更多)圆圈彼此靠近,则有代码来确定它们将如何交互。

我让它完美地适用于少量圆圈(< 200),但是当我得到大量圆圈(> 400)时,它开始显着减慢。我确信我可以优化一些逻辑以使比较更快一些,但我想知道除了无组织之外是否有任何方法可以将圆存储在某种结构中ArrayList这会让我很容易找到彼此靠近的圆圈,所以我不必做 N^2 操作来比较每个圆圈,而只需将一个圆圈与最接近的 5-10 个圆圈进行比较给它。例如,我考虑使用 2D 数组来表示每个像素(或者可能是 5x5 像素的正方形)并在其中心所在的位置存储一个圆圈(这样我就可以检查附近的任何单元格中是否有圆圈,并忽略休息)。但是,这似乎仍然非常低效,就好像我正在使用 800x1000 像素画布和 500 个圆圈一样,在二维数组中会有大量空白空间,我会浪费时间检查。我也考虑过某种哈希图,但我也没有想到使用它的好方法。

那么,谁能想到一种有效的方法来存储这些圆圈,这些圆圈对应于它在 2d 空间中的位置,并且可以很容易地找到附近的圆圈?提前致谢!

4

2 回答 2

1

您可以使用四叉树来查找近邻。或者您可以简单地按一个方向排序,这将更容易实现,并且仍应允许您将候选邻居的数量减少到一个小窗口。

于 2012-07-26T22:06:36.040 回答
1

也许您对 2D 数组的想法并没有那么疯狂。我认为您想要的是所有圈子的一个列表,以及一个也可以引用这些圈子的二维数组。所以每次,你都可以遍历你的List<Circle>来检查每一个。每个 Circle 都有 x,y 坐标,您只需在数组上循环 (x,y +/- 5)。无需检查 Circles 的整个可能空间,因为您已经在跟踪每个 Circle 的中心。只需抓住中心,然后检查它周围的其他圆圈。

于 2012-07-26T22:14:35.410 回答