我正在创建一种方法来帮助我找到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时,这并不总是我想要的。我在这里输出了我想要的数据集示例:
基本上我想要的是获取下一个位置取决于我已插入的数量,也许最后一个插入?这就是我目前至少在我的代码中使用的信息。假设我刚刚插入25号岛屿,现在想要岛屿26我应该得到结果0,600(顺序可以不同我只想填满网格)
答案 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)