// @(#)root/mathcore:$Id$
// Authors: W. Brown, M. Fischler, L. Moneta    2005

 /**********************************************************************
  *                                                                    *
  * Copyright (c) 2005 , LCG ROOT MathLib Team and                     *
  *                      FNAL LCG ROOT MathLib Team                    *
  *                                                                    *
  *                                                                    *
  **********************************************************************/

// Header source file for class DisplacementVector3D
//
// Created by: Lorenzo Moneta  at Mon May 30 12:21:43 2005
// Major rewrite: M. FIschler  at Wed Jun  8  2005
//
// Last update: $Id$
//

#ifndef ROOT_Math_GenVector_DisplacementVector3D
#define ROOT_Math_GenVector_DisplacementVector3D  1

#ifndef ROOT_Math_GenVector_Cartesian3D
#include "Math/GenVector/Cartesian3D.h"
#endif

#ifndef ROOT_Math_GenVector_PositionVector3Dfwd
#include "Math/GenVector/PositionVector3Dfwd.h"
#endif

#ifndef ROOT_Math_GenVector_GenVectorIO
#include "Math/GenVector/GenVectorIO.h"
#endif

#ifndef ROOT_Math_GenVector_BitReproducible
#include "Math/GenVector/BitReproducible.h"
#endif

#ifndef ROOT_Math_GenVector_CoordinateSystemTags
#include "Math/GenVector/CoordinateSystemTags.h"
#endif

#include <cassert>

//doxygen tag
/**
   @defgroup GenVector GenVector
   Generic 2D, 3D and 4D vectors classes and their transformations (rotations). More information is available at the
   home page for \ref Vector
 */




namespace ROOT {

  namespace Math {


//__________________________________________________________________________________________
    /**
     Class describing a generic displacement vector in 3 dimensions.
     This class is templated on the type of Coordinate system.
     One example is the XYZVector which is a vector based on
     double precision x,y,z data members by using the
     ROOT::Math::Cartesian3D<double> Coordinate system.
     The class is having also an extra template parameter, the coordinate system tag,
     to be able to identify (tag) vector described in different reference coordinate system,
     like global or local coordinate systems.

     @ingroup GenVector
    */

    template <class CoordSystem, class Tag = DefaultCoordinateSystemTag >
    class DisplacementVector3D {

    public:

      typedef typename CoordSystem::Scalar Scalar;
      typedef CoordSystem CoordinateType;
      typedef Tag  CoordinateSystemTag;

      // ------ ctors ------

      /**
          Default constructor. Construct an empty object with zero values
      */
      DisplacementVector3D ( ) :   fCoordinates()  { }


      /**
         Construct from three values of type <em>Scalar</em>.
         In the case of a XYZVector the values are x,y,z
         In the case of  a polar vector they are r,theta, phi
      */
      DisplacementVector3D(Scalar a, Scalar b, Scalar c) :
        fCoordinates ( a , b,  c )  { }

     /**
          Construct from a displacement vector expressed in different
          coordinates, or using a different Scalar type, but with same coordinate system tag
      */
      template <class OtherCoords>
      explicit DisplacementVector3D( const DisplacementVector3D<OtherCoords, Tag> & v) :
        fCoordinates ( v.Coordinates() ) { }


      /**
         Construct from a position vector expressed in different coordinates
         but with the same coordinate system tag
      */
      template <class OtherCoords>
      explicit DisplacementVector3D( const PositionVector3D<OtherCoords,Tag> & p) :
        fCoordinates ( p.Coordinates() ) { }


      /**
          Construct from a foreign 3D vector type, for example, Hep3Vector
          Precondition: v must implement methods x(), y() and z()
      */
      template <class ForeignVector>
      explicit DisplacementVector3D( const ForeignVector & v) :
        fCoordinates ( Cartesian3D<Scalar>( v.x(), v.y(), v.z() ) ) { }


#ifdef LATER
      /**
         construct from a generic linear algebra  vector of at least size 3
         implementing operator [].
         \par v  LAVector
         \par index0   index where coordinates starts (typically zero)
         It works for all Coordinates types,
         ( x= v[index0] for Cartesian and r=v[index0] for Polar )
      */
      template <class LAVector>
      DisplacementVector3D(const LAVector & v, size_t index0 ) {
        fCoordinates = CoordSystem ( v[index0], v[index0+1], v[index0+2] );
      }
#endif

      // compiler-generated copy ctor and dtor are fine.

      // ------ assignment ------

      /**
          Assignment operator from a displacement vector of arbitrary type
      */
      template <class OtherCoords>
      DisplacementVector3D & operator=
                        ( const DisplacementVector3D<OtherCoords, Tag> & v) {
        fCoordinates = v.Coordinates();
        return *this;
      }

      /**
         Assignment operator from a position vector
         (not necessarily efficient unless one or the other is Cartesian)
      */
      template <class OtherCoords>
      DisplacementVector3D & operator=
                        ( const PositionVector3D<OtherCoords,Tag> & rhs) {
         SetXYZ(rhs.x(), rhs.y(), rhs.z());
         return *this;
      }


      /**
          Assignment from a foreign 3D vector type, for example, Hep3Vector
          Precondition: v must implement methods x(), y() and z()
      */
      template <class ForeignVector>
      DisplacementVector3D & operator= ( const ForeignVector & v) {
        SetXYZ( v.x(),  v.y(), v.z() );
        return *this;
      }


#ifdef LATER
      /**
         assign from a generic linear algebra  vector of at least size 3
         implementing operator []. This could be also a C array
         \par v  LAVector
         \par index0   index where coordinates starts (typically zero)
         It works for all Coordinates types,
         ( x= v[index0] for Cartesian and r=v[index0] for Polar )
      */
      template <class LAVector>
      DisplacementVector3D & assignFrom(const LAVector & v, size_t index0 = 0) {
        fCoordinates = CoordSystem  ( v[index0], v[index0+1], v[index0+2] );
        return *this;
      }
#endif

