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

Вернуться   Форум Flasher.ru > Блоги > _Smirnoff

Оценить эту запись

Преобразование трех циклов в один

Запись от _Smirnoff размещена 11.01.2009 в 11:07

На флешстаре нашел статью по преобразование трех циклов в один. Очень заинтересовал алгоритм, но никак нет времени посмотреть, чтобы ссылку не сохранять выложу статью тут, мож потом гляну какнить.

1) Тут мы видим классическую реализацию обхода трёхмерном массива.

Код AS3:
//1
for(var i:int=0; i < 5; i++)
for(var j:int=0; j < 5; j++)
for(var ij:int=0; ij < 5; ij++)
{
trace(i+" "+j+" "+ij);
}
2) Для простоты предположим, что у нас правильный трёхмерном массив, т.е. его высота, длинна, глубина равны.
Создаём один цикл, пока параметр К у нас меньше произведения длинны, высоты, глубины, мы определяем координаты ячейки в трёхмерном массиве:

а) В данном случае параметр i у нас будет равен К делить на произведение высоты, глубины. Т.к. знаем что длинна у нас не превышает заданной величины. Поэтому мы уменьшаем К в (j*ij) раз.

б) В данном случае параметр j у нас будет равен целочисленному остатку после деления произведения К и глубины массива на высоту.

в) В данном случае параметр ij у нас будет равен целочисленному остатку из выражения K/ij.

//2
//сюда можно подставлять любые значения
Код AS3:
var i:int=5;
var j:int=5;
var ij:int=5;
for(var k:int=0; k < i*j*ij; k++)
{
trace(int(k/(j*ij))+" "+int(k/ij)%j+" "+k%ij);
}
И не забудьте создать переменную, которая хранит значение i*j*ij. Т.к. при обходе цикда плеер заново считает i*j*ij, а это не сеть гуд.
Всего комментариев 3

Комментарии

Старый 11.01.2009 13:29 iNils вне форума
iNils
 
Аватар для iNils
Ужасный вариант. Как с точки зрения понимания, так и с точки зрения производительности, медленнее обычного почти в 10 раз за счет постоянных перерасчетов.
Старый 11.01.2009 13:46 _Smirnoff вне форума
_Smirnoff
 
Аватар для _Smirnoff
Согласен с тобой, просто цимис в том, что укладывается из трех в один. Когда, что-то хочется упростить или улучшить, приходится пренебрегать чем-то.
Старый 04.04.2009 05:05 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Код AS3:
var array3D:Array = [];
var i:int, j:int, k:int;
 
for (i; i < 125; i++, j = (i / 5) % 5, k = (i / 25) % 5)
{
	if (!array3D[k]) array3D[k] = [];
	if (!array3D[k][j]) array3D[k][j] = [];
	array3D[k][j].push(i);
}
 
trace(array3D[0][0]);
trace(array3D[0][1]);
trace(array3D[1][1]);
Для любителей извращенных способов
Обновил(-а) wvxvw 04.04.2009 в 05:08
 

 


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


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