Добавление непересекаемых блоков на страницу
Всем привет,
Есть проблемка... На страницу динамически добавляются блоки с текстом ( пусть размер будет 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, время: 19:36. |