      // ------ Set, Get, and access coordinate data ------

      /**
          Retrieve a copy of the coordinates object
      */
      CoordSystem Coordinates() const {
        return fCoordinates;
      }

      /**
         Set internal data based on a C-style array of 3 Scalar numbers
       */
      DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( const Scalar src[] )
       { fCoordinates.SetCoordinates(src); return *this; }

      /**
         Set internal data based on 3 Scalar numbers
       */
      DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( Scalar a, Scalar b, Scalar c )
       { fCoordinates.SetCoordinates(a, b, c); return *this; }

      /**
         Set internal data based on 3 Scalars at *begin to *end
       */
      template <class IT>
#ifndef NDEBUG
      DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( IT begin, IT end  )
#else
      DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( IT begin, IT /* end */  )
#endif
      { IT a = begin; IT b = ++begin; IT c = ++begin;
        assert (++begin==end);
        SetCoordinates (*a,*b,*c);
        return *this;
      }

      /**
         get internal data into 3 Scalar numbers
       */
      void GetCoordinates( Scalar& a, Scalar& b, Scalar& c ) const
                            { fCoordinates.GetCoordinates(a, b, c);  }

      /**
         get internal data into a C-style array of 3 Scalar numbers
       */
      void GetCoordinates( Scalar dest[] ) const
                            { fCoordinates.GetCoordinates(dest);  }

      /**
         get internal data into 3 Scalars at *begin to *end (3 past begin)
       */
      template <class IT>
#ifndef NDEBUG
      void GetCoordinates( IT begin, IT end ) const
#else
      void GetCoordinates( IT begin, IT /* end */ ) const
#endif
      { IT a = begin; IT b = ++begin; IT c = ++begin;
        assert (++begin==end);
        GetCoordinates (*a,*b,*c);
      }
      /**
         get internal data into 3 Scalars starting at *begin
       */
      template <class IT>
      void GetCoordinates( IT begin) const {
         Scalar a,b,c = 0;
         GetCoordinates (a,b,c);
         *begin++ = a;
         *begin++ = b;
         *begin = c;
      }

      /**
         set the values of the vector from the cartesian components (x,y,z)
         (if the vector is held in polar or cylindrical eta coordinates,
         then (x, y, z) are converted to that form)
       */
      DisplacementVector3D<CoordSystem, Tag>& SetXYZ (Scalar a, Scalar b, Scalar c) {
            fCoordinates.SetXYZ(a,b,c);
            return *this;
      }

      // ------------------- Equality -----------------

      /**
        Exact equality
       */
      bool operator==(const DisplacementVector3D & rhs) const {
        return fCoordinates==rhs.fCoordinates;
      }
      bool operator!= (const DisplacementVector3D & rhs) const {
        return !(operator==(rhs));
      }

      // ------ Individual element access, in various coordinate systems ------

      /**
          Cartesian X, converting if necessary from internal coordinate system.
      */
      Scalar X() const { return fCoordinates.X(); }

      /**
          Cartesian Y, converting if necessary from internal coordinate system.
      */
      Scalar Y() const { return fCoordinates.Y(); }

      /**
          Cartesian Z, converting if necessary from internal coordinate system.
      */
      Scalar Z() const { return fCoordinates.Z(); }

      /**
          Polar R, converting if necessary from internal coordinate system.
      */
      Scalar R() const { return fCoordinates.R(); }

      /**
          Polar theta, converting if necessary from internal coordinate system.
      */
      Scalar Theta() const { return fCoordinates.Theta(); }

      /**
          Polar phi, converting if necessary from internal coordinate system.
      */
      Scalar Phi() const { return fCoordinates.Phi(); }

      /**
          Polar eta, converting if necessary from internal coordinate system.
      */
      Scalar Eta() const { return fCoordinates.Eta(); }

      /**
          Cylindrical transverse component rho
      */
      Scalar Rho() const { return fCoordinates.Rho(); }

      // ----- Other fundamental properties -----

      /**
          Magnitute squared ( r^2 in spherical coordinate)
      */
      Scalar Mag2() const { return fCoordinates.Mag2();}

      /**
         Transverse component squared (rho^2 in cylindrical coordinates.
      */
      Scalar Perp2() const { return fCoordinates.Perp2();}

      /**
         return unit vector parallel to this
      */
      DisplacementVector3D  Unit() const {
        Scalar tot = R();
        return tot == 0 ? *this : DisplacementVector3D(*this) / tot;
      }

      // ------ Setting of individual elements present in coordinate system ------

      /**
         Change X - Cartesian3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetX (Scalar xx) { fCoordinates.SetX(xx); return *this;}

      /**
         Change Y - Cartesian3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetY (Scalar yy) { fCoordinates.SetY(yy); return *this;}

      /**
         Change Z - Cartesian3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetZ (Scalar zz) { fCoordinates.SetZ(zz); return *this;}

      /**
         Change R - Polar3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetR (Scalar rr) { fCoordinates.SetR(rr); return *this;}

      /**
         Change Theta - Polar3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetTheta (Scalar ang) { fCoordinates.SetTheta(ang); return *this;}

      /**
         Change Phi - Polar3D or CylindricalEta3D coordinates
      */
       DisplacementVector3D<CoordSystem, Tag>& SetPhi (Scalar ang) { fCoordinates.SetPhi(ang); return *this;}

      /**
         Change Rho - CylindricalEta3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetRho (Scalar rr) { fCoordinates.SetRho(rr); return *this;}

      /**
         Change Eta - CylindricalEta3D coordinates only
      */
       DisplacementVector3D<CoordSystem, Tag>& SetEta (Scalar etaval) { fCoordinates.SetEta(etaval); return *this;}


      // ------ Operations combining two vectors ------
      // -- need to have the specialized version in order to avoid

