上下文:我正在为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树可能是个不错的选择。看看[这个SO问题](http://stackoverflow.com/questions/15827012/multi-dimensional-segment-trees) –
@NicoSchertler你将如何使用它重叠区域? –
@ValentinLorentz与使用它的任何类型的扩展对象相同的方式。如果平面与其相交,则将它们分开或将区域放在两个子树中。 –