0

配列の作成に少し混乱しています。x:y座標とその寸法(グリッドサイズ)のアイテムのリストがあります...例:

x: 1
y: 7
width: 2 tiles
height: 2 tiles

したがって、私がやろうとしているアイデアは、「占有」されているx:yグリッドの配列を作成することです。しかし、そのようなデータをループして、占有されているタイルが存在するようにします。

x: 1
y: 7
//
x: 2
y: 7
//
x: 1
y: 8
//
x: 2
y: 8

上記の例では、アイテムは2 x 2タイル(正方形)であるためです。

私のオブジェクトは次のように構成されています(console.log(sdata);に表示されます)。

7: Array[4]
0: "1"
1: "7"
2: "2"
3: "2"

そうですね、この種のグリッド参照を格納する配列を作成しようとしています。取得しようとしていることを説明したと思いますが、配列を作成するためのループを構成する方法を理解できません。

4

3 に答える 3

1

結果のoutputArray配列は、形式のオブジェクトのコレクションです{ x: value, y: value}

var inputArray = [ [1,7,2,2], ... ];
var outputArray = [];
for(var i = 0; i < inputArray.length; i++) {
    var item = {
      x: inputArray[i][0],
      y: inputArray[i][1],
      width: inputArray[i][2],
      height: inputArray[i][3]
    };
    for(var xx = 0; xx < item.width; xx++) {
        for(var yy = 0; yy < item.height; yy++) {        
            outputArray.push({
                x: item.x + xx,
                y: item.y + yy
            });
        }
    }
}

、、、および属性を追加してx、わかりやすくしました。ywidthheight

于 2012-04-03T20:29:20.203 に答える
1

http://jsfiddle.net/rlemon/JeeV2/これは、このタイプの「グリッド」占有データを生成する方法の例です。

var chords = [ // instead of arrays we'll use objects.. they're nicer. 
    {
    x: 1,
    y: 7,
    h: 2, // height
    w: 2}, // width
{ // ohh look a second plot point.
    x: 4,
    y: 1,
    h: 3,
    w: 2},
];

var occupied = { // will be your cells points occupied
    x: [],
    y: []    
};
chords.forEach(function(chord) { // now lets loop the chords and produce the occupied array
    occupied.x.push( chord.x );
    occupied.x.push( chord.x + (chord.w-1) ); // expand the width of the cell - initial point
    occupied.y.push( chord.y );
    occupied.y.push( chord.y + (chord.h-1) ); // expand the height of the cell - initial point
});
console.log( occupied );
// outputs
​Object
    x: Array[4]
        0: 1
        1: 2
        2: 4
        3: 5

    y: Array[4]
        0: 7
        1: 8
        2: 1
        3: 3
于 2012-04-03T20:41:11.400 に答える
0
function range(a, b) {
    /*
        range(5) -> [0,1,2,3,4]
        range(1,4) -> [1,2,3]
    */
    if (b===undefined)
        var start=0, stop=a;
    else
        var start=a, stop=b;

    var R = [];
    for(var i=start; i<stop; i++)
        R.push(i);
    return R;
}

次に、それは2つのライナーです。

range(x, x+width).map(function(x) {
    return range(y, y+height).map(function(y) {
        return {x:x, y:y}; // anything you'd like
    })
})

結果(JSON.stringifyを介して取得):

[
    [ {"x":1,"y":7}, {"x":1,"y":8} ],
    [ {"x":2,"y":7}, {"x":2,"y":8} ]
]
于 2012-04-03T20:31:30.470 に答える