Показать сообщение отдельно
  #51 (permalink)  
Старый 06.12.2016, 13:21
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

Представляю первый вариант решения, пока что работает только с подразделение на 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;
}


Жду Ваших решений )

З.Ы. - скорость еще не тестировал

Последний раз редактировалось Brook, 06.12.2016 в 13:40.
Ответить с цитированием