      /**
       Return the scalar (dot) product of two displacement vectors.
       It is possible to perform the product for any type of vector coordinates,
       but they must have the same coordinate system tag
      */
      template< class OtherCoords >
      Scalar Dot( const  DisplacementVector3D<OtherCoords,Tag>  & v) const {
        return X()*v.X() + Y()*v.Y() + Z()*v.Z();
      }
      /**
          Return the scalar (dot) product of two vectors.
          It is possible to perform the product for any classes
          implementing x(), y() and z() member functions
      */
      template< class OtherVector >
      Scalar Dot( const  OtherVector & v) const {
        return X()*v.x() + Y()*v.y() + Z()*v.z();
      }

      /**
       Return vector (cross) product of two displacement vectors,
       as a vector in the coordinate system of this class.
       It is possible to perform the product for any type of vector coordinates,
       but they must have the same coordinate system tag
      */
      template <class OtherCoords>
      DisplacementVector3D Cross( const DisplacementVector3D<OtherCoords,Tag>  & v) const {
        DisplacementVector3D  result;
        result.SetXYZ (  Y()*v.Z() - v.Y()*Z(),
                         Z()*v.X() - v.Z()*X(),
                         X()*v.Y() - v.X()*Y() );
        return result;
      }
      /**
         Return vector (cross) product of two  vectors,
         as a vector in the coordinate system of this class.
          It is possible to perform the product for any classes
          implementing X(), Y() and Z() member functions
      */
      template <class OtherVector>
      DisplacementVector3D Cross( const OtherVector & v) const {
        DisplacementVector3D  result;
        result.SetXYZ (  Y()*v.z() - v.y()*Z(),
                         Z()*v.x() - v.z()*X(),
                         X()*v.y() - v.x()*Y() );
        return result;
      }



      /**
          Self Addition with a displacement vector.
      */
      template <class OtherCoords>
      DisplacementVector3D & operator+=
                        (const  DisplacementVector3D<OtherCoords,Tag> & v) {
        SetXYZ(  X() + v.X(), Y() + v.Y(), Z() + v.Z() );
        return *this;
      }

      /**
          Self Difference with a displacement vector.
      */
      template <class OtherCoords>
      DisplacementVector3D & operator-=
                        (const  DisplacementVector3D<OtherCoords,Tag> & v) {
        SetXYZ(  x() - v.x(), y() - v.y(), z() - v.z() );
        return *this;
      }


      /**
         multiply this vector by a scalar quantity
      */
      DisplacementVector3D & operator*= (Scalar a) {
        fCoordinates.Scale(a);
        return *this;
      }

      /**
         divide this vector by a scalar quantity
      */
      DisplacementVector3D & operator/= (Scalar a) {
        fCoordinates.Scale(1/a);
        return *this;
      }

      // The following methods (v*a and v/a) could instead be free functions.
      // They were moved into the class to solve a problem on AIX.

      /**
        Multiply a vector by a real number
      */
      DisplacementVector3D operator * ( Scalar a ) const {
        DisplacementVector3D tmp(*this);
        tmp *= a;
        return tmp;
      }

      /**
         Negative of the vector
       */
      DisplacementVector3D operator - ( ) const {
        return operator*( Scalar(-1) );
      }

      /**
         Positive of the vector, return itself
       */
      DisplacementVector3D operator + ( ) const {return *this;}

      /**
         Division of a vector with a real number
       */
      DisplacementVector3D operator/ (Scalar a) const {
        DisplacementVector3D tmp(*this);
        tmp /= a;
        return tmp;
      }


      // Methods providing limited backward name compatibility with CLHEP

      Scalar x()     const { return fCoordinates.X();     }
      Scalar y()     const { return fCoordinates.Y();     }
      Scalar z()     const { return fCoordinates.Z();     }
      Scalar r()     const { return fCoordinates.R();     }
      Scalar theta() const { return fCoordinates.Theta(); }
      Scalar phi()   const { return fCoordinates.Phi();   }
      Scalar eta()   const { return fCoordinates.Eta();   }
      Scalar rho()   const { return fCoordinates.Rho();   }
      Scalar mag2()  const { return fCoordinates.Mag2();  }
      Scalar perp2() const { return fCoordinates.Perp2(); }
      DisplacementVector3D unit() const {return Unit();}


    private:

       CoordSystem fCoordinates;  // internal coordinate system

#ifdef NOT_SURE_THIS_SHOULD_BE_FORBIDDEN
      /**
         Cross product involving a position vector is inappropriate
      */
      template <class T2>
      DisplacementVector3D Cross( const PositionVector3D<T2> & ) const;
#endif

      // the following methods should not compile

      // this should not compile (if from a vector or points with different tag
      template <class OtherCoords, class OtherTag>
      explicit DisplacementVector3D( const DisplacementVector3D<OtherCoords, OtherTag> & ) {}

      template <class OtherCoords, class OtherTag>
      explicit DisplacementVector3D( const PositionVector3D<OtherCoords, OtherTag> & ) {}

      template <class OtherCoords, class OtherTag>
      DisplacementVector3D & operator=( const DisplacementVector3D<OtherCoords, OtherTag> & );


      template <class OtherCoords, class OtherTag>
      DisplacementVector3D & operator=( const PositionVector3D<OtherCoords, OtherTag> & );

      template <class OtherCoords, class OtherTag>
      DisplacementVector3D & operator+=(const  DisplacementVector3D<OtherCoords, OtherTag> & );

      template <class OtherCoords, class OtherTag>
      DisplacementVector3D & operator-=(const  DisplacementVector3D<OtherCoords, OtherTag> & );

      template<class OtherCoords, class OtherTag >
      Scalar Dot( const  DisplacementVector3D<OtherCoords, OtherTag> &  ) const;

      template<class OtherCoords, class OtherTag >
      DisplacementVector3D Cross( const  DisplacementVector3D<OtherCoords, OtherTag> &  ) const;


    };

// ---------- DisplacementVector3D class template ends here ------------
// ---------------------------------------------------------------------



