旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

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]);
}