从3D Graph获取对象的最有效方法

时间:2015-01-14 21:03:55

标签: java data-structures

所以,我正在制作游戏,我遇到了问题。我需要一些方法来有效地获取位于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;
        }
    }
}

这是我的搜索方法。如您所见,我使用列表存储所有切片,并搜索符合条件的切片。有没有其他方法可以尽快用很多瓷砖做到这一点?

2 个答案:

答案 0 :(得分:0)

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

让我给你一个代码视图。要构建区域地图:

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

添加项目时:

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

然后当您在某个位置搜索某个项目时:

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

这肯定有开销,但搜索你的地区是否足够小是非常快的。

这是专为3D空间设计的,但可以根据需要扩展到任意数量的维度:它只是RegionLocation类的实现。

答案 1 :(得分:0)

我不完全确定我已经理解了你的问题,但它似乎与3D空间中的碰撞检测算法非常相似。如果是这种情况,Octrees可能就是您所寻找的:http://www.codeproject.com/Articles/108761/Octrees