Как стать автором
Обновить

Комментарии 24

Спасибо вам и Flashist. К сожалению кармы не могу добавить, так как меньше 5.
На вид все простое (кое-что и вправду простое), но есть некоторые моменты где простота переростает в сложность.

Статья летит ко мне в избранное, а вам еще раз спасибо!
Доздравствуют Флешеры!
Рад, если статья вам оказалась полезной )
Удаление пространств имен это очень жестко :)

не совсем понятно в третьем пункте «удаление детей DisplayObjectContainer» зачем в него передавать ссылку на обьект?
Просто в примере это — статическая функция класса, чтобы не объявлять её в каждом классе, в котором нужно это реализовать, можно сделать такую «вспомогательную» функцию, которую дёргаешь каждый раз, когда тебе это нужно. У меня с подобными функциями куча классов, которые очень выручают, чтобы по 100 раз не писать один и тот же код.
Если честно, то школьный уровень. Все регекспы гуглятся за 5 секунд, а остальные функции пишутся сходу.
На мой взгляд, внимания заслуживает только дёргание URL через js, не все могут знать.
Я согласен, что тут достаточно простые и понятные всем функции, просто у меня достаточно много времени прошло, пока до меня дошло, как правильно формировать свои библиотеки вспомогательных классов, где я сейчас держу все подобные сниппеты. Кто-то может и не догатываться, что чем каждый раз писать код повторно, лучше 1 раз немного подумать, сделать его немного более универсальным и вынести его в отдельную вспомогательную функцию.

Да и, на самом деле, мне года 2 назад были бы просто так полезны эти все сниппеты, для общего развития. Так что, кому-то, они тоже может быть будут полезны.
Функция getRandomNum от Flashist выглядит очень странно. Получается все три последних флага (isNeedFloor, isNeedRound, isNeedCeil) можно установить в true и все будет работать, хотя среди них есть взаимоисключающие варианты

Имхо, правильней будет заменить их одним аргументом ТипОкругления, который может принимать значения Floor, Round, Ceil.
Интересно еще про редкостные баги узнать, которые не встретишь в обычный день.
К примеру: navigateToURL(url, "_blank") блокируется в IE как злокачественный pop-up если wmode embed объекта стоит на transparent.
Спасибо за самое ценное «Получение URL страницы, в которую встроена SWF»
А Вы уверены что сортировка с использованием randomizeSortFunction закончиться вообще за ожыдаемое время
Я имею ввыду что время работы такого алогитма непридказуемое
Смотря что вы подразумеваете под «ожидаемым временем» («жи», «ши» пиши через «и»). На самом деле я никогда не сталкивался с проблемами при использовании данного алгоритма.
Как Вы думаете, сколько раз вызовется функция randomizeSortFunction для 1000 элементов?
Не могу точно сказать, но по-моему, больше, чем 1000 раз. Но вероятность возникновения больших проблем (допустим флешка повиснет и цикл так никогда и не отсортируется), на мой взгляд, минимальна.

Кстати, я не проверял, но было бы даже интересно проверить, какой способ работает быстрее: использование sort() или удаление/добавление элементов массива. Ведь есть вероятность, что даже не смотря на «излишние» шаги sort() она будет работать быстрее, так как это встроенный функционал FlashPlayer.
Вот график зависимости относительного количества вызовов компаратора от логарифма количества элементов в массиве


То есть сложность алгоритма O(eN)
Не поленился и, надо сказать, что что способ случайной сортировки через Math.rand() при небольших количествах элементов в массиве (до 2000) отстаёт от сортировки через splice примерно на 1-2 мс. Но начиная с 20000 элементов в массивах показывает значительный прирост в производительности: для 20000 88 мс против 215, для 200000 время 1093 мс против 15258 мс!!!

В общем, оказалось то, что sort не такая уж и тормозящая функция, а при большом количестве элементов в массивах даёт значительный прирост производительности.

