Добавление непересекаемых блоков на страницу
Всем привет,
Есть проблемка... На страницу динамически добавляются блоки с текстом ( пусть размер будет 200*100 px). При этом они не должны пересекатся. При добавлении нового блока функция проверяет каждый блок на пересечение с новым блоком, и если они пересекаются - продолжает поиск. Но благодаря такой рекурсии скрипт виснет даже при 2-х блоках на странице. Есть ли другие пути решения? или как оптимизировать скрипт чтобы все работало более менее быстро. Вот пример скрипта
function randomXY(list)
{
m = parseInt(1);
n = parseInt(79);
xv = Math.floor( Math.random() * (n - m + 1) ) + m;
m = parseInt(30);
n = parseInt(50);
yv = Math.floor( Math.random() * (n - m + 1) ) + m;
per = false;
$.each(list, function(index, value) {
inc = getInc();
a = {x:xv,y:yv,x1:xv+inc.x,y1:yv+inc.y};
b = {x:value.x,y:value.y,x1:value.x+inc.x,y1:value.y+inc.y};
if(checkp2(a,b))
{
per = true;
}
});
if(per)
{
return randomXY(list);
}
else
{
res = {x:xv,y:yv};
return res;
}
}
функция checkp2 проверяет пересечение. входной параметр List - список уже имеющихся блоков на страницу |
m2broth,
:) А что есть не пересекающиеся ? (имеется ввиду по ширине, или ... Каков размер страницы ? Вертикальный размер фиксирован ? |
ну вообще не пересекаются отдельные блоки текста, пользователь вводит сообщение в форму и на странице отображается это сообщение в хаотичном порядке ( в виде блока 200 на 100). Понятное дело что они не должны пересекатся
|
преположим что блоки отображаются в фиксированной области width:100% height:500px
|
Цитата:
Все равно нужно понять "когда пришел конец". :D Т.е. не стоит больше гененерить те блоки... |
Вот накидал макетик... Ничего не виснет. :D
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#box {
position: relative;
border: 1px solid;
}
.box {
position: absolute;
}
</style>
<script type="text/javascript">
var maxw=1000;
var maxh=500;
var w=100;
var h=100;
var maxi=1000;
var ab=[];
$(document).ready(function (){
$('#box').css({
'width': maxw+'px',
'height': maxh+'px'
});
setTimeout(newDiv,0);
});
function newDiv() {
var y,x,i;
i=0;
do {
y=Math.floor(Math.random()*(maxh-h))+1;
x=Math.floor(Math.random()*(maxw-w))+1;
i++;
} while ((i<maxi) && cross(y,x));
if (i==maxi) return;
ab[ab.length]={x: x, y: y};
$('#box').append('<div class="box" id="b'+ab.length+'"></div>');
$('#b'+ab.length).css({
'top': y+'px',
'left': x+'px',
'width': w+'px',
'height': h+'px',
'background-color': color()
});
setTimeout(newDiv,0);
};
function cross(Y,X) {
var i,ok;
ok=false;
for (i=0; i<ab.length; i++) {
if (Math.abs(ab[i].x-X)>w) continue;
if (Math.abs(ab[i].y-Y)>h) continue;
ok=true;
break;
};
return ok;
};
function color() {
var s='';
for (i=0; i<6; i++) {
s=s+Math.floor(Math.random() * 10);
}
return '#'+s
};
</script>
</head>
<body>
<div id='box'></div>
</body>
</html>
|
Даже при
maxi=1000; Довольно кучно накидывает... :) |
А для чего setTimeout(newDiv,0) в newDiv?
|
Цитата:
|
| Часовой пояс GMT +3, время: 01:25. |