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;
}
}
}