2点間の距離を展開して取り得る終点座標リストを返す関数
2012年2月5日
距離=2 を [0,2],[0,-2],[1,1][-1,1]・・・[-2,0]へ変換
xy座標体系内で、中心 [0, 0] からの距離を展開して
取り得る終点座標リストを返すアルゴリズムです
取り得る終点座標リストを返すアルゴリズムです
例えば
距離=0 なら [0, 0] だけの1点
距離=1 なら [0, 1], [0, -1], [1, 0], [-1, 0] の4点
距離=2 なら 8点
距離=3 なら 12点
・・・という具合です。
以下、JavaScriptコード
/** 距離を展開して、始点を [0,0] とした場合の
取り得る終点の相対座標リストを返す */
var distanceToPoints = function(distance){
var absPoints = [];
var i;
// ex) 距離 2 => [[0,2], [1,1], [2,0]]
for (i = 0; i <= distance; i++) {
absPoints.push([i, distance - i]);
}
var points = [];
// ex) [[0,2], [1,1], [2,0]]
// => [[0,2], [0,-2], [1,1], [-1,1], [1,-1], [-1,-1], [2,0], [-2,0]]
var j, x, y;
for (j = 0; j < absPoints.length; j++) {
x = absPoints[j][0];
y = absPoints[j][1];
if (x === 0 && y === 0) {
points.push([x, y]);
continue;
}
if (x === 0) {
points.push([x, y], [x, -y]);
continue;
}
if (y === 0) {
points.push([x, y], [-x, y]);
continue;
}
points.push([x, y], [-x, y], [x, -y], [-x, -y]);
continue;
}
return points;
}
動作確認
distanceToPoints(1) >>> [[0, 1], [0, -1], [1, 0], [-1, 0]] distanceToPoints(2) >>> [[0, 2], [0, -2], [1, 1], [-1, 1], [1, -1], [-1, -1], [2, 0], [-2, 0]]
で、本題
ベッタベタのかっきかきであんまり美しくないので
一発で出せるような数式はありませんか?
一発で出せるような数式はありませんか?
ちなみに
逆は簡単
/** 2点座標間の距離を計算する */
var pointsToDistance = function(a, b){
return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
}