首页 编程 正文
388

M*N网格中对每个单元格相对于不同起始点的编号算法

对于M*N的网格,有M*N个单元格,正常编号都是从左上角开始,第一个单元格为(0,0),第二个为(0,1)...第M*N个为(M-1, N-1)。那如果需要从左下角(或者右上角,或者右下角)开始编号的话,那么我们必须将正常编号映射成逻辑编号(m, n)->(m', n')。
利用矩阵运算可以很方便的实现这种映射,代码(javasript)如下:
//首先写一个简单的矩阵乘法函数,m1是2*4矩阵,m2是4*1矩阵
function mtxMultiply(m1,m2){ 
        var m=[], s;
        for(var i=0;i<m1.length;++i){
            s=0;
            for(var j=0;j<m1[i].length;++j){
                s += m1[i][j]*m2[j];
            }
            m.push(s);
        }
        return m;
 }
然后再写一个函数,根据总行数总列数以及编号起始位置得到一个变换矩阵
function getM1(M, N, O){ //M是总行数,N是总列数, O是四个顶角起始点位置
            switch(O){
                case LEFT_BOTTOM:  //左下角为起始点
                return [
                    [M, -1, 0, 1],
                    [-1, 0, 1, 1]
                ];
                case RIGHT_TOP:  //右上角为起始点
                return [
                    [-1, 1, 0, 1],
                    [N, 0, -1, 1]
                ];
                case RIGHT_BOTTOM:  //右下角为起始点
                return [
                    [M, -1, 0, 1],
                    [N, 0, -1, 1]
                ];
                case LEFT_TOP:  //左上角为起始点
                default:
                return [
                    [-1, 1, 0, 1],
                    [-1, 0, 1, 1]
                ];
            }
}
使用示例:
window.LEFT_BOTTOM=2;
var row=5, col=7, orig_position=LEFT_BOTTOM;
var m1 = getM1(row, col, orig_position), m2, m;
for(var i=0; i<row; i++){
    for(var j=0; j<col; j++){
         //构造m2
        m2 = [1, i, j, 1];
        m = mtxMultiply(m1, m2);//实现编号映射
        console.log(m[0]+','+ m[1]);
        //m[0]为变换之后的行号,m[1]为变换之后的列号
    }
}

正在加载评论...