![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
|
|||||
|
Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
|
перелопатил много существующих изо движков, но нашел пока только один самый стабильно работающих способ сортировки (к сожалению довольно медленный: 350 элементов ~80мс)
требуется помощь в оптимизации или в подборе другого алгоритма исходные данные: - 2d объекты с известными координатами в изометрическом мире (x,y) и габаритами (width, height), а также уровнем высоты, для упрощения сортировки "слоев" - для нахождения крайних точек объектов используется класс Bounds со св-ми left=x, right=x+width, back=y, front=y+height условия: - сортировка должна происходить по изометрическим законам и текущий алгоритм: 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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|