#ifndef VECTOR_H
#define VECTOR_H

//
//  ============================================================
//
//                        Vector.h
//
//  ============================================================
//
//
//      Copyright (C) 1992,1993,1994,1995,1996 
//
//                      Professor Kenneth I. Joy
//                      Computer Science Department
//                      University of California
//                      Davis, CA  95616
//
//      Permission is granted to use at your own risk and 
//      distribute this software in source and binary forms 
//      provided the above copyright notice and this paragraph 
//      are preserved on all copies.  This software is provided 
//      "as is" with no express or implied warranty.
//
//
//  ============================================================
//


class   Vector {

   private :
        
      double            _vx, _vy, _vz ;

   public :

                        //  Constructors

      Vector () ;

      Vector ( const double, const double = 0.0, const double = 0.0 ) ;

                        //  Copy Constructor

      Vector ( const Vector& ) ;

                        //  Destructor

      virtual ~Vector () ;

                        //  Assignment

      Vector& operator= ( const Vector& ) ;

                        //  Output

      friend ostream& operator<< ( ostream&, const Vector& ) ;

                        //  Comparison

      friend int operator== ( const Vector&, const Vector& ) ;
      friend int operator!= ( const Vector&, const Vector& ) ;

                        //  Sum, Difference, Scalar Product

      friend Vector operator+ ( const Vector&, const Vector& ) ;
      friend Vector operator- ( const Vector&, const Vector& ) ;
      friend Vector operator- ( const Vector& ) ;
      friend Vector operator* ( const double&, const Vector& ) ;
      friend Vector operator* ( const Vector&, const double& ) ;
      friend Vector operator/ ( const Vector&, const double& ) ;

                        //  Immediate Sum, Difference, Scalar Product

      Vector& operator+= ( const Vector& ) ;
      Vector& operator-= ( const Vector& ) ;
      Vector& operator*= ( const double& ) ;
      Vector& operator/= ( const double& ) ;

                        //  Member Functions
                           //  Dot Product

      friend double dot ( const Vector&, const Vector& ) ;

                           //  Cross Product

      friend Vector cross ( const Vector&, const Vector& ) ;

                           //  Normalization, Make it a unit Vector

      void normalize () ;

                           //  Vector Length

      double length () const ;

                        //  Access Functions to get 
                        //    x-coordinate, y-coordinate or
                        //    z-coordinate of the vector

      double x () const { return _vx ; } ;
      double y () const { return _vy ; } ;
      double z () const { return _vz ; } ;

   } ;

                        //  The global constant Vectors

const Vector VZero ( 0.0, 0.0, 0.0 ) ;
const Vector VX    ( 1.0, 0.0, 0.0 ) ;
const Vector VY    ( 0.0, 1.0, 0.0 ) ;
const Vector VZ    ( 0.0, 0.0, 1.0 ) ;

#endif