//Oleg Antipov //http://www.blog.anegmetex.com package aneg { import aneg.*; public class ageVector { var x:Number; var y:Number; function ageVector(setX:Number=0, setY:Number=0) { x = setX; y = setY; } //Копирует вектор function copy( v:ageVector ):void { x = v.x; y = v.y; } //Устанавливает компоненты вектора function set( setX:Number, setY:Number ):void { x = setX; y = setY; } //Прибавляет вектор v function add( v:ageVector ):void { x += v.x; y += v.y; } //Вычитает вектор v function sub( v:ageVector ):void { x -= v.x; y -= v.y; } //Умножает вектор на число i function mulScalar( i:Number ):void { x *= i; y *= i; } //Равны ли вектора c заданной погрешностью aprox function isEqual( v:ageVector , aprox:Number=0.00001):Boolean { return (ageMath.aproxEqual(x,v.x,aprox) && ageMath.aproxEqual(y,v.y,aprox)); } //Длина вектора function len():Number { return Math.sqrt( x*x + y*y ); } //Длина вектора в квадрате function len2():Number { return x*x + y*y; } //Ограничить длину вектора максимальной длинной function trimLen(maxLen:Number):void { if(len2()>maxLen*maxLen) { normThis(); mulScalar(maxLen); } } //получить проекцию вектора на вектор v function ProjOnVec(v:ageVector):ageVector { var res:ageVector = v.norm(); res.mulScalar(ProjOnScalar(v)); return res; } // скалярная проекция вектора на вектор v function ProjOnScalar(v:ageVector):Number { return dot(v)/v.len(); } // скалярное произведение векторов function dot(v:ageVector):Number { return x*v.x + y*v.y; } // нормализация вектора (получить единичный вектор) function norm():ageVector { var l:Number = len(); var res:ageVector = new ageVector(x,y); if (l) { res.x /= l; res.y /= l; } return res; } // нормализация этого вектора function normThis():void { var l:Number = len(); if (l) { x /= l; y /= l; } } // Lerp с другим вектором. Результат записывается в этот же вектор //return cx + s*(cy - cx); function lerpThis(v:ageVector,s:Number):void { var tmpV:ageVector = new ageVector(); tmpV.copy(v); tmpV.sub(this); tmpV.mulScalar(s); add(tmpV); } //Поворот вектора на угл в радианах function rot(ang:Number):void { var dx:Number=x; x=dx*Math.cos(ang)-y*Math.sin(ang); y=y*Math.cos(ang)+dx*Math.sin(ang); } //Поворот вектора на угл в градусах function rotDeg(ang:Number):void { var angR:Number=ang*Math.PI/180; var dx:Number=x; x=dx*Math.cos(angR)-y*Math.sin(angR); y=y*Math.cos(angR)+dx*Math.sin(angR); } // получить угол в градусах function getAngleDeg():Number { return Math.atan2(y, x)/Math.PI*180; } // получить угол в радианах function getAngle():Number { return Math.atan2(y, x); } // получить угол в градусах с нормированным переходом function getAngleDegNorm():Number { var angle:Number=Math.atan2(y, x)/Math.PI*180; if(angle<0) angle=360+angle; else if(angle>=360) angle=angle-360; return angle; } // получить угол в радианах с нормированным переходом function getAngleNorm():Number { var angle:Number=Math.atan2(y, x); if(angle<0) angle=Math.PI*2+angle; else if(angle>=Math.PI*2) angle=angle-Math.PI*2; return angle; } } }