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

Добавляю функцию для вывода получившихся секций:
console.log('--------------------------------');
var str = "";
for(i = 0; i < sectors.length; i+=Math.floor(size/step) ) {
	for( k = 0; k <= step; k++) {
		for(s = 0; s < Math.floor(size/step); s++) {
			for(j=0;j<=step;j++)
				str+=addZero(''+sectors[i+s][k*(step+1)+j],TO_SIZE)+" ";
			str+=" ";
		}
		str+="\n";
	}

	if(i % step == 0) {
		str += new Array((size+1)*3+1).join(' ');
		str += "\n";
	}
}
console.log(str);


И все вместе что бы посмотреть:

var arr = [],
		sectors = [],
		step = 4,
		size = 17;

var TO_SIZE = size.toString().length+1;

var str = '';
for(i = 0; i < size*size; i++) { // fill array
	arr[i] = i+1;
	str+=addZero(''+arr[i], TO_SIZE);
	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(new Array(Math.pow(step+1,2)));
}

var to_arr = 0,
		x, y,
		line_up = Math.floor(size / step),
		is_repeat, k_step;

for( i = 1, j = 0, k = 0; i <= arr.length; i++, j++) {
	x = Math.floor( i % size );
	y = Math.floor( (i-1) / size ); 
	
	k_step = k == step && k != 0;
	is_repeat = k_step && y != 0 && y!=(size-1); 
	
	if(j != step || j == 0) {
		sectors[to_arr][j+k*(step+1)] = i;
		if(is_repeat) {
			sectors[to_arr+line_up][j] = i;
		}
	}
	
	if(j == step && j != 0) {
		sectors[to_arr][j+k*(step+1)] = i;
		if(is_repeat) {
			sectors[to_arr+line_up][j] = i;
		}
		if(x!=0) {
			sectors[to_arr+1][j+k*(step+1)-step] = i;
			if(is_repeat) {
				sectors[to_arr+line_up+1][j-step] = i;
			}
		}
		to_arr++;
		j = 0;
	}
	
	if(x==0) {
		to_arr = (Math.floor(y/step)-(is_repeat?1:0)) * line_up+(k_step?line_up:0);
		k = k_step?1:k + 1;
		j=-1;
	}

}

console.log('--------------------------------');

var str = "";
for(i = 0; i < sectors.length; i+=Math.floor(size/step) ) {
	for( k = 0; k <= step; k++) {
		for(s = 0; s < Math.floor(size/step); s++) {
			for(j=0;j<=step;j++)
				str+=addZero(''+sectors[i+s][k*(step+1)+j],TO_SIZE)+" ";
			str+=" ";
		}
		str+="\n";
	}

	if(i % step == 0) {
		str += new Array((size+1)*3+1).join(' ');
		str += "\n";
	}
}
console.log(str);


function addZero(str,length) { // add 0 to fill str length
	while(str.length < length) {
		str = '0'+str;
	}
	return str;
}


Всем удачи!
Ответить с цитированием