// // @auteur : YopSolo // @mail : mail@yopsolo.fr // @site : http://www.yopsolo.fr // @date : 12/2004 // class Vector2D { private var x; private var y; // -- CONSTRUCTEUR function Vector2D(x:Number, y:Number) { this.x = x; this.y = y; } // -- SETTEUR function reset(x:Number, y:Number):Void { this.x = x; this.y = y; } // -- DEBUG function toString():String { var rx = Math.round(this.x*1000)/1000; var ry = Math.round(this.y*1000)/1000; return "["+rx+","+ry+"]"; } // -- CLONAGE function clone():Vector2D { return new Vector2D(this.x, this.y); } // -- TESTS function egal(v:Vector2D):Boolean { return (this.x == v.x && this.y == v.y); } // -- OPERATIONS SUR LES VECTEURS // Addition function plus(v:Vector2D):Void { this.x += v.x; this.y += v.y; } function plusN(v:Vector2D):Vector2D { var nX = this.x+v.x; var nY = this.y+v.y; return new Vector2D(nX, nY); } // Soustration function moins(v:Vector2D):Void { this.x -= v.x; this.y -= v.y; } function moinsN(v:Vector2D):Vector2D { var nX = this.x-v.x; var nY = this.y-v.y; return new Vector2D(nX, nY); } // Produit function produit(v:Vector2D):Number { return (this.x*v.x+this.y*v.y); } // Orthogonaux function isOrthogonal(v:Vector2D):Boolean { return (this.produit(v) == 0); } // -- TRANSFORMATIONS function inv() { this.x = -this.x; this.y = -this.y; } function invN(v:Vector2D):Vector2D { var nX = -this.x; var nY = -this.y; return new Vector2D(nX, nY); } function scale(s:Number):Void { this.x *= s; this.y *= s; } function scaleN(s:Number):Vector2D { var nX = this.x*s; var nY = this.y*s; return new Vector2D(nX, nY); } // -- TAILLE function getLen():Number { with (this) { return Math.sqrt(x*x+y*y); } } function setLen(len:Number):Void { var t = this.getLen(); if (t) { this.scale(len/t); } else { this.x = len; } } // -- NORMALES (normale a gauche) => nd = ng.neg(); function getNormal():Vector2D { return new Vector2D(-this.y, this.x); } // -- TRIGO/Vecteur2D // necessite la classe statique Trigo.as // angle du vecteur function getAngle():Number { return Trigo.atan2D(this.x, this.y); } // function setAngle(a:Number):Void { var r = this.getLen(); this.x = r*Trigo.cosD(a); this.y = r*Trigo.sinD(a); } // rotation function rotate(a:Number):Void { var ca:Number = Trigo.cosD(a); var sa:Number = Trigo.sinD(a); var rx:Number; var ry:Number; // rx = this.x*ca-this.y*sa; ry = this.x*sa+this.y*ca; this.x = rx; this.y = ry; } function rotateN(a:Number):Vector2D { var v = new Vector2D(this.x, this.y); v.rotate(a); return v; } // angle formé par 2 vecteurs function theta(v:Vector2D):Number { // produit vectoriel var pdt = this.produit(v); // cos de l'angle var ca = pdt/(this.getLen()*v.getLen()); // cos inverse en degres return Trigo.acosD(ca); } }