3

空間内の 2 つのエンティティの位置を表す2 つの点 (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 座標のロールオーバー動作と、補数法で基数の補数表現を使用して表される符号付き整数のロールオーバー動作の間に対応があります。

座標の境界が、言語でサポートされている 2 進整数型の境界に正確にマップされている場合、減算を直接実行し、オーバーフローを無視して結果を符号付きとして再解釈するだけで、ほぼすべての現在のマシンで使用されている 2 の補数表現を利用できます。元の座標と同じサイズの値。一般的なケースでは、それほど幸運ではないため、上記のabs、比較、減算を使用したダンスが必要です。

于 2011-02-09T02:17:13.070 に答える