   /**
        Addition of DisplacementVector3D vectors.
        The (coordinate system) type of the returned vector is defined to
        be identical to that of the first vector, which is passed by value
    */
    template <class CoordSystem1, class CoordSystem2, class U>
    inline
    DisplacementVector3D<CoordSystem1,U>
    operator+(       DisplacementVector3D<CoordSystem1,U> v1,
               const DisplacementVector3D<CoordSystem2,U>  & v2) {
      return v1 += v2;
    }

    /**
        Difference between two DisplacementVector3D vectors.
        The (coordinate system) type of the returned vector is defined to
        be identical to that of the first vector.
    */
    template <class CoordSystem1, class CoordSystem2, class U>
    inline
    DisplacementVector3D<CoordSystem1,U>
    operator-( DisplacementVector3D<CoordSystem1,U> v1,
               DisplacementVector3D<CoordSystem2,U> const & v2) {
      return v1 -= v2;
    }

    //#endif // not __CINT__

    /**
       Multiplication of a displacement vector by real number  a*v
    */
    template <class CoordSystem, class U>
    inline
    DisplacementVector3D<CoordSystem,U>
    operator * ( typename DisplacementVector3D<CoordSystem,U>::Scalar a,
                 DisplacementVector3D<CoordSystem,U> v) {
      return v *= a;
      // Note - passing v by value and using operator *= may save one
      // copy relative to passing v by const ref and creating a temporary.
    }


    // v1*v2 notation for Cross product of two vectors is omitted,
    // since it is always confusing as to whether dot product is meant.



    // ------------- I/O to/from streams -------------

    template< class char_t, class traits_t, class T, class U >
      inline
      std::basic_ostream<char_t,traits_t> &
      operator << ( std::basic_ostream<char_t,traits_t> & os
                  , DisplacementVector3D<T,U> const & v
                  )
    {
      if( !os )  return os;

      typename T::Scalar a, b, c;
      v.GetCoordinates(a, b, c);

      if( detail::get_manip( os, detail::bitforbit ) )  {
        detail::set_manip( os, detail::bitforbit, '\00' );
        typedef GenVector_detail::BitReproducible BR;
        BR::Output(os, a);
        BR::Output(os, b);
        BR::Output(os, c);
      }
      else  {
        os << detail::get_manip( os, detail::open  ) << a
           << detail::get_manip( os, detail::sep   ) << b
           << detail::get_manip( os, detail::sep   ) << c
           << detail::get_manip( os, detail::close );
      }

      return os;

    }  // op<< <>()


    template< class char_t, class traits_t, class T, class U >
      inline
      std::basic_istream<char_t,traits_t> &
      operator >> ( std::basic_istream<char_t,traits_t> & is
                  , DisplacementVector3D<T,U> & v
                  )
    {
      if( !is )  return is;

      typename T::Scalar a, b, c;

      if( detail::get_manip( is, detail::bitforbit ) )  {
        detail::set_manip( is, detail::bitforbit, '\00' );
        typedef GenVector_detail::BitReproducible BR;
        BR::Input(is, a);
        BR::Input(is, b);
        BR::Input(is, c);
      }
      else  {
        detail::require_delim( is, detail::open  );  is >> a;
        detail::require_delim( is, detail::sep   );  is >> b;
        detail::require_delim( is, detail::sep   );  is >> c;
        detail::require_delim( is, detail::close );
      }

      if( is )
        v.SetCoordinates(a, b, c);
      return is;

    }  // op>> <>()



  }  // namespace Math

}  // namespace ROOT


#endif /* ROOT_Math_GenVector_DisplacementVector3D  */

 DisplacementVector3D.h:1
 DisplacementVector3D.h:2
 DisplacementVector3D.h:3
 DisplacementVector3D.h:4
 DisplacementVector3D.h:5
 DisplacementVector3D.h:6
 DisplacementVector3D.h:7
 DisplacementVector3D.h:8
 DisplacementVector3D.h:9
 DisplacementVector3D.h:10
 DisplacementVector3D.h:11
 DisplacementVector3D.h:12
 DisplacementVector3D.h:13
 DisplacementVector3D.h:14
 DisplacementVector3D.h:15
 DisplacementVector3D.h:16
 DisplacementVector3D.h:17
 DisplacementVector3D.h:18
 DisplacementVector3D.h:19
 DisplacementVector3D.h:20
 DisplacementVector3D.h:21
 DisplacementVector3D.h:22
 DisplacementVector3D.h:23
 DisplacementVector3D.h:24
 DisplacementVector3D.h:25
 DisplacementVector3D.h:26
 DisplacementVector3D.h:27
 DisplacementVector3D.h:28
 DisplacementVector3D.h:29
 DisplacementVector3D.h:30
 DisplacementVector3D.h:31
 DisplacementVector3D.h:32
 DisplacementVector3D.h:33
 DisplacementVector3D.h:34
 DisplacementVector3D.h:35
 DisplacementVector3D.h:36
 DisplacementVector3D.h:37
 DisplacementVector3D.h:38
 DisplacementVector3D.h:39
 DisplacementVector3D.h:40
 DisplacementVector3D.h:41
 DisplacementVector3D.h:42
 DisplacementVector3D.h:43
 DisplacementVector3D.h:44
 DisplacementVector3D.h:45
 DisplacementVector3D.h:46
 DisplacementVector3D.h:47
 DisplacementVector3D.h:48
 DisplacementVector3D.h:49
 DisplacementVector3D.h:50
 DisplacementVector3D.h:51
 DisplacementVector3D.h:52
 DisplacementVector3D.h:53
 DisplacementVector3D.h:54
 DisplacementVector3D.h:55
 DisplacementVector3D.h:56
 DisplacementVector3D.h:57
 DisplacementVector3D.h:58
 DisplacementVector3D.h:59
 DisplacementVector3D.h:60
 DisplacementVector3D.h:61
 DisplacementVector3D.h:62
 DisplacementVector3D.h:63
 DisplacementVector3D.h:64
 DisplacementVector3D.h:65
 DisplacementVector3D.h:66
 DisplacementVector3D.h:67
 DisplacementVector3D.h:68
 DisplacementVector3D.h:69
 DisplacementVector3D.h:70
 DisplacementVector3D.h:71
 DisplacementVector3D.h:72
 DisplacementVector3D.h:73
 DisplacementVector3D.h:74
 DisplacementVector3D.h:75
 DisplacementVector3D.h:76
 DisplacementVector3D.h:77
 DisplacementVector3D.h:78
 DisplacementVector3D.h:79
 DisplacementVector3D.h:80
 DisplacementVector3D.h:81
 DisplacementVector3D.h:82
 DisplacementVector3D.h:83
 DisplacementVector3D.h:84
 DisplacementVector3D.h:85
 DisplacementVector3D.h:86
 DisplacementVector3D.h:87
 DisplacementVector3D.h:88
 DisplacementVector3D.h:89
 DisplacementVector3D.h:90
 DisplacementVector3D.h:91
 DisplacementVector3D.h:92
 DisplacementVector3D.h:93
 DisplacementVector3D.h:94
 DisplacementVector3D.h:95
 DisplacementVector3D.h:96
 DisplacementVector3D.h:97
 DisplacementVector3D.h:98
 DisplacementVector3D.h:99
 DisplacementVector3D.h:100
 DisplacementVector3D.h:101
 DisplacementVector3D.h:102
 DisplacementVector3D.h:103
 DisplacementVector3D.h:104
 DisplacementVector3D.h:105
 DisplacementVector3D.h:106
 DisplacementVector3D.h:107
 DisplacementVector3D.h:108
 DisplacementVector3D.h:109
 DisplacementVector3D.h:110
 DisplacementVector3D.h:111
 DisplacementVector3D.h:112
 DisplacementVector3D.h:113
 DisplacementVector3D.h:114
 DisplacementVector3D.h:115
 DisplacementVector3D.h:116
 DisplacementVector3D.h:117
 DisplacementVector3D.h:118
 DisplacementVector3D.h:119
 DisplacementVector3D.h:120
 DisplacementVector3D.h:121
 DisplacementVector3D.h:122
 DisplacementVector3D.h:123
 DisplacementVector3D.h:124
 DisplacementVector3D.h:125
 DisplacementVector3D.h:126
 DisplacementVector3D.h:127
 DisplacementVector3D.h:128
 DisplacementVector3D.h:129
 DisplacementVector3D.h:130
 DisplacementVector3D.h:131
 DisplacementVector3D.h:132
 DisplacementVector3D.h:133
 DisplacementVector3D.h:134
 DisplacementVector3D.h:135
 DisplacementVector3D.h:136
 DisplacementVector3D.h:137
 DisplacementVector3D.h:138
 DisplacementVector3D.h:139
 DisplacementVector3D.h:140
 DisplacementVector3D.h:141
 DisplacementVector3D.h:142
 DisplacementVector3D.h:143
 DisplacementVector3D.h:144
 DisplacementVector3D.h:145
 DisplacementVector3D.h:146
 DisplacementVector3D.h:147
 DisplacementVector3D.h:148
 DisplacementVector3D.h:149
 DisplacementVector3D.h:150
 DisplacementVector3D.h:151
 DisplacementVector3D.h:152
 DisplacementVector3D.h:153
 DisplacementVector3D.h:154
 DisplacementVector3D.h:155
 DisplacementVector3D.h:156
 DisplacementVector3D.h:157
 DisplacementVector3D.h:158
 DisplacementVector3D.h:159
 DisplacementVector3D.h:160
 DisplacementVector3D.h:161
 DisplacementVector3D.h:162
 DisplacementVector3D.h:163
 DisplacementVector3D.h:164
 DisplacementVector3D.h:165
 DisplacementVector3D.h:166
 DisplacementVector3D.h:167
 DisplacementVector3D.h:168
 DisplacementVector3D.h:169
 DisplacementVector3D.h:170
 DisplacementVector3D.h:171
 DisplacementVector3D.h:172
 DisplacementVector3D.h:173
 DisplacementVector3D.h:174
 DisplacementVector3D.h:175
 DisplacementVector3D.h:176
 DisplacementVector3D.h:177
 DisplacementVector3D.h:178
 DisplacementVector3D.h:179
 DisplacementVector3D.h:180
 DisplacementVector3D.h:181
 DisplacementVector3D.h:182
 DisplacementVector3D.h:183
 DisplacementVector3D.h:184
 DisplacementVector3D.h:185
 DisplacementVector3D.h:186
 DisplacementVector3D.h:187
 DisplacementVector3D.h:188
 DisplacementVector3D.h:189
 DisplacementVector3D.h:190
 DisplacementVector3D.h:191
 DisplacementVector3D.h:192
 DisplacementVector3D.h:193
 DisplacementVector3D.h:194
 DisplacementVector3D.h:195
 DisplacementVector3D.h:196
 DisplacementVector3D.h:197
 DisplacementVector3D.h:198
 DisplacementVector3D.h:199
 DisplacementVector3D.h:200
 DisplacementVector3D.h:201
 DisplacementVector3D.h:202
 DisplacementVector3D.h:203
 DisplacementVector3D.h:204
 DisplacementVector3D.h:205
 DisplacementVector3D.h:206
 DisplacementVector3D.h:207
 DisplacementVector3D.h:208
 DisplacementVector3D.h:209
 DisplacementVector3D.h:210
 DisplacementVector3D.h:211
 DisplacementVector3D.h:212
 DisplacementVector3D.h:213
 DisplacementVector3D.h:214
 DisplacementVector3D.h:215
 DisplacementVector3D.h:216
 DisplacementVector3D.h:217
 DisplacementVector3D.h:218
 DisplacementVector3D.h:219
 DisplacementVector3D.h:220
 DisplacementVector3D.h:221
 DisplacementVector3D.h:222
 DisplacementVector3D.h:223
 DisplacementVector3D.h:224
 DisplacementVector3D.h:225
 DisplacementVector3D.h:226
 DisplacementVector3D.h:227
 DisplacementVector3D.h:228
 DisplacementVector3D.h:229
 DisplacementVector3D.h:230
 DisplacementVector3D.h:231
 DisplacementVector3D.h:232
 DisplacementVector3D.h:233
 DisplacementVector3D.h:234
 DisplacementVector3D.h:235
 DisplacementVector3D.h:236
 DisplacementVector3D.h:237
 DisplacementVector3D.h:238
 DisplacementVector3D.h:239
 DisplacementVector3D.h:240
 DisplacementVector3D.h:241
 DisplacementVector3D.h:242
 DisplacementVector3D.h:243
 DisplacementVector3D.h:244
 DisplacementVector3D.h:245
 DisplacementVector3D.h:246
 DisplacementVector3D.h:247
 DisplacementVector3D.h:248
 DisplacementVector3D.h:249
 DisplacementVector3D.h:250
 DisplacementVector3D.h:251
 DisplacementVector3D.h:252
 DisplacementVector3D.h:253
 DisplacementVector3D.h:254
 DisplacementVector3D.h:255
 DisplacementVector3D.h:256
 DisplacementVector3D.h:257
 DisplacementVector3D.h:258
 DisplacementVector3D.h:259
 DisplacementVector3D.h:260
 DisplacementVector3D.h:261
 DisplacementVector3D.h:262
 DisplacementVector3D.h:263
 DisplacementVector3D.h:264
 DisplacementVector3D.h:265
 DisplacementVector3D.h:266
 DisplacementVector3D.h:267
 DisplacementVector3D.h:268
 DisplacementVector3D.h:269
 DisplacementVector3D.h:270
 DisplacementVector3D.h:271
 DisplacementVector3D.h:272
 DisplacementVector3D.h:273
 DisplacementVector3D.h:274
 DisplacementVector3D.h:275
 DisplacementVector3D.h:276
 DisplacementVector3D.h:277
 DisplacementVector3D.h:278
 DisplacementVector3D.h:279
 DisplacementVector3D.h:280
 DisplacementVector3D.h:281
 DisplacementVector3D.h:282
 DisplacementVector3D.h:283
 DisplacementVector3D.h:284
 DisplacementVector3D.h:285
 DisplacementVector3D.h:286
 DisplacementVector3D.h:287
 DisplacementVector3D.h:288
 DisplacementVector3D.h:289
 DisplacementVector3D.h:290
 DisplacementVector3D.h:291
 DisplacementVector3D.h:292
 DisplacementVector3D.h:293
 DisplacementVector3D.h:294
 DisplacementVector3D.h:295
 DisplacementVector3D.h:296
 DisplacementVector3D.h:297
 DisplacementVector3D.h:298
 DisplacementVector3D.h:299
 DisplacementVector3D.h:300
 DisplacementVector3D.h:301
 DisplacementVector3D.h:302
 DisplacementVector3D.h:303
 DisplacementVector3D.h:304
 DisplacementVector3D.h:305
 DisplacementVector3D.h:306
 DisplacementVector3D.h:307
 DisplacementVector3D.h:308
 DisplacementVector3D.h:309
 DisplacementVector3D.h:310
 DisplacementVector3D.h:311
 DisplacementVector3D.h:312
 DisplacementVector3D.h:313
 DisplacementVector3D.h:314
 DisplacementVector3D.h:315
 DisplacementVector3D.h:316
 DisplacementVector3D.h:317
 DisplacementVector3D.h:318
 DisplacementVector3D.h:319
 DisplacementVector3D.h:320
 DisplacementVector3D.h:321
 DisplacementVector3D.h:322
 DisplacementVector3D.h:323
 DisplacementVector3D.h:324
 DisplacementVector3D.h:325
 DisplacementVector3D.h:326
 DisplacementVector3D.h:327
 DisplacementVector3D.h:328
 DisplacementVector3D.h:329
 DisplacementVector3D.h:330
 DisplacementVector3D.h:331
 DisplacementVector3D.h:332
 DisplacementVector3D.h:333
 DisplacementVector3D.h:334
 DisplacementVector3D.h:335
 DisplacementVector3D.h:336
 DisplacementVector3D.h:337
 DisplacementVector3D.h:338
 DisplacementVector3D.h:339
 DisplacementVector3D.h:340
 DisplacementVector3D.h:341
 DisplacementVector3D.h:342
 DisplacementVector3D.h:343
 DisplacementVector3D.h:344
 DisplacementVector3D.h:345
 DisplacementVector3D.h:346
 DisplacementVector3D.h:347
 DisplacementVector3D.h:348
 DisplacementVector3D.h:349
 DisplacementVector3D.h:350
 DisplacementVector3D.h:351
 DisplacementVector3D.h:352
 DisplacementVector3D.h:353
 DisplacementVector3D.h:354
 DisplacementVector3D.h:355
 DisplacementVector3D.h:356
 DisplacementVector3D.h:357
 DisplacementVector3D.h:358
 DisplacementVector3D.h:359
 DisplacementVector3D.h:360
 DisplacementVector3D.h:361
 DisplacementVector3D.h:362
 DisplacementVector3D.h:363
 DisplacementVector3D.h:364
 DisplacementVector3D.h:365
 DisplacementVector3D.h:366
 DisplacementVector3D.h:367
 DisplacementVector3D.h:368
 DisplacementVector3D.h:369
 DisplacementVector3D.h:370
 DisplacementVector3D.h:371
 DisplacementVector3D.h:372
 DisplacementVector3D.h:373
 DisplacementVector3D.h:374
 DisplacementVector3D.h:375
 DisplacementVector3D.h:376
 DisplacementVector3D.h:377
 DisplacementVector3D.h:378
 DisplacementVector3D.h:379
 DisplacementVector3D.h:380
 DisplacementVector3D.h:381
 DisplacementVector3D.h:382
 DisplacementVector3D.h:383
 DisplacementVector3D.h:384
 DisplacementVector3D.h:385
 DisplacementVector3D.h:386
 DisplacementVector3D.h:387
 DisplacementVector3D.h:388
 DisplacementVector3D.h:389
 DisplacementVector3D.h:390
 DisplacementVector3D.h:391
 DisplacementVector3D.h:392
 DisplacementVector3D.h:393
 DisplacementVector3D.h:394
 DisplacementVector3D.h:395
 DisplacementVector3D.h:396
 DisplacementVector3D.h:397
 DisplacementVector3D.h:398
 DisplacementVector3D.h:399
 DisplacementVector3D.h:400
 DisplacementVector3D.h:401
 DisplacementVector3D.h:402
 DisplacementVector3D.h:403
 DisplacementVector3D.h:404
 DisplacementVector3D.h:405
 DisplacementVector3D.h:406
 DisplacementVector3D.h:407
 DisplacementVector3D.h:408
 DisplacementVector3D.h:409
 DisplacementVector3D.h:410
 DisplacementVector3D.h:411
 DisplacementVector3D.h:412
 DisplacementVector3D.h:413
 DisplacementVector3D.h:414
 DisplacementVector3D.h:415
 DisplacementVector3D.h:416
 DisplacementVector3D.h:417
 DisplacementVector3D.h:418
 DisplacementVector3D.h:419
 DisplacementVector3D.h:420
 DisplacementVector3D.h:421
 DisplacementVector3D.h:422
 DisplacementVector3D.h:423
 DisplacementVector3D.h:424
 DisplacementVector3D.h:425
 DisplacementVector3D.h:426
 DisplacementVector3D.h:427
 DisplacementVector3D.h:428
 DisplacementVector3D.h:429
 DisplacementVector3D.h:430
 DisplacementVector3D.h:431
 DisplacementVector3D.h:432
 DisplacementVector3D.h:433
 DisplacementVector3D.h:434
 DisplacementVector3D.h:435
 DisplacementVector3D.h:436
 DisplacementVector3D.h:437
 DisplacementVector3D.h:438
 DisplacementVector3D.h:439
 DisplacementVector3D.h:440
 DisplacementVector3D.h:441
 DisplacementVector3D.h:442
 DisplacementVector3D.h:443
 DisplacementVector3D.h:444
 DisplacementVector3D.h:445
 DisplacementVector3D.h:446
 DisplacementVector3D.h:447
 DisplacementVector3D.h:448
 DisplacementVector3D.h:449
 DisplacementVector3D.h:450
 DisplacementVector3D.h:451
 DisplacementVector3D.h:452
 DisplacementVector3D.h:453
 DisplacementVector3D.h:454
 DisplacementVector3D.h:455
 DisplacementVector3D.h:456
 DisplacementVector3D.h:457
 DisplacementVector3D.h:458
 DisplacementVector3D.h:459
 DisplacementVector3D.h:460
 DisplacementVector3D.h:461
 DisplacementVector3D.h:462
 DisplacementVector3D.h:463
 DisplacementVector3D.h:464
 DisplacementVector3D.h:465
 DisplacementVector3D.h:466
 DisplacementVector3D.h:467
 DisplacementVector3D.h:468
 DisplacementVector3D.h:469
 DisplacementVector3D.h:470
 DisplacementVector3D.h:471
 DisplacementVector3D.h:472
 DisplacementVector3D.h:473
 DisplacementVector3D.h:474
 DisplacementVector3D.h:475
 DisplacementVector3D.h:476
 DisplacementVector3D.h:477
 DisplacementVector3D.h:478
 DisplacementVector3D.h:479
 DisplacementVector3D.h:480
 DisplacementVector3D.h:481
 DisplacementVector3D.h:482
 DisplacementVector3D.h:483
 DisplacementVector3D.h:484
 DisplacementVector3D.h:485
 DisplacementVector3D.h:486
 DisplacementVector3D.h:487
 DisplacementVector3D.h:488
 DisplacementVector3D.h:489
 DisplacementVector3D.h:490
 DisplacementVector3D.h:491
 DisplacementVector3D.h:492
 DisplacementVector3D.h:493
 DisplacementVector3D.h:494
 DisplacementVector3D.h:495
 DisplacementVector3D.h:496
 DisplacementVector3D.h:497
 DisplacementVector3D.h:498
 DisplacementVector3D.h:499
 DisplacementVector3D.h:500
 DisplacementVector3D.h:501
 DisplacementVector3D.h:502
 DisplacementVector3D.h:503
 DisplacementVector3D.h:504
 DisplacementVector3D.h:505
 DisplacementVector3D.h:506
 DisplacementVector3D.h:507
 DisplacementVector3D.h:508
 DisplacementVector3D.h:509
 DisplacementVector3D.h:510
 DisplacementVector3D.h:511
 DisplacementVector3D.h:512
 DisplacementVector3D.h:513
 DisplacementVector3D.h:514
 DisplacementVector3D.h:515
 DisplacementVector3D.h:516
 DisplacementVector3D.h:517
 DisplacementVector3D.h:518
 DisplacementVector3D.h:519
 DisplacementVector3D.h:520
 DisplacementVector3D.h:521
 DisplacementVector3D.h:522
 DisplacementVector3D.h:523
 DisplacementVector3D.h:524
 DisplacementVector3D.h:525
 DisplacementVector3D.h:526
 DisplacementVector3D.h:527
 DisplacementVector3D.h:528
 DisplacementVector3D.h:529
 DisplacementVector3D.h:530
 DisplacementVector3D.h:531
 DisplacementVector3D.h:532
 DisplacementVector3D.h:533
 DisplacementVector3D.h:534
 DisplacementVector3D.h:535
 DisplacementVector3D.h:536
 DisplacementVector3D.h:537
 DisplacementVector3D.h:538
 DisplacementVector3D.h:539
 DisplacementVector3D.h:540
 DisplacementVector3D.h:541
 DisplacementVector3D.h:542
 DisplacementVector3D.h:543
 DisplacementVector3D.h:544
 DisplacementVector3D.h:545
 DisplacementVector3D.h:546
 DisplacementVector3D.h:547
 DisplacementVector3D.h:548
 DisplacementVector3D.h:549
 DisplacementVector3D.h:550
 DisplacementVector3D.h:551
 DisplacementVector3D.h:552
 DisplacementVector3D.h:553
 DisplacementVector3D.h:554
 DisplacementVector3D.h:555
 DisplacementVector3D.h:556
 DisplacementVector3D.h:557
 DisplacementVector3D.h:558
 DisplacementVector3D.h:559
 DisplacementVector3D.h:560
 DisplacementVector3D.h:561
 DisplacementVector3D.h:562
 DisplacementVector3D.h:563
 DisplacementVector3D.h:564
 DisplacementVector3D.h:565
 DisplacementVector3D.h:566
 DisplacementVector3D.h:567
 DisplacementVector3D.h:568
 DisplacementVector3D.h:569
 DisplacementVector3D.h:570
 DisplacementVector3D.h:571
 DisplacementVector3D.h:572
 DisplacementVector3D.h:573
 DisplacementVector3D.h:574
 DisplacementVector3D.h:575
 DisplacementVector3D.h:576
 DisplacementVector3D.h:577
 DisplacementVector3D.h:578
 DisplacementVector3D.h:579
 DisplacementVector3D.h:580
 DisplacementVector3D.h:581
 DisplacementVector3D.h:582
 DisplacementVector3D.h:583
 DisplacementVector3D.h:584
 DisplacementVector3D.h:585
 DisplacementVector3D.h:586
 DisplacementVector3D.h:587
 DisplacementVector3D.h:588
 DisplacementVector3D.h:589
 DisplacementVector3D.h:590
 DisplacementVector3D.h:591
 DisplacementVector3D.h:592
 DisplacementVector3D.h:593
 DisplacementVector3D.h:594
 DisplacementVector3D.h:595
 DisplacementVector3D.h:596
 DisplacementVector3D.h:597
 DisplacementVector3D.h:598
 DisplacementVector3D.h:599
 DisplacementVector3D.h:600
 DisplacementVector3D.h:601
 DisplacementVector3D.h:602
 DisplacementVector3D.h:603
 DisplacementVector3D.h:604
 DisplacementVector3D.h:605
 DisplacementVector3D.h:606
 DisplacementVector3D.h:607
 DisplacementVector3D.h:608
 DisplacementVector3D.h:609
 DisplacementVector3D.h:610
 DisplacementVector3D.h:611
 DisplacementVector3D.h:612
 DisplacementVector3D.h:613
 DisplacementVector3D.h:614
 DisplacementVector3D.h:615
 DisplacementVector3D.h:616
 DisplacementVector3D.h:617
 DisplacementVector3D.h:618
 DisplacementVector3D.h:619
 DisplacementVector3D.h:620
 DisplacementVector3D.h:621
 DisplacementVector3D.h:622
 DisplacementVector3D.h:623
 DisplacementVector3D.h:624
 DisplacementVector3D.h:625
 DisplacementVector3D.h:626
 DisplacementVector3D.h:627
 DisplacementVector3D.h:628
 DisplacementVector3D.h:629
 DisplacementVector3D.h:630
 DisplacementVector3D.h:631
 DisplacementVector3D.h:632
 DisplacementVector3D.h:633
 DisplacementVector3D.h:634
 DisplacementVector3D.h:635
 DisplacementVector3D.h:636
 DisplacementVector3D.h:637
 DisplacementVector3D.h:638
 DisplacementVector3D.h:639
 DisplacementVector3D.h:640
 DisplacementVector3D.h:641
 DisplacementVector3D.h:642
 DisplacementVector3D.h:643
 DisplacementVector3D.h:644
 DisplacementVector3D.h:645
 DisplacementVector3D.h:646
 DisplacementVector3D.h:647
 DisplacementVector3D.h:648
 DisplacementVector3D.h:649
 DisplacementVector3D.h:650
 DisplacementVector3D.h:651
 DisplacementVector3D.h:652
 DisplacementVector3D.h:653
 DisplacementVector3D.h:654
 DisplacementVector3D.h:655
 DisplacementVector3D.h:656
 DisplacementVector3D.h:657
 DisplacementVector3D.h:658
 DisplacementVector3D.h:659
 DisplacementVector3D.h:660
 DisplacementVector3D.h:661
 DisplacementVector3D.h:662
 DisplacementVector3D.h:663
 DisplacementVector3D.h:664
 DisplacementVector3D.h:665
 DisplacementVector3D.h:666
 DisplacementVector3D.h:667
 DisplacementVector3D.h:668
 DisplacementVector3D.h:669
 DisplacementVector3D.h:670
 DisplacementVector3D.h:671
 DisplacementVector3D.h:672
 DisplacementVector3D.h:673
 DisplacementVector3D.h:674
 DisplacementVector3D.h:675
 DisplacementVector3D.h:676
 DisplacementVector3D.h:677
 DisplacementVector3D.h:678
 DisplacementVector3D.h:679
 DisplacementVector3D.h:680
 DisplacementVector3D.h:681
 DisplacementVector3D.h:682
 DisplacementVector3D.h:683
 DisplacementVector3D.h:684
 DisplacementVector3D.h:685
 DisplacementVector3D.h:686
 DisplacementVector3D.h:687
 DisplacementVector3D.h:688
 DisplacementVector3D.h:689
 DisplacementVector3D.h:690
 DisplacementVector3D.h:691
 DisplacementVector3D.h:692
 DisplacementVector3D.h:693
 DisplacementVector3D.h:694
 DisplacementVector3D.h:695
 DisplacementVector3D.h:696
 DisplacementVector3D.h:697
 DisplacementVector3D.h:698
 DisplacementVector3D.h:699
 DisplacementVector3D.h:700