Как я могу рассчитать расстояние между двумя точками в декартовом пространстве, соблюдая стиль обтекания астероидов?

У меня есть две точки (x1, y1) и (x2,y2), которые представляют расположение двух сущностей в моем пространстве. Я вычисляю евклидово расстояние между ними по теореме Пифагора, и все замечательно. Однако, если мое пространство становится конечным, я хочу определить новое кратчайшее расстояние между точками, которые «оборачивают» швы карты. Например, если у меня есть точка A как (10, 10) и точка B как (90,10), а моя карта имеет ширину 100 единиц, я хотел бы рассчитать расстояние между A и B как 20 (от правого края карты и обратно в левый край) вместо 80, что является нормальным евклидовым расстоянием.

Я думаю, моя проблема в том, что я использую систему координат, которая не совсем подходит для того, что я пытаюсь сделать, и что на самом деле моя плоская квадратная карта больше похожа на бесшовную форму пончика. Любые предложения о том, как реализовать систему такого рода и конвертировать туда и обратно из декартовых координат, также будут оценены!


person hornairs    schedule 09.02.2011    source источник


Ответы (1)


Тороидальная плоскость? Хорошо, я укушу.

var raw_dx = Math.abs(x2 - x1);
var raw_dy = Math.abs(y2 - y1);

var dx = (raw_dx < (xmax / 2)) ? raw_dx : xmax - raw_dx;
var dy = (raw_dy < (ymax / 2)) ? raw_dy : ymax - raw_dy;

var l2dist = Math.sqrt((dx * dx) + (dy * dy));

Здесь есть соответствие между поведением при переносе ваших координат x и y и поведением при переносе целых чисел со знаком, представленных с использованием представления дополнения основания в метод дополнений.

Если границы ваших координат точно совпадают с границами двоичного целочисленного типа, поддерживаемого вашим языком, вы можете воспользоваться преимуществом представления с дополнением до двух, используемым почти всеми современными машинами, просто выполняя вычитание напрямую, игнорируя переполнение и переинтерпретируя результат как знаковый. значение того же размера, что и исходная координата. В общем случае вам так не повезет, поэтому приведенный выше танец с abs, сравнением и вычитанием обязателен.

person Jeffrey Hantin    schedule 09.02.2011
comment
Ничего себе, намного проще, чем я думал, и никаких долгих вычислений! Огромное спасибо. - person hornairs; 09.02.2011