我有一个空间:
[.][.][.][.][.]
[.][.][.][.][.]
[.][.][x][.][.]
[.][.][.][.][.]
[.][.][.][.][.]
每个[.]
代表2D空间中的一个点。 (需要它用于3D,但现在无关紧要)
通过[x]
我标记了“当前位置”(让我们说它是[0,0,0])
所以我需要找到最近“不忙”的位置。
例如,如果我有这样的区域:
[.][.][.][.][.]
[.][b][b][b][.]
[.][b][x][.][.]
[.][b][b][b][.]
[.][.][.][.][.]
([b]
表示“忙”)
然后我需要得到一个结果(x:0,y:1,z:0)(因为它是最接近的一个是免费的)。
现在想要做这样的事情:
current_location = {x: 0, y: 0, z: 0}
radius = 0
closest_record = nil
begin
radius = radius + 1
# some way to iterate over each [x, y, z] spot within that radius until
# closest_record = Record.where(x: x1, y: y1, z: z1).first returns nil (meaning it's free)
end until record.present?
# (that's Ruby syntax, but doesn't matter really)
是否有一些公式可以做到这一点?
答案 0 :(得分:0)
你在问距离公式吗?不确定我理解这个问题,但坐标(x1,y1,z1)和(x2,y2,z2)的两点之间的距离是:
距离= sqrt((x1-x2)^ 2 +(y1-y2)^ 2 +(z1-z2)^ 2)
答案 1 :(得分:0)
我不熟悉Ruby,但在C ++中,你可能会这样做:
for(int x=(radius*-1); x<=radius; ++x) {
for(int y=(radius*-1); y<=radius; ++y) {
for(int z=(radius*-1); z<=radius; ++z) {
if(x==0 && y==0 && z==0) {
continue;
} else {
//check location[x,y,z];
}
}
}
}