Класс с полезными математическими функциями

Декабрь 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

Категория: Полезные классы

11 Комментариев

  1. opposit

    Вот спасибо!
    Все хотел себе что-то такое сделать, а тут попал на готовенькое :arrow:

  2. Oleg Antipov

    Рад что пригодилось ;-)

  3. Newtom

    Я бы сюда добавил бы функции вычисления расстояния между двумя точками (квадрат расстояний) и вычисление угла поворота объекта в направлении нужной точки ( Math.atan2(needX,needY)*Math.PI/180)

  4. Oleg Antipov

    Ну все эти функции есть в классе вектора
    http://www.anegmetex.com/devblog/2010/01/19/klass-vektora/

    ибо я сторонник векторной математики :)

    Все позиции, скорости и направления объектов я считаю следует задавать векторами.

  5. hitab

    Я, слегка обновил твой класс, надеюсь ты не против? ;-)
    http://byflasher.com/poleznye-sovety/klass-s-poleznymi-matematicheskimi-funkciyami/

  6. Oleg Antipov

    Конечно не против, я всецело за :)

  7. Разработка flash игр » Blog Archive » Звуки и музыка

    [...] игр. Классы используют выкладываемые ранее модули ageMath и ageVector (они уже включены в исходники примера в конце [...]

  8. Разработка flash игр » Blog Archive » Achievements engine

    [...] я навыкладывал в предыдущих сериях, а именно Cookie.as, ageMath.as, ageVector.as, sounds.as, alphaFader.as. Все они уже есть в исходниках [...]

  9. MaxGraey

    Можно ускорить вот эту часть:

    var t1:Number = d1 / d; <—
    var t2:Number = d2 / d; = 0 && t1 = 0 && t2 = 0 && d1 = 0 && d2 <= d)
    return true;
    else
    return false;

  10. MaxGraey

    заменив на
    if (d1 >= 0 && d1 = d && d2 <= d)
    Избавившись от делений

  11. MaxGraey

    заменив на
    if (d1 >= 0 && d1 = 0 && d2 <= d)
    Избавившись от делений

Оставить комментарий