File : generic_rectangular_vectors.ads


------------------------------------------------------------------------------
--
--  package Generic_Rectangular_Vectors (spec)
--
------------------------------------------------------------------------------
--  Update information:
--
--  1995.12.27 (Jacob Sparre Andersen)
--    Written.
--
--  1996.06.25 (Jacob Sparre Andersen)
--    Reformatted the header.
--    Corrected a few bugs.
--
--  (Insert additional update information above this line.)
------------------------------------------------------------------------------

generic

   type Scalar is digits <>;

   Dimensions : Positive;

package Generic_Rectangular_Vectors is

   ---------------------------------------------------------------------------
   --  Types:

   type Vector is array (1 .. Dimensions) of Scalar;
   type Point  is new Vector;

   ---------------------------------------------------------------------------
   --  Constants:

   Null_Vector : constant Vector := (others => 0.0);
   Origo       : constant Point  := (others => 0.0);

   ---------------------------------------------------------------------------
   --  Operations with Vector result

   function "+" (Left, Right : in Vector) return Vector;

   function "-" (Left, Right : in Vector) return Vector;

   function "-" (Left, Right : in Point) return Vector;

   function "-" (Right : in Vector) return Vector;

   function "*" (Left  : in Scalar;
                 Right : in Vector) return Vector;

   function "*" (Left  : in Vector;
                 Right : in Scalar) return Vector;

   function "/" (Left  : in Vector;
                 Right : in Scalar) return Vector;

   ---------------------------------------------------------------------------
   -- Operations with Point result:

   function "+" (Left  : in Point;
                 Right : in Vector) return Point;

   function "-" (Left  : in Point;
                 Right : in Vector) return Point;

   ---------------------------------------------------------------------------
   --  Operations with scalar result:

   function "*" (Left, Right : in Vector) return Scalar;

   ---------------------------------------------------------------------------
   --  Various subroutines:

   function Length (Item : in Vector) return Scalar;

   function Squared_Length (Item : in Vector) return Scalar;

   procedure Normalize (Item : in out Vector);

   function Unit_Vector (Item : in Vector) return Vector;

   function Project (V  : in Vector;
                     On : in Vector) return Vector;

   function Mirror (Ray            : in Vector;
                    Surface_Normal : in Vector) return Vector;

   function Distance (A, B : in Point) return Scalar;

   function Squared_Distance (A, B : in Point) return Scalar;

   ---------------------------------------------------------------------------
   --  Image and Value:

   function Image (Item : in Vector) return String;

   function Image (Item : in Point) return String;

   function Value (Item : in String) return Vector;

   function Value (Item : in String) return Point;

   ---------------------------------------------------------------------------

end Generic_Rectangular_Vectors;