Буду делиться тем что делаю.
Небольшой совет по оптимизации
Иногда бывает нужно разложить вектор на 2 составляющие по заданному направлению.
То есть есть нормализованный вектор (nx,ny) и надо разложить вектор (vx,vy) в сумму вектора (x1,y1) с тем же направлением, что и (nx,ny), т.е. коллинеарный вектор и перпендикулярного ему вектора (x2,y2).
Вот меня на днях осенило, что раньше я это делал глупо и есть способ чуток быстрее. Вот код, поймёте сами:
var vx:Number=Math.random()*20-10; //Исходный вектор var vy:Number=Math.random()*20-10; var nx:Number=Math.random()*20-10; //Вектор направления var ny:Number=Math.random()*20-10; var d:Number=Math.sqrt(nx*nx+ny*ny); if(d>0) { d=1/d; nx*=d; ny*=d; var i:int; var x1:Number; var y1:Number; var x2:Number; var y2:Number; var x3:Number; var y3:Number; var p1:Number; var p2:Number; var t1:uint; var t2:uint; t1=getTimer(); p1=nx*vx+ny*vy; x1=p1*nx; y1=p1*ny; for(i=0;i<100000;i++) { p2=vx*ny-vy*nx; //так я делал раньше(через 2-ую проекцию) x2=p2*ny; y2=-p2*nx; } t1=getTimer()-t1; t2=getTimer(); for(i=0;i<100000;i++) { x3=vx-x1; //так я буду делать отныне! y3=vy-y1; } t2=getTimer()-t2; //Кстати trace'ы надо именно тут располагать //Если ставить перед промежутком кода t2=getTimer(); ... t2=getTimer()-t2; //то t1 будет меньше t2! trace("Исходный вектор:",vx,vy) trace("Направление:",nx,ny); trace("Время работы:",t1,t2); trace("Первая проекция:",x1,y1); trace("Проверка данных:") trace(" первым способом:",x2,y2); trace(" вторым способом:",x3,y3); } else trace("Impossible thing =)");
Код:
Исходный вектор: 7.630283823236823 -9.665163177996874 Направление: 0.977460412497158 0.21111878647075802 Время работы: 31 20 Первая проекция: 5.2956878106917 1.14379996348391 Проверка данных: первым способом: 2.334596012545122 -10.808963141480783 вторым способом: 2.3345960125451235 -10.808963141480785
Всего комментариев 2
Комментарии
Последние записи от Герыч
- Массив объектов или несколько массивов? (16.08.2009)
- SVN (16.08.2009)
- Box2D и магическое 30 (13.08.2009)
- Двойное деление vs Мозги (09.08.2009)
- Желе: убраны многие баги + появилась смена состояний (03.08.2009)