Если у вас есть список объектов
Если бы у вас были все позиции всех объектов в списке, это было бы намного проще, поскольку вам не нужно было бы искать все пустые квадраты и можно было бы выполнить 2D-расчеты расстояний , чтобы определить ближайший к тебе Просмотрите список объектов и рассчитайте расстояние следующим образом:
Define your two points. Point 1 at (x1, y1) and Point 2 at (x2, y2).
xd = x2-x1
yd = y2-y1
Distance = SquareRoot(xd*xd + yd*yd)
Затем просто выберите тот, у которого кратчайшее расстояние.
Если у вас есть только двумерный массив
Если, однако, описанная проблема предполагает использование двумерного массива, в котором местоположения объектов не могут быть перечислены без предварительного поиска всех из них, то вам придется выполнить спиральный цикл.
Поиск ' Спиральный метод поиска ' дает несколько интересных ссылок. Вот некоторый код, который делает спиральный цикл вокруг массива, однако он не работает от произвольной точки и спирали наружу, но должен дать вам хорошие идеи о том, как достичь того, чего вы хотите.
Вот аналогичный вопрос о заполнении значений в спиральном порядке в двумерном массиве.
В любом случае, вот как я бы решил эту проблему:
Для заданной точки P
создайте векторную пару, которая задает область вокруг P
.
Так что если P = 4,4
Тогда ваша векторная пара будет 3,3|5,5
Зацикливать каждое значение в этих границах.
for x = 3 to 5
for y = 3 to 5
check(x,y)
next
next
Если значение найдено, выйдите. Если нет, увеличьте границы еще раз. Так что в этом случае мы бы пошли к 2,2 | 6,6
При циклическом проверке значений убедитесь, что мы не вошли в отрицательные индексы, а также убедитесь, что мы не превысили размер массива.
Также, если вы расширяете границы n раз, вам нужно только зациклить внешние граничные значения, вам не нужно перепроверять внутренние значения.
Какой метод быстрее?
Все зависит от:
- плотность вашего массива
- Техника распространения
- Количество объектов
Плотность массива
Если у вас есть массив 500x500 с двумя объектами в нем, то цикл по списку всегда будет быстрее, чем по спирали
Техника распространения
Если существуют схемы распределения (т.е. объекты стремятся сгруппироваться вокруг друг друга), то спираль может работать быстрее.
Количество объектов
Спираль, вероятно, будет работать быстрее, если есть миллион объектов, поскольку техника списка требует, чтобы вы проверяли и вычисляли каждое расстояние.
Вы должны быть в состоянии рассчитать самое быстрое решение, вычислив вероятность заполнения пространства по сравнению с тем фактом, что решение со списком должно каждый раз проверять каждый объект.
Однако, используя технику списка, вы можете выполнить некоторую интеллектуальную сортировку для повышения производительности. Наверное, стоит посмотреть.