Как я могу рассчитать расстояние между двумя точками в декартовом пространстве, соблюдая стиль астероидов? - PullRequest
3 голосов
/ 09 февраля 2011

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

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

1 Ответ

9 голосов
/ 09 февраля 2011

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

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, сравните и вычтите.

...