Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.01.2013, 14:10
Интересующийся
Отправить личное сообщение для m2broth Посмотреть профиль Найти все сообщения от m2broth
 
Регистрация: 27.10.2011
Сообщений: 10

Добавление непересекаемых блоков на страницу
Всем привет,

Есть проблемка...
На страницу динамически добавляются блоки с текстом ( пусть размер будет 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 - список уже имеющихся блоков на страницу
Ответить с цитированием
  #2 (permalink)  
Старый 31.01.2013, 14:23
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

m2broth,
А что есть не пересекающиеся ? (имеется ввиду по ширине, или ...
Каков размер страницы ?
Вертикальный размер фиксирован ?
Ответить с цитированием
  #3 (permalink)  
Старый 31.01.2013, 14:42
Интересующийся
Отправить личное сообщение для m2broth Посмотреть профиль Найти все сообщения от m2broth
 
Регистрация: 27.10.2011
Сообщений: 10

ну вообще не пересекаются отдельные блоки текста, пользователь вводит сообщение в форму и на странице отображается это сообщение в хаотичном порядке ( в виде блока 200 на 100). Понятное дело что они не должны пересекатся
Ответить с цитированием
  #4 (permalink)  
Старый 31.01.2013, 14:43
Интересующийся
Отправить личное сообщение для m2broth Посмотреть профиль Найти все сообщения от m2broth
 
Регистрация: 27.10.2011
Сообщений: 10

преположим что блоки отображаются в фиксированной области width:100% height:500px
Ответить с цитированием
  #5 (permalink)  
Старый 31.01.2013, 14:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от m2broth
преположим что блоки отображаются в фиксированной области width:100% height:500px
Ну туда особо много прямоугольников по 200*100 и не накидаешь...

Все равно нужно понять "когда пришел конец". Т.е. не стоит больше гененерить те блоки...
Ответить с цитированием
  #6 (permalink)  
Старый 31.01.2013, 15:58
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Вот накидал макетик... Ничего не виснет.

<!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>

Последний раз редактировалось ksa, 31.01.2013 в 16:29.
Ответить с цитированием
  #7 (permalink)  
Старый 31.01.2013, 15:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Даже при

maxi=1000;


Довольно кучно накидывает...
Ответить с цитированием
  #8 (permalink)  
Старый 01.02.2013, 19:06
Интересующийся
Отправить личное сообщение для m2broth Посмотреть профиль Найти все сообщения от m2broth
 
Регистрация: 27.10.2011
Сообщений: 10

А для чего setTimeout(newDiv,0) в newDiv?
Ответить с цитированием
  #9 (permalink)  
Старый 03.02.2013, 15:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от m2broth
А для чего setTimeout(newDiv,0) в newDiv?
Таки убери - узнаешь...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление пожелания на страницу. Aridon jQuery 5 21.01.2013 18:17
Добавление блоков из шаблона с уникальными именами wcb-falcon Общие вопросы Javascript 2 10.04.2012 18:14
Скрипт отслеживающий подгрузку контента на страницу. psqs Events/DOM/Window 2 23.01.2012 21:29
Скрипт счетчика тормозит когда вделаю страницу активной denisOgr jQuery 1 30.10.2011 16:15
Добавление нужного css-файла в html страницу в зависимости от ширины окна браузера UglyDemon Общие вопросы Javascript 1 24.12.2010 10:30