所以我试图解决问题。我有一个可以成为玩家的观点,我周围有几个物体,有些物体更远,有些物体靠近呃。我想排除所有更远的点,例如包括更近的距离。如何聚类或过滤对象。我正在考虑空间分区。对象位于地理坐标中。对象的数量可以是10.000
答案 0 :(得分:0)
如果允许每个点移动,对于kd树或类似的自适应结构,更新可能会变得昂贵。我想我会采用静态分区方法,例如将空间划分为一组单元格(二次或矩形),并为每个单元格存储对包含点的引用以及包含的点集合的最大和最小坐标。当点移动时,您可以轻松计算它们所处的当前单元格。当涉及距离计算时,您只需确定相关单元格,然后用线性时间计算到其包含点的距离。
我认为这种方法有三个基本优势:
通过查看每个单元格的当前包含的最小和最大坐标,您可以轻松确定其是否为空,如果不是,则整个包含点的集合是否与您的玩家的当前位置相关
您可以在树形结构(例如四叉树)中组织静态单元格,并实现完美平衡。对于树的每个内部节点,您可以存储和更新其子节点的组合最小和最大坐标。请注意,更新非常便宜,因为树的结构完全不受影响。
您不需要对点进行排序(因为它对于其他结构或特定实现是必要的)。如果对象快速移动,这可以为您节省很多性能。
构建和维护数据结构非常简单。您不必通过异国情调的测试案例和复杂的结构更新来破坏您的大脑。
当然,选择非自适应数据结构有一些缺点,因为它是非自适应的。例如,您高度依赖于网格单元'尺寸。如果你选择它太小(最坏的情况:每个单元一个点),树的深度膨胀并且遍历变得昂贵。另一方面,如果你选择它太大(最坏的情况:在某些时候,所有点都在同一个单元格中),你将执行许多不需要的且可能很昂贵的距离计算。
总而言之,它实际上取决于您拥有的数据类型。我给你的建议应该给出相当好的结果,但可能有更有效的方法。如果你有足够的时间,实现自适应和静态分区方法,提出一些有代表性的测试并相互比较。
希望这会有所帮助;)