// ======================================
// 扩展Math函数
// ======================================
package cn.flashOpen.kit ... {
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.geom.Point;
public class ExtMath
...{
//坐标转换
//car2Flash//迪卡尔坐标转成Flash坐标
public static function car2Flash(_mc)
...{
_mc.y = _mc.y * -1;
_mc.rotation = _mc.rotation * -1;
}
//flash2Car//Flash坐标转成迪卡尔坐标
public static function flash2Car (_mc)
...{
return (car2Flash(_mc));
}
//car2Polar//迪卡尔坐标转成极坐标
public static function car2Polar (x:Number, y:Number)
...{
var len:Number = Math.sqrt((x * x) + (y * y));
var ang:Number = atan2D(y, x);
return (...{r:len, a:ang});
}
//polar2Car//极坐标转成迪卡尔坐标
public static function polar2Car (len:Number, ang:Number)
...{
var xx:Number = len * cosD(ang);
var yy:Number = len * sinD(ang);
return (...{x:xx, y:yy});
}
//getMcCoordG//获得本身全局坐标
public static function getMcCoordG (_mc)
...{
//_mc为要获得坐标的影片,他的坐标系影片为:_mc.parent;
var p:Point = new Point(_mc.x, _mc.y);
p = _mc.parent.localToGlobal(p);
return p;
}
//getCoordG//获得影片全局坐标
public static function getCoordG (_mc, _xx:Number, _yy:Number)
...{
//_mc要xx,yy所在坐标系的影片(若xx = myMc.x,则坐标系影片为:myMc.parent)
var p:Point = new Point(_xx, _yy);
p = _mc.localToGlobal(p);
return p;
}
//getCoordL//获得影片本地坐标
public static function getCoordL (_mc, _xx:Number, _yy:Number)
...{
//_mc要xx,yy要转入的坐标系的影片
var p:Point = new Point(_xx, _yy);
p = _mc.parent.globalToLocal(p);
return p;
}
//mc2McCoord//转换成特定影片的坐标
public static function mc2McCoord (_mc1, _mc2, _xx, _yy)
...{
//mc1为_xx,_yy所在的坐标系影片,_mc2为要转入的坐标系影片
var p:Point = new Point(_xx, _yy);
p = _mc1.localToGlobal(p);
p = _mc2.parent.globalToLocal(p);
return p;
}
//数学函数
//标签
//getRand//获得随机数
static function getRand(_nStartNum:Number, _nEndNum:Number, _nDecimalDigits:Number)
...{
var nRange = _nEndNum - _nStartNum;
var nRand = _nStartNum + Math.random() * nRange;
var nScale = Math.pow(10, _nDecimalDigits);
nRand = Math.floor(nRand * nScale)/nScale;
return nRand;
}
//randPole//获得随机正负标签
public static function randPole ()
...{
var nPole:Number = Math.random() > 0.5 ? 1:-1;
return nPole;
}
//intRand//获得随机向下取整的整数
public static function intRand (_n:Number)
...{
var n:Number = Math.floor(Math.random() * _n);
return n;
}
//intCeil//获得随机向上取整的整数
public static function ceilRand (_n:Number)
...{
var n:Number = Math.ceil(Math.random() * _n);
return n;
}
//距离
//getDis//获得距离
public static function getDis (_x1:Number, _y1:Number, _x2:Number, _y2:Number)
...{
var dx:Number = _x2 - _x1;
var dy:Number = _y2 - _y1;
var L:Number = Math.sqrt(dx * dx + dy * dy);
return L;
}
//getL2//获得三角形短边
public static function getL2 (_l1:Number, _l3:Number)
...{
//_l1为短边, _l3为长边
var l2:Number = Math.sqrt(_l3 * _l3 - _l1 * _l1);
return l2;
}
//getL3//获得三角形长边
public static function getL3 (_l1:Number, _l2:Number)
...{
//_l1,_l2为短边
var l3:Number = Math.sqrt(_l1 * _l1 + _l2 * _l2);
return l3;
}
//三角函数
//正函数
//sinD
public static function sinD (_ang:Number)
...{
var n:Number = Math.sin(_ang * 3.141593 / 180);
return n;
}
//cosD
public static function cosD (_ang:Number)
...{
var n:Number = Math.cos(_ang * 3.141593 / 180);
return n;
}
//tanD
public static function tanD (_ang:Number)
...{
var n:Number = Math.tan(_ang * 3.141593 / 180);
return n;
}
//反函数
//asinD
public static function asinD (_ratio:Number)
...{
var n:Number = Math.asin(_ratio) * 57.295780;
return n;
}
//acosD
public static function acosD (_ratio:Number)
...{
var n:Number = Math.acos(_ratio) * 57.295780;
return n;
}
//atan2D
public static function atan2D (y:Number, x:Number)
...{
var ang:Number = Math.atan2(y, x) * 57.295780;
return ang;
}
//角度操作
//d2r
public static function d2r (_ang:Number)
...{
var radian:Number = _ang * 0.017453;
return radian;
}
//d2r
public static function r2d (_radian:Number)
...{
var ang:Number = _radian * 57.295780;
return ang;
}
//fixAngle//标准化角度
public static function fixAng (_ang:Number)
...{
var _ang:Number = _ang % 360;
var ang:Number = _ang % 360 < 0 ? _ang + 360 : _ang;
return ang;
}
//getAngle//获得角度
public static function getAng (_x1:Number, _y1:Number, _x2:Number, _y2:Number)
...{
var ang:Number = Math.atan2(_y2 - _y1, _x2 - _x1) * 57.295780;
return ang;
}
//getClampAng/获得夹角
public static function getClampAng (_a1:Number, _a2:Number)
...{
var a1:Number = fixAng(_a1);
var a2:Number = fixAng(_a2);
var dAng:Number = Math.abs(a2 - a1);
if(dAng > 180) dAng = 360 - dAng;
dAng = fixAng(dAng);
return dAng;
}
//getOutAng/获得出射角
public static function getOutAng (_lineAng:Number, _inAng:Number)
...{
//_lineAng为水平线的角度, _inAng为入射角度
var outAng:Number = _lineAng * 2 - _inAng;
return outAng;
}
//getTrendRo//获得趋近角度
public static function getTrendRo (_oAng:Number, _aimAng:Number, _trandRate:Number, _minAng:Number)
...{
//_oAng为原角度,_aimAng为目标角度
//_rate < 1时为_aimAng和_oAng夹角的趋近比率,_rate>1时为每次改变的角度
//_minAng为执行的最小角度
var dAng:Number = fixAng(_aimAng - _oAng);
var absDAng:Number = Math.abs(dAng);
var minAng:Number = !_minAng ? 0 : _minAng;
if(absDAng <= minAng) return _oAng;
var pole:Number;
if(absDAng > 180)
...{
absDAng = 360 - absDAng;
pole = -absDAng/dAng;
}
else
...{
pole = absDAng/dAng;
}
var newAng:Number;
if(_trandRate < 1)
newAng = _oAng + pole * absDAng * _trandRate;
else
newAng = _oAng + pole * _trandRate;
return newAng;
}
//classRo//经典旋转
public static function classRo (_xx:Number,_yy:Number,_ang:Number,_ox:Number,_oy:Number)
...{
//_xx,_yy为要旋转的点坐标,_ang为要旋转的角度,
//_ox,_oy为旋转中心点
var x:Number = _xx;
var y:Number = _yy;
var ang:Number = _ang;
var ox:Number = _ox;
var oy:Number = _oy;
x -= ox;
y -= oy;
var x1:Number = cosD(ang) * x - sinD(ang) * y;
var y1:Number = cosD(ang) * y + sinD(ang) * x;
x1 += ox;
y1 += oy;
return ...{x:x1,y:y1};
}
//mcRo//影片旋转
public static function mcRo (_mc, _xx:Number, _yy:Number, _offsetAng:Number)
...{
//_mc为要旋转的影片,_xx为目标x坐标,_yy为目标y坐标,_offsetAng为偏移角度
var x:Number = _xx - _mc.x;
var y:Number = _yy - _mc.y;
var ang:Number = atan2D(y,x);
if(_mc)
...{
if(!_offsetAng) _offsetAng = 0;
ang += _offsetAng;
}
return ang;
}
//oddsManage//几率管理
public static function oddsManage (_mc, _aOdds:Array, _aFun:Array)
...{
var len:Number = _aOdds.length;
var nRand:Number = Math.random();
var id:Number = 0;
for(var i=0; i<len; i++)
...{
var rate1:Number = 0;
var rate2:Number = _aOdds[i];
for(var j=0; j<i; j++)
...{
rate1 += _aOdds[j];
}
rate2 += rate1;
if(nRand >= rate1)
...{
if(nRand < rate2)
...{
id = i;
break;
}
}
}
return _mc[_aFun[id]]();
}
}
}