查找网格中的下一个位置

时间:2017-10-02 19:19:55

标签: java algorithm

我正在创建一种方法来帮助我找到3d世界中岛屿/物体网格中的下一个位置(但现在忽略Y坐标),每个岛屿的距离为200(岛距)。 / p>

我现在拥有的是:

public static Location findLocation(String latest,String server) {
    if (latest == null) {
        latest = sql.findLatestIslandEntry(server);
        if (latest != null && latest.isEmpty()) // first creation
            latest = "0,4,0";
        else if (latest == null)
            return null;
    }
    String split[] = latest.split(",");
    List<String> locationString = Arrays.asList(split);
    List<Double> locations = new ArrayList<>();
    for (String xyz : locationString) {
        locations.add(Double.valueOf(xyz));
    }

    String world = CC.getSTDConfig().getString("worldname");
    Location l = new Location(Bukkit.getWorld(world),0,4,0);
    if (locations.get(0) <= 0) {
        l.setX(Math.abs(locations.get(0)) + islandDistance);
    } else {
        l.setX(0 - locations.get(0));
    }
    if (locations.get(2) <= 0) {
        l.setZ(Math.abs(locations.get(2)) + islandDistance);
    } else {
        l.setZ(0 - locations.get(2));
    }
    return l;
}

即使在测试之前,我也可以看到这不起作用。我会结束总是添加到x和z时,这并不总是我想要的。我在这里输出了我想要的数据集示例:picture

基本上我想要的是获取下一个位置取决于我已插入的数量,也许最后一个插入?这就是我目前至少在我的代码中使用的信息。假设我刚刚插入25号岛屿,现在想要岛屿26我应该得到结果0,600(顺序可以不同我只想填满网格)

1 个答案:

答案 0 :(得分:0)

您想要生成按欧几里德距离排序的整数坐标。为了减少计算,在第一个八分圆中产生坐标就足够了(对于2d情况),因此X和Y是非负的并且Y <= X.对于每个计算的(X,Y)对,只需生成(X,-Y), (-X,Y), (-X,-Y),(Y,X),(Y,-X), (-Y,X), (-Y,-X)(零组件除外)。

创建优先级队列,其中比较键是平方和(平方距离X*X+Y*Y)。按(0,0)项。在每个步骤中提取最小项(MX, MY)并推送下一个点

Output MX, MY and all permutations
if (MY = 0) and (MX < SomeBorderValue)
     push (MX+1, 0) 
if MY < MX 
     push (MX, MY+1)