3

我有两个点 (x 1 , y 1 ) 和 (x 2 ,y 2 ) 代表我空间中两个实体的位置。我使用毕达哥拉斯定理计算它们之间的欧几里得距离,一切都很好。但是,如果我的空间变得有限,我想在“环绕”地图接缝的点之间定义一个新的最短距离。例如,如果我有点 A(10, 10)和点 B (90,10),并且我的地图是 100 单位宽,我想计算 A 和 B 之间的距离为 20(在地图的右边缘之外并回到左边缘),而不是 80,这是正常的欧几里得距离。

我认为我的问题是我使用的坐标系不太适合我正在尝试做的事情,而且我的平面方形地图实际上更像是一个无缝的甜甜圈形状。任何关于如何实现这种性质的系统并从笛卡尔坐标来回转换的建议也将不胜感激!

4

1 回答 1

9

环形平面?好吧,我会咬的。

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、 比较和减法共舞是必需的。

于 2011-02-09T02:17:13.070 回答