Показать сообщение отдельно
  #1 (permalink)  
Старый 11.02.2017, 08:01
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

Размер ячеек
Есть такой код для создания поля из 12х12 ячеек.

<div id="main"></div>

<script type="text/javascript">
var main = document.getElementById( "main" );

var tileW = 50;
var tileH = 45;

for ( var i = 0; i < 12; i++ ) {
	for ( var j = 0; j < 12; j++ ) {
		var tile = document.createElement( "DIV" );
		main.appendChild( tile );
		tile.style.cssText = "background-color: #cccccc; border: 1px dashed #eeeeee; position: absolute";
		tile.style.height = tileH;
		tile.style.width = tileW;
		tile.style.top = tileH * i;
		tile.style.left = tileW * j;
	}
}
</script>


Надо сделать так, чтобы чем ближе к центру находится ячейка, тем она меньше. Ну а крайние, соответственно, больше.

Было решено измерять глубину ячейки (пример для наглядности) вот такой функцией:

function Q( i, j ) {
	var lvl = Math.min( i, j, 11 - i, 11 - j );
	return [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][lvl];
}


Она вычисляет, на сколько умножать размеры ячейки. Т.е. для крайних (с lvl=0) будет умножаться на 1.6, а для самых центральных - на 0.4

Позицию ячейки надо теперь тоже считать по-другому, поэтому сделал для этого функцию:

function S( r ) {
	var s = 0;
	for (var i = 0; i < r; i++) {
		var t = i < 6 ? i : r - i - 1;
		s += [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][t];
	} 
	return s.toFixed(1);
}


Она вместо i, j возвращает новые множители для top и left с учётом масштабирования Q() - пример работы

Теперь в коде умножаю размеры ячейки на Q(i, j), а координаты - вместо top = height * i подаю top = height * S(i) и так же с left. Но получается немного не то

<div id="main"></div>

<script type="text/javascript">
var main = document.getElementById( "main" );

var tileW = 50;
var tileH = 45;

for ( var i = 0; i < 12; i++ ) {
	for ( var j = 0; j < 12; j++ ) {
		var tile = document.createElement( "DIV" );
		main.appendChild( tile );
		tile.style.cssText = "background-color: #cccccc; border: 1px dashed #eeeeee; position: absolute";
		tile.style.height = tileH * Q(i, j);
		tile.style.width = tileW * Q(i, j);
		tile.style.top = tileH * S(i);
		tile.style.left = tileW * S(j);
		tile.onclick = function () { this.style.display = "none" };
	}
}

function Q( i, j ) {
	var lvl = Math.min( i, j, 11 - i, 11 - j );
	return [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][lvl];
}

function S( r ) {
	var s = 0;
	for (var i = 0; i < r; i++) {
		var t = i < 6 ? i : r - i - 1;
		s += [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][t];
	} 
	return s.toFixed(1);
}
</script>


Где я ошибся в расчётах, может есть готовое решение?
В идеале хотелось бы задавать "центр" вручную (например, ячейки уменьшаются не чем ближе к центру, а чем ближе к ячейке i=3; j=9).
Ответить с цитированием