INTERFACE R3;

    (*
          Linear algebra in R^3
          
          Author: Jorge Stolfi
          
          Last edited: M.Carrard - 31/04/93 - Transcricao para modula-3
                       Rober M. Rosi - 04/07/94 - Inclusao da rotina length
          
     *)
     
TYPE  T = ARRAY [0..2] OF REAL;
    
CONST Zero = T{0.0, 0.0, 0.0};

(* Procedimentos *)

PROCEDURE add( x, y: T ): T;          (* add := x + y; *)

PROCEDURE sub( x, y: T ): T;          (* sub := x - y; *)

PROCEDURE neg( x: T ): T;             (* neg := - x; *)

PROCEDURE scale( x: T; a: REAL ): T;  (* scale := x * a; *)

PROCEDURE mult( x: T; a: T ): T;      (* multi-scale := x[i]*a[i] *)

PROCEDURE reduce_inf( x: T ): T;      (* scales x to unit L_infinity norm *)
                                                 
PROCEDURE reduce( x: T ): T;          (* scales x to unit Euclidean norm *)
                                                
PROCEDURE dot( x, y: T ): REAL;       (* dot product: sum of x[i]*y[i] *)

PROCEDURE ddot( x, y: T ): LONGREAL;  (* double-precision version of "dot" *)

PROCEDURE cross( p, q: T ): T;        (* cross-product: cross := p x q; *)

PROCEDURE area(READONLY a, b, c: T): REAL;  (* Area of triangle "abc" *)

PROCEDURE orthize( x,u: T ): T;       (* component of x orthogonal to u *)

PROCEDURE length( x: T ): LONGREAL;   (* length(x) *)

END R3.