Я понимаю, что такое количество элементов вряд ли когда-нибудь будет в реальных проектах, но если брать количество меньше 2000, то разницы во времени вообще нет (или практически нет).

А вот, собственно, и сам код для тестирования:
var elementsCount:int = 200000;
var elementIndex:int;

var _arr1:Array = [];
var _arr2:Array = [];

for(elementIndex = 0; elementIndex < elementsCount; elementIndex++)
{
  _arr1.push(elementIndex);
}
_arr2 = _arr1.concat();

//trace("_arr1 = " + _arr1);
//trace("_arr2 = " + _arr2);
trace("getTimer() = " + getTimer());

this.spliceRandSort(_arr1);
this.mathRandSort(_arr2);

function spliceRandSort(array:Array):void
{
  var beginTime:Number = getTimer();
  trace("START __ spliceRandSort __ beginTime = " + beginTime);
  
  var arrayLength:int = array.length;
  for (var i:uint = 0; i < arrayLength; i++)
  {
   var rand:uint = int(Math.random() * arrayLength);
   array.push( array.splice( rand, 1 )[0] );
  }
  
  var endTime:Number = getTimer();
  trace("END __ spliceRandSort __ endTime = " + endTime + " | totalTime = " + (endTime - beginTime));
}

function mathRandSort(array:Array):void
{
  var beginTime:Number = getTimer();
  trace("START __ mathRandSort __ beginTime = " + beginTime);
  
  array.sort(this.randomizeSortFunction);
  
  var endTime:Number = getTimer();
  trace("END __ mathRandSort __ endTime = " + endTime + " | totalTime = " + (endTime - beginTime));
}

function randomizeSortFunction(obj1:Boolean, obj2:Object):int
{
 var randNum:int = -1 + Math.floor((Math.random() * 3));
 
 return randNum;
}


* This source code was highlighted with Source Code Highlighter.
Согласен что для вашего языка Ваш вариант приемлем.
Я тестировал для PHP
Вот статья на stackoverflow в добавку к моему мнению
Если речь идет о промежутке между двумя числами то в примере учитывается (включается) минимальный предел и не учитывается (включается) максимальный. Можно немного модифицировать его таким образом:

var randNum:Number = minNum + Math.random() * (maxNum — minNum + 1);
Ступил, в данном варианте при заданных параметрах getRandomNum(0, 2, false, true, false) проблема решается.
9. Перевод градусов в радианы и обратно

«была допущена оплошность, причём достаточно нубская, дело в том, что если в функции передавать угол величиной в 0 (не важно радиан или градусов), то при делении на 0 мы получим очень страааанное число»

похоже что автор сам достаточно нуб.

radians = angle / 180 * Math.PI;
angle = radians * 180 / Math.PI;

где в этих строках ты видишь деление на какой-либо параметр, который не равен 180 или Пи? Нулю радиан всегда будет соответствовать 0 градусов, и обратное тоже верно.
Если radians (в первом случае) или radians (во-втором) будет равен 0, то в результате мы получим не 0, а число равное отрицательной бесконечности (по-моему так это число называется в Flash).
Ок. Но я Вас не совсем понял. Чтобы вычислить угол в радианах, берем угол в градусах. Т.е. если angle = 0, то получаем radians = 0 * Math.PI / 180 = 0. Теперь обратный случай, когда нужен угол в градусах, берем radians = 0, получаем angle = 0 * 180 / Math.PI = 0. Откуда бесконечность?
Я был не прав, когда писал текст, сейчас его поправлю. Наверно, я в своём коде когда-то столкнулся с какой-то проблемой и почему-то считал, что если мы не будем дополнительно проверять на 0, то он будет не работать, но сейчас я проверил и понял, что я ошибался =(

Спасибо за поправку, сейчас в своих проектах уберу ненужные дополнительные проверки.
И не «тыкайте», пожалуйста, если мы с вами не знакомы, а мы с вами, по-моему, не знакомы.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории