【发布时间】:2016-09-11 09:01:46
【问题描述】:
上下文:我正在为 Spigot(Minecraft 服务器插件)开发一个插件。
我想为多种目的定义几个区域。我将它们存储在这样的配置文件中(YAML):
Regions
Region1:
P1:
X: 0
Y: 0
Z: 0
P2:
X: 1
Y: 1
Z: 1
Region2:
P1:
X: -1
Y: -1
Z: -1
P2:
X: 2
Y: 2
Z: 2
如您所见,我正在存储具有 2 个相反坐标的区域。
我试图提出一种算法,它可以将包含给定坐标的所有区域存储在数组中。
例如,(0,0,0) => [Region1, Region2] 和 (2,2,2) => [Region1]
我现在正在做的是:
- 用所有区域填充数组
- 检查 X 坐标是否在定义区域的 2 个 X 坐标之间
- 如果不是,则从阵列中删除该区域。如果为真,则转到 2。检查 Z 坐标,然后检查 Y。
此解决方案似乎适用于少数地区(不超过 20 个),但由于这将用于每秒可触发多次的事件,因此我希望能够使用更好的解决方案来做到这一点,它可以处理更多区域并更快完成。
我查看了Data structures that can map a range of values to a key?,但是我的区域可以重叠,所以我不能这样使用。
你有什么想法吗?
我不想使用 Worldedit / Worldguard API,但“通用”Java API 很好。
【问题讨论】:
-
kd-tree 可能是一个不错的选择。查看this SO question
-
@NicoSchertler 您如何将它用于重叠区域?
-
@ValentinLorentz 与您将它用于任何类型的扩展对象的方式相同。如果平面与其相交,则拆分它们或将该区域放在两个子树中。
-
我找到了解决方案:我使用了 R-Trees。我要写一个答案。
标签: java algorithm data-structures 3d