2015-01-14 35 views
0

所以,我正在制作一款游戏,并且遇到了问题。我需要一些方法来高效地获取位于3D图形中的对象。从3D图形获取对象的最有效方式

但问题是,他们都可以涵盖多个值来获得。因此,例如,值'foo'可能覆盖x范围400-500,y范围10-20和z范围30-60。

我想知道是否有更高效的方式来存储和获取这些然后通过将它们存储在一个数组中并搜索它们,我不希望这样做,因为这些值很大。

这是为选择一个游戏的生物群系。但是,我选择将此放在GameDev上,因为这似乎更像是一个数据结构问题。然而,我可能是错的,如果我真的很乐意关闭它并在那里打开它。

有没有其他方法可以做到这一点?

public static Tile getTile(int height, int moisture, int temperature) { 
    for(Tile tile : tileList){ 

     boolean isTile = true; 

     if(!(tile.heightMax > height && tile.heightMin < height)){ 
      isTile = false; 
     } 

     if(!(tile.temperatureMax > temperature && tile.temperatureMin < temperature)){ 
      isTile = false; 
     } 

     if(!(tile.moistureMax > moisture && tile.moistureMin < moisture)){ 
      isTile = false; 
     } 

     if(isTile){ 
      return tile; 
     } 
    } 
} 

这是我的搜索方法。正如你所看到的,我使用一个列表来存储所有的图块,并搜索符合条件的图块。有没有其他的方法可以尽可能快地用很多瓷砖来做到这一点?

+0

哈希表非常擅长提供对象的快速查找,但是我对数据的结构有点遗憾,真的可以说这是一个可行的解决方案。你有什么尝试? –

+0

执行不明确;当你说“只需将它们存储在数组中”时,你如何存储它们?显示如何存储值的代码片段可以帮助用户更好地回答问题。 –

+0

我试过使用数组来存储和查找。这是为地图选择生物群系,而每个生物群落具有高度,温度和湿度水平。我希望地形的生成尽可能快,所以我需要一些方法来使生物群落快速达到给定的高度,温度和湿度。如果您需要更多信息,请询问。我不擅长给你们可能需要的东西,对此感到抱歉。 – chbachman

回答

0

我过去解决过这个问题的方法是定义代表3D空间区域的区域,然后将地图存储到来自所有区域的每个对象的空间重叠区域。然后,当您想要在某个位置查找对象时,首先使用该映射查找与该位置区域重叠的所有对象,然后再遍历该对象以在该位置查找对象。

让我给你一个代码视图。要建立本地区的地图:

Map<Region, List<Item>> regionMap = new TreeMap<>(); 

当添加一个项目:

if (regionMap.containsKey(location.getRegion()) { 
    regionMap.get(location.getRegion()).stream() 
     .filter(item -> item.contains(location)) 
     .... 
} 

有一定的开销:

item.getOverlappingRegions().forEach(region -> { 
    if (!regionMap.containsKey(region)) 
     regionMap.put(region, new ArrayList<>()); 
    regionMap.get(region).add(item) 
}); 

然后,当你在一个位置搜索项目这个,但是搜索你的区域是否足够小是非常快的。

这是专为3D空间而设计的,但它可以扩展到任意多个维度:它全部用于执行RegionLocation类。

相关问题