从点阵列中对相同y的相邻点进行分组

时间:2016-03-13 07:36:28

标签: javascript arrays coordinates

如果你有一个点数组,如([[y,x]])

var result = [[0, 0, 2], [2, 3, 5]]

使用相同的Y对相邻点进行分组的最佳或可接受的方法是什么?这样你最终可能得到一个结果,如([[y,x1,x2]])

function generateSelectionDimensions (els) {
    var groups = [];
    var cur = null;

    //may not be in order so we sort
    els = els.sort(function(a,b) {
        if( a[0] == b[0]) return a[1] - b[1];
        return a[0] - b[0];
    });

    for (var i = 0; i < els.length; i++) {
        var y = els[i][0];
        var x = els[i][1];

        if(!!els[i - 1]) {
            var prevY = els[i - 1][0];
            var prevX = els[i - 1][1];
        }

        var neighbor = !!els[i - 1] ? prevY === y 
            && (prevX - x === 1 || x - prevX === 1) : false;

        if(!neighbor) {
            if(cur) groups.push(cur);
            cur = {y: y, x1: x, x2: 0};
        } else {
            cur.x2 = x;
            if(els.length - 1 === i) groups.push(cur);
        }
    }

    return groups;
}

这是我的尝试:

{{1}}

2 个答案:

答案 0 :(得分:1)

两个步骤:

  • 按第一个坐标排序,然后按第二个
  • 排序
  • 对于(已排序)数组中的每个元素:如果它适合最后一个范围,请将其添加到范围中,否则创建一个新范围。

var arr = [[2, 6], [0, 0], [0, 1], [0, 2], [2, 3], [2, 4], [2, 5], [0, 8], [0, 9]]
var res = [];

arr.sort(function (a, b) {

    return a[0] - b[0] || a[1] - b[1];

}).forEach(function (a) {

    if (res.length > 0) {
        var last = res[res.length - 1];

        if (last[0] === a[0] && last[2] === a[1] - 1) {
            last[2]++;
            return;
        }
    }

    res.push([a[0], a[1], a[1]]);

});

document.write('<pre>'+JSON.stringify(res));

答案 1 :(得分:0)

我建议您使用与此类似的算法,它比您的尝试简单得多:

  1. 生成一个包含所有唯一mspaint.exe和另一个数组y values的数组,这是出现的次数
  2. 现在您知道您将拥有多少个群组(唯一sizes的数量)以及它们的大小(y values中的值)
  3. 循环显示初始点,并将sizes添加到关联组中x value