Представляю первый вариант решения, пока что работает только с подразделение на 4 части, что означает что он НЕ работает, однако выладываю как пример (работает с размерами step/size: 2/5,4/9 и тд.)
var arr = [],
sectors = [],
step = 2,
size = 5;
// заполняем исходный массив значениями 0-24
var str = '';
for(i = 0; i < size*size; i++) { // fill array
arr[i] = i;
str+=addZero(''+arr[i], 2);
if( (i+1) % size === 0 && i !== 0) {
console.log(str); // draw array
str = '';
} else {
str+=', ';
}
}
// считаем колличество сектаров
for(i = 0; i < Math.pow(Math.floor(size/step),2); i++) {
sectors.push([]);
}
// собственно сам алгоритм нарезки
var to_arr = 0,
x, y,
mod_x, mod_y,
line_up = Math.floor(size / step);
for( i = 0 ; i < size*size; i++) {
x = Math.floor( i % size );
y = Math.floor( i / size );
mod_x = x%(step+1);
mod_y = y%(step+1);
to_arr = Math.floor(y/(step+1)) * line_up + Math.floor(x/(step+1));
if(mod_x == step && mod_y == step ) {
sectors[to_arr].push(i);
sectors[to_arr+1].push(i);
sectors[to_arr+line_up].push(i);
sectors[to_arr+line_up+1].push(i);
} else if(mod_x == step) {
sectors[to_arr].push(i);
sectors[to_arr+1].push(i);
} else if(mod_y == step) {
sectors[to_arr].push(i);
sectors[to_arr+line_up].push(i);
} else {
sectors[to_arr].push(i);
}
}
console.log(sectors);
function addZero(str,length) { // add 0 to fill str length
while(str.length < length) {
str = '0'+str;
}
return str;
}
Жду Ваших решений )
З.Ы. - скорость еще не тестировал