Класс с полезными математическими функциями
Декабрь 30th, 2009 автор: Oleg Antipov
В этот класс я вынес все простые, но полезные математические функции, которые приходится часто использовать при создании флеш игр.
package aneg { import aneg.*; import flash.geom.*; import flash.display.*; dynamic public class ageMath { public function ageMath() { } //Находится ли Num в диапазоне lRange..uRange static public function inRange(Num:Number,lRange:Number,uRange:Number):Boolean { return ((Num > lRange) && (Num < uRange)); } //получить ближайшие число к arg - Val1 или Val2 static public function getClosest(arg:Number,Val1:Number,Val2:Number):Number { if(Math.abs(arg - Val1)< Math.abs(arg - Val2)) return Val1; return Val2; } //Получить случайное число из диапазона clow..chigh static public function Random(clow:Number, chigh:Number):Number { return Math.round(Math.random() * (chigh - clow)) + clow; } //Получить целое случайное число из диапазона clow..chigh static public function RandomInt(clow:int, chigh:int):int { return Math.round(Random(clow,chigh)); } //Равны ли числа Num и aNum с заданной погрешностью aprox static public function aproxEqual(Num:Number, aNum:Number, aprox:Number=0.00001):Boolean { return (Math.abs(aNum-Num)<=aprox); } //Перевести число val из диапазона A..B в диапазон C..D static public function RemapVal(val:Number,A:Number,B:Number,C:Number,D:Number):Number { return C + (D - C) * (val - A) / (B - A); } //Получить число из диапазона cx..cy, зависящей от коэфициента s. //если s=0.0 то возвращается cx. //если s=1.0 то возвращается cy. static public function Lerp(cx:Number,cy:Number,s:Number):Number { return cx + s*(cy - cx); } //Пересекаются ли две линии. static public function IsLinesCross(x11:Number,y11:Number,x12:Number,y12:Number, x21:Number,y21:Number,x22:Number,y22:Number):Boolean { // решаем систему методом Крамера var d:Number = (x12 - x11)*(y21 - y22) - (x21 - x22)*(y12 - y11); if (d == 0) return false;//Отрезки либо параллельны, либо полностью/частично совпадают var d1:Number = (x21 - x11)*(y21 - y22) - (x21 - x22)*(y21 - y11); var d2:Number = (x12 - x11)*(y21 - y11) - (x21 - x11)*(y12 - y11); var t1:Number = d1 / d; var t2:Number = d2 / d; if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) return true; //пересекаются else return false; //не пересекаются } } }
Надеюсь некоторые окажутся вам полезными. Весь класс можно скачать здесь: http://www.anegmetex.com/devblog/files/ageMath.as
Категория: Полезные классы

Январь 10th, 2010 at 12:27
Вот спасибо!
Все хотел себе что-то такое сделать, а тут попал на готовенькое
Январь 10th, 2010 at 17:06
Рад что пригодилось
Март 2nd, 2010 at 16:20
Я бы сюда добавил бы функции вычисления расстояния между двумя точками (квадрат расстояний) и вычисление угла поворота объекта в направлении нужной точки ( Math.atan2(needX,needY)*Math.PI/180)
Март 3rd, 2010 at 12:29
Ну все эти функции есть в классе вектора
http://www.anegmetex.com/devblog/2010/01/19/klass-vektora/
ибо я сторонник векторной математики
Все позиции, скорости и направления объектов я считаю следует задавать векторами.
Октябрь 23rd, 2010 at 17:32
Я, слегка обновил твой класс, надеюсь ты не против?
http://byflasher.com/poleznye-sovety/klass-s-poleznymi-matematicheskimi-funkciyami/
Октябрь 23rd, 2010 at 19:17
Конечно не против, я всецело за
Апрель 15th, 2011 at 15:55
[...] игр. Классы используют выкладываемые ранее модули ageMath и ageVector (они уже включены в исходники примера в конце [...]
Апрель 28th, 2011 at 1:37
[...] я навыкладывал в предыдущих сериях, а именно Cookie.as, ageMath.as, ageVector.as, sounds.as, alphaFader.as. Все они уже есть в исходниках [...]
Июль 15th, 2011 at 17:45
Можно ускорить вот эту часть:
…
var t1:Number = d1 / d; <—
var t2:Number = d2 / d; = 0 && t1 = 0 && t2 = 0 && d1 = 0 && d2 <= d)
return true;
else
return false;
Июль 15th, 2011 at 17:47
заменив на
if (d1 >= 0 && d1 = d && d2 <= d)
Избавившись от делений
Июль 15th, 2011 at 17:50
заменив на
if (d1 >= 0 && d1 = 0 && d2 <= d)
Избавившись от делений