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;