У меня есть список координат, которые нужно сортировать по спиральному алгоритму. Мне нужно начинать посередине области и "прикасаться" к любой координате.
Для упрощения это представление (unsorted) списка координат (x, y, отмеченных "точкой" на следующем изображении).
Список координат CSV доступен здесь.
X увеличить слева направо
Y увеличивается с TOP до BOTTOM
Каждая координата не смежна с следующей, но вместо этого распределяется 1 или 2 кубиками (или более в определенном случае).
Начиная с центра области, мне нужно коснуться любой координаты спиральным движением:
для разбора каждой координаты Я разработал этот алгоритм PHP:
//$missing is an associative array having as key the coordinate "x,y" to be touched
$direction = 'top';
$distance = 1;
$next = '128,127'; //starting coordinate
$sequence = array(
$next;
)
unset($missing[$next]);
reset($missing);
$loopcount = 0;
while ($missing) {
for ($loop = 1; $loop <= 2; $loop++) {
for ($d = 1; $d <= $distance; $d++) {
list($x,$y) = explode(",", $next);
if ($direction == 'top') $next = ($x) . "," . ($y - 1);
elseif ($direction == 'right') $next = ($x + 1) . "," . ($y);
elseif ($direction == 'bottom') $next = ($x) . "," . ($y + 1);
elseif ($direction == 'left') $next = ($x - 1) . "," . ($y);
if ($missing[$next]) {
unset($missing[$next]); //missing is reduced every time that I pass over a coordinate to be touched
$sequence[] = $next;
}
}
if ($direction == 'top') $direction = 'right';
elseif ($direction == 'right') $direction = 'bottom';
elseif ($direction == 'bottom') $direction = 'left';
elseif ($direction == 'left') $direction = 'top';
}
$distance++;
}
но поскольку координаты не равноудалены друг от друга, я получаю этот вывод:
Как ясно видно, движение в середине правильное, тогда как, соответственно, с координатным положением, в определенный момент скачок между каждой координатой больше не когерентен.
Как я могу изменить свой код, чтобы получить такой подход, как этот?
Чтобы упростить/уменьшить проблему.. Представьте, что точки на показанном выше изображении являются городами, которые продавец должен посетить cirurarly. Начиная с "города" в центре области, следующие города, которые нужно посетить, расположены вблизи начальной точки и расположены на севере, востоке, юго-востоке и западе от начальной точки. Продавец не может посещать какой-либо другой город, если не были посещены все прилегающие города в районе начальной точки. Все города должны посещаться только один раз.