Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 09.04.2011, 14:33
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 1  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
По умолчанию Оптимизация сортировки объектов в изометрии

перелопатил много существующих изо движков, но нашел пока только один самый стабильно работающих способ сортировки (к сожалению довольно медленный: 350 элементов ~80мс)

требуется помощь в оптимизации или в подборе другого алгоритма

исходные данные:
- 2d объекты с известными координатами в изометрическом мире (x,y) и габаритами (width, height), а также уровнем высоты, для упрощения сортировки "слоев"
- для нахождения крайних точек объектов используется класс Bounds со св-ми left=x, right=x+width, back=y, front=y+height

условия:
- сортировка должна происходить по изометрическим законам

и текущий алгоритм:

Код AS3:
protected function sort(itemsToRender:Array):Array
{		
	//создаем копию исходного массива
	var list:Array = itemsToRender.slice(0);
 
	itemsToRender = [];
 
	var i:int;
	var j:int;
	var listLength:int = list.length;
 
	for (i = 0; i < listLength; i++)
	{
		//неотсортированный элемент
		var notSortedObj:IIsoItem = list[i] as IIsoItem;
		var notSortedObjBounds:Bounds = notSortedObj.bounds;
 
		var added:Boolean = false;
		var moLength:int = itemsToRender.length;
		for (j = 0; j < moLength; j++)
		{
			var sortedObj:IIsoItem = itemsToRender[j] as IIsoItem;
			var sortedObjBounds:Bounds = sortedObj.bounds;
 
			//если хоть одна точка notSortedObj попадает в правый верхний квадрант sortedObj, то notSortedObj лежит ниже
			if (notSortedObj.level == sortedObj.level && notSortedObjBounds.right > sortedObjBounds.left && notSortedObjBounds.back < sortedObjBounds.front)
			{
				itemsToRender.splice(j, 0, notSortedObj);
				added = true;
				break;
			}else if (notSortedObj.level < sortedObj.level) {
				itemsToRender.splice(j, 0, notSortedObj);
				added = true;
				break;
			}
		}
 
		//если ни одно из условий не выполнилось, то объект лежит выше всех
		if (!added) itemsToRender.push(notSortedObj);
	}
 
	list = null;
 
	//возвращает отсортированные элементы
	return itemsToRender;
}
Изображения
 
__________________
low +

Создать новую тему   Часовой пояс GMT +4, время: 17:14.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:14.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.