利用矩阵运算可以很方便的实现这种映射,代码(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]为变换之后的列号 } }