[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]