我正在创建一个应用程序,我需要使用 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 空间中的位置,并且可以很容易地找到附近的圆圈?提前致谢!