[Back to MATH SWAG index] [Back to Main SWAG index] [Original]

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

[Back to MATH SWAG index] [Back to Main SWAG index] [Original]