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

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

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.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. Newtom

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

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

  4. Пинг: Разработка flash игр » Blog Archive » Achievements engine

  5. 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;

  6. MaxGraey

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

  7. MaxGraey

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

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

Ваш email не будет опубликован. Обязательные поля отмечены *

+ 66 = 71

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>