package HTools.Math{ public class Complex { public var im:Number; public var real:Number; public function Complex(r:Number=0,i:Number=0):void { im=i; real=r; } public function get mod():Number { return Math.sqrt(im*im+real*real); } public function set mod(m:Number) { var p:Number=phase; im=Math.sin(p)*m; real=Math.cos(p)*m; } public function set phase(p:Number) { var m=mod; im=Math.sin(p)*m; real=Math.cos(p)*m; } public function get phase():Number { return Math.atan2(im,real); } public function addEq(x:Complex):void { im+=x.im; real+=x.real; } public function addClone(x:Complex):Complex { return new Complex(real+x.real,im+x.im); } public function subEq(x:Complex):void { im-=x.im; real-=x.real; } public function subClone(x:Complex):Complex { return new Complex(real-x.real,im-x.im); } public function mulEq(x:Complex):void { var realT:Number=x.real*real-x.im*im; im=x.real*im+x.im*real; real=realT; } public function mulClone(x:Complex):Complex { return new Complex( x.real*real-x.im*im, x.real*im+x.im*real ); } public function divEq(x:Complex):void { var divisor:Number=x.real*x.real+x.im*x.im; var realT:Number=(real*x.real+im*x.im)/divisor; im=(im*x.real-real*x.im)/divisor; } public function intDivEq(x:Number):void { im/=x; real/=x; } public function negEq():void { im=-im; real=-real; } public function clone():Complex { return new Complex(real,im); } public function toString():String { return real+"+i"+im; } } }