Figure 15.
POOR_COORDINATES body.
------------------------------------------------------------
-- The body of the much-maligned package in Figure 1.
with MATH_LIB; -- Meridian Ada utility package
package body POOR_COORDINATES is
PI : constant float := MATH_LIB.PI;
function Transform(RP : Rectangular_points)
return Polar_points is
RADIANS_TO_DEGREES : constant float
:= 180.0 / PI;
X : Polar_points;
R_SQUARED : integer;
ANGLE, NORTH, EAST : float;
begin
R_SQUARED := RP.NORTH * RP.NORTH + RP.EAST * RP.EAST;
X.R := integer(MATH_LIB.Sqrt(float(R_SQUARED)));
if RP.NORTH = 0 then
if RP.EAST >= 0 then
X.THETA := 90.0;
else
X.THETA := 270.0;
end if;
return X;
end if;
NORTH := float(RP.NORTH);
EAST := float(RP.EAST);
if NORTH > 0.0 and EAST >= 0.0 then -- 0 to 90 degrees
ANGLE := MATH_LIB.Atan(EAST/NORTH);
elsif NORTH < 0.0 and EAST >= 0.0 then -- 90 to 180 deg
ANGLE := PI - MATH_LIB.Atan(EAST/(-NORTH));
elsif NORTH < 0.0 and EAST < 0.0 then -- 180 to 270 deg
ANGLE := PI + MATH_LIB.Atan(EAST/NORTH);
elsif NORTH > 0.0 and EAST < 0.0 then -- 270 to 360 deg
ANGLE := 2.0 * PI - MATH_LIB.Atan(-EAST/NORTH);
end if;
X.THETA := ANGLE * RADIANS_TO_DEGREES;
return X;
exception
when NUMERIC_ERROR =>
if EAST >= 0.0 then
X.THETA := 90.0;
else
X.THETA := 270.0;
end if;
return X;
end Transform;
function Transform(PP : Polar_points)
return Rectangular_points is
DEGREES_TO_RADIANS : constant float
:= PI / 180.0;
ANGLE : float;
X : Rectangular_points;
begin
ANGLE := PP.THETA * DEGREES_TO_RADIANS;
X.NORTH := integer(float(PP.R) * MATH_LIB.Cos(ANGLE));
X.EAST := integer(float(PP.R) * MATH_LIB.Sin(ANGLE));
return X;
end Transform;
end POOR_COORDINATES;