У меня есть список координат, который нужно сортировать по спиральному алгоритму. Моя потребность - начать посередине области и «коснуться» любой координаты.Координаты (x, y) сортируются по спиральному алгоритму
Для упрощения это представление (несортированный) список координат (x, y, отмеченный «точкой» на следующем изображении).
Список координат CSV доступен here.
Х увеличение слева направо
Y увеличивается от верха до низа
Каждая координата не прилегает к следующей, но вместо того, чтобы distanciated 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. Начиная с «города» в центре области, следующие города, которые нужно посетить, расположены вблизи начальной точки и расположены на севере, востоке, юго-востоке и западе от начальной точки. Продавец не может посещать какой-либо другой город, если не были посещены все прилегающие города в районе начальной точки. Все города должны посещаться только один раз.
Кажется, что ваш csv не прав. – Bytemain
@Phpdna, что вы имеете в виду, что это неправильно? На csv координаты увеличиваются по осям x слева направо и y-оси сверху вниз (на других руках оно не совпадает с типичной декартовой системой координат, а вместо этого строится на втором квадранте). Кроме того, координата в середине области не имеет [0,0], но [128,127]. –
Как вы визуализируете свой результат? Вы уверены, что на этапе визуализации нет ошибки? И что именно вы подразумеваете под «Каждая координата не смежна со следующим, а вместо этого распределяется на 1 или 2 кубика (или больше в определенном случае)»? –