2013-11-11 6 views
0

У меня есть пространство:Как получить координаты ближайшего свободного места?

[.][.][.][.][.] 
[.][.][.][.][.] 
[.][.][x][.][.] 
[.][.][.][.][.] 
[.][.][.][.][.] 

Каждый [.] представляет собой место в 2D-пространстве. (Это нужно для 3D, но не имеет значения, на данный момент)
По [x] Я пометил «текущее местоположение» (скажем, это [0, 0, 0])

Так что мне нужно, чтобы найти то, что позиция ближайшего «не занятого» места.

Например, если у меня была такая площадь:

[.][.][.][.][.] 
[.][b][b][b][.] 
[.][b][x][.][.] 
[.][b][b][b][.] 
[.][.][.][.][.] 

([b] для "занят")

Тогда я должен был бы получить результат (х: 0, у: 1, г: 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

Я не знаком с 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]; 
      } 
     } 
    } 
} 
+0

вот что я думал .. –

+0

В качестве примечания, это будет проверять каждое пятно в радиусе, и оно начнется в углу. Таким образом, вы можете получить угловой результат, когда сторона может быть ближе (в зависимости от того, как вы измеряете расстояние ... каждый элемент с заданным радиусом на одинаковом расстоянии?). Более того, если вы проверите «radius = 1» и ничего не найдете, увеличивая «радиус» до «2» и используя эту структуру, проверите все в «radius = 1», которое уже было проверено. Вам придется добавить дополнительную логику, чтобы пропустить эти проверки или потенциально тратить много времени. – nhgrif

+0

да, вот что я делаю, спасибо –

0

Вы запрашиваете формулу расстояния? Не уверен, что я понимаю вопрос, но расстояние между двумя точками с координатами (x1, y1, z1) и (x2, y2, z2) равно:

distance = sqrt ((x1-x2)^2 + (y1 у2)^2 + (z1-z2)^2)

Смежные вопросы