
{Just for grins, here's a complex number unit I wrote come time back:}

unit complex;
(*
 polar/rectangular conversions and complex math
 Steve Rogers, ~1993
*)

{----------------------}
interface

type
  tComplex=record
    r,             { real component }
    x              { imaginary component }
      : real;
  end;

procedure r2p(var r,p : tComplex);
procedure p2r(var p,r : tComplex);
procedure c_add(var c1,c2,c3 : tComplex);
procedure c_sub(var c1,c2,c3 : tComplex);
procedure c_mult(var c1,c2,c3 : tComplex);
procedure c_div(var c1,c2,c3 : tComplex);

implementation

const
  RADS=0.0174532; { degree to radian conversion constant }

{----------------------}
procedure r2p(var r,p : tComplex);
{ returns polar in degrees in p, given rectangular in r }
begin
  p.r:= sqrt(sqr(r.r)+sqr(r.x));
  p.x:= arctan(r.x/r.r)/RADS;
end;

{----------------------}
procedure p2r(var p,r : tComplex);
{ returns rectangular in r, given polar in degrees in p }
begin
  r.r:= p.r*cos(p.x*RADS);
  r.x:= p.r*sin(p.x*RADS);
end;

{----------------------}
procedure c_add(var c1,c2,c3 : tComplex);
{ adds c2 to c1, places result in c3 }
begin
  c3.r:= c1.r+c2.r;
  c3.x:= c1.x+c2.x;
end;

{----------------------}
procedure c_sub(var c1,c2,c3 : tComplex);
{ subtracts c2 from c1, places result in c3 }
begin
  c3.r:= c1.r-c2.r;
  c3.x:= c1.x-c2.x;
end;

{----------------------}
procedure c_mult(var c1,c2,c3 : tComplex);
{ multiplies c1 by c2, places result in c3  }
begin
  c3.r:= (c1.r*c2.r)-(c1.x*c2.x);
  c3.x:= (c1.r*c2.x)+(c1.x*c2.r);
end;

{----------------------}
procedure c_div(var c1,c2,c3 : tComplex);
{ divides c1 by c2, places result in c3  }
var
  p1,p2,p3 : tComplex;

begin
  r2p(c1,p1);                          { convert c1 to polar form }
  r2p(c2,p2);                          { convert c2 to polar form }
  p3.r:= p1.r/p2.r;                    { divide real component    }
  p3.x:= p1.x-p2.x;                    { subtract imaginary component }
  if (p3.x<0) then p3.x:= p3.x+180;    { Pretty it up                 }
  p2r(p3,c3);                          { convert c3 back to rectangular }
end;
