上下文:我正在爲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與使用它的任何類型的擴展對象相同的方式。如果平面與其相交,則將它們分開或將區域放在兩個子樹中。 –