// @(#)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 DisplacementVector2D
//
// Created by: Lorenzo Moneta  at Mon Apr 16 2007
//

#ifndef ROOT_Math_GenVector_DisplacementVector2D
#define ROOT_Math_GenVector_DisplacementVector2D  1

#ifndef ROOT_Math_GenVector_Cartesian2D
#include "Math/GenVector/Cartesian2D.h"
#endif

#ifndef ROOT_Math_GenVector_PositionVector2Dfwd
#include "Math/GenVector/PositionVector2Dfwd.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 "Math/GenVector/Expression2D.h"




namespace ROOT {

  namespace Math {



//__________________________________________________________________________________________
     /**
        Class describing a generic displacement vector in 2 dimensions.
        This class is templated on the type of Coordinate system.
        One example is the XYVector which is a vector based on
        double precision x,y  data members by using the
        ROOT::Math::Cartesian2D<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 DisplacementVector2D {

     public:

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

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

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


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

        /**
           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 DisplacementVector2D( const DisplacementVector2D<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 DisplacementVector2D( const PositionVector2D<OtherCoords,Tag> & p) :
           fCoordinates ( p.Coordinates() ) { }


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



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

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

        /**
           Assignment operator from a displacement vector of arbitrary type
        */
        template <class OtherCoords>
        DisplacementVector2D & operator=
        ( const DisplacementVector2D<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>
        DisplacementVector2D & operator=
        ( const PositionVector2D<OtherCoords,Tag> & rhs) {
           SetXY(rhs.x(), rhs.y() );
           return *this;
        }


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


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

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

        /**
           Set internal data based on 2 Scalar numbers.
           These are for example (x,y) for a cartesian vector or (r,phi) for a polar vector
       */
        DisplacementVector2D<CoordSystem, Tag>& SetCoordinates( Scalar a, Scalar b) {
           fCoordinates.SetCoordinates(a, b);
           return *this;
        }


        /**
           get internal data into 2 Scalar numbers.
           These are for example (x,y) for a cartesian vector or (r,phi) for a polar vector
        */
        void GetCoordinates( Scalar& a, Scalar& b) const
        { fCoordinates.GetCoordinates(a, b);  }


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

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

        /**
           Exact equality
        */
        bool operator==(const DisplacementVector2D & rhs) const {
           return fCoordinates==rhs.fCoordinates;
        }
        bool operator!= (const DisplacementVector2D & 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(); }


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


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


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

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


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

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

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

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


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


        /**
           Change Phi - Polar2D  coordinates
        */
        DisplacementVector2D<CoordSystem, Tag>& SetPhi (Scalar ang) {
           fCoordinates.SetPhi(ang);
           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  DisplacementVector2D<OtherCoords,Tag>  & v) const {
           return X()*v.X() + Y()*v.Y();
        }
        /**
           Return the scalar (dot) product of two vectors.
           It is possible to perform the product for any classes
           implementing x() and  y()  member functions
        */
        template< class OtherVector >
        Scalar Dot( const  OtherVector & v) const {
           return X()*v.x() + Y()*v.y();
        }



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

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


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

        /**
           divide this vector by a scalar quantity
        */
        DisplacementVector2D & 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
        */
        DisplacementVector2D operator * ( Scalar a ) const {
           DisplacementVector2D tmp(*this);
           tmp *= a;
           return tmp;
        }

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

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

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

        /**
           Rotate by an angle
         */
        void Rotate( Scalar angle) {
           return fCoordinates.Rotate(angle);
        }


        // Methods providing  Limited backward name compatibility with CLHEP

        Scalar x()     const { return fCoordinates.X();     }
        Scalar y()     const { return fCoordinates.Y();     }
        Scalar r()     const { return fCoordinates.R();     }
        Scalar phi()   const { return fCoordinates.Phi();   }
        Scalar mag2()  const { return fCoordinates.Mag2();  }
        DisplacementVector2D unit() const {return Unit();}


     private:

        CoordSystem fCoordinates;    // internal coordinate system


        // 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 DisplacementVector2D( const DisplacementVector2D<OtherCoords, OtherTag> & ) {}

        template <class OtherCoords, class OtherTag>
        explicit DisplacementVector2D( const PositionVector2D<OtherCoords, OtherTag> & ) {}

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


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

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

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

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

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


     };

// ---------- DisplacementVector2D class template ends here ------------
// ---------------------------------------------------------------------


     /**
        Addition of DisplacementVector2D 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
     DisplacementVector2D<CoordSystem1,U>
     operator+(       DisplacementVector2D<CoordSystem1,U> v1,
                      const DisplacementVector2D<CoordSystem2,U>  & v2) {
        return v1 += v2;
     }

     /**
        Difference between two DisplacementVector2D 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
     DisplacementVector2D<CoordSystem1,U>
     operator-( DisplacementVector2D<CoordSystem1,U> v1,
                DisplacementVector2D<CoordSystem2,U> const & v2) {
        return v1 -= v2;
     }





     /**
        Multiplication of a displacement vector by real number  a*v
     */
     template <class CoordSystem, class U>
     inline
     DisplacementVector2D<CoordSystem,U>
     operator * ( typename DisplacementVector2D<CoordSystem,U>::Scalar a,
                  DisplacementVector2D<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
                   , DisplacementVector2D<T,U> const & v
        )
     {
        if( !os )  return os;

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

        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);
        }
        else  {
           os << detail::get_manip( os, detail::open  ) << a
              << detail::get_manip( os, detail::sep   ) << b
              << 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
                   , DisplacementVector2D<T,U> & v
        )
     {
        if( !is )  return is;

        typename T::Scalar a, b;

        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);
        }
        else  {
           detail::require_delim( is, detail::open  );  is >> a;
           detail::require_delim( is, detail::sep   );  is >> b;
           detail::require_delim( is, detail::close );
        }

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

     }  // op>> <>()



  }  // namespace Math

}  // namespace ROOT


#endif /* ROOT_Math_GenVector_DisplacementVector2D  */

 DisplacementVector2D.h:1
 DisplacementVector2D.h:2
 DisplacementVector2D.h:3
 DisplacementVector2D.h:4
 DisplacementVector2D.h:5
 DisplacementVector2D.h:6
 DisplacementVector2D.h:7
 DisplacementVector2D.h:8
 DisplacementVector2D.h:9
 DisplacementVector2D.h:10
 DisplacementVector2D.h:11
 DisplacementVector2D.h:12
 DisplacementVector2D.h:13
 DisplacementVector2D.h:14
 DisplacementVector2D.h:15
 DisplacementVector2D.h:16
 DisplacementVector2D.h:17
 DisplacementVector2D.h:18
 DisplacementVector2D.h:19
 DisplacementVector2D.h:20
 DisplacementVector2D.h:21
 DisplacementVector2D.h:22
 DisplacementVector2D.h:23
 DisplacementVector2D.h:24
 DisplacementVector2D.h:25
 DisplacementVector2D.h:26
 DisplacementVector2D.h:27
 DisplacementVector2D.h:28
 DisplacementVector2D.h:29
 DisplacementVector2D.h:30
 DisplacementVector2D.h:31
 DisplacementVector2D.h:32
 DisplacementVector2D.h:33
 DisplacementVector2D.h:34
 DisplacementVector2D.h:35
 DisplacementVector2D.h:36
 DisplacementVector2D.h:37
 DisplacementVector2D.h:38
 DisplacementVector2D.h:39
 DisplacementVector2D.h:40
 DisplacementVector2D.h:41
 DisplacementVector2D.h:42
 DisplacementVector2D.h:43
 DisplacementVector2D.h:44
 DisplacementVector2D.h:45
 DisplacementVector2D.h:46
 DisplacementVector2D.h:47
 DisplacementVector2D.h:48
 DisplacementVector2D.h:49
 DisplacementVector2D.h:50
 DisplacementVector2D.h:51
 DisplacementVector2D.h:52
 DisplacementVector2D.h:53
 DisplacementVector2D.h:54
 DisplacementVector2D.h:55
 DisplacementVector2D.h:56
 DisplacementVector2D.h:57
 DisplacementVector2D.h:58
 DisplacementVector2D.h:59
 DisplacementVector2D.h:60
 DisplacementVector2D.h:61
 DisplacementVector2D.h:62
 DisplacementVector2D.h:63
 DisplacementVector2D.h:64
 DisplacementVector2D.h:65
 DisplacementVector2D.h:66
 DisplacementVector2D.h:67
 DisplacementVector2D.h:68
 DisplacementVector2D.h:69
 DisplacementVector2D.h:70
 DisplacementVector2D.h:71
 DisplacementVector2D.h:72
 DisplacementVector2D.h:73
 DisplacementVector2D.h:74
 DisplacementVector2D.h:75
 DisplacementVector2D.h:76
 DisplacementVector2D.h:77
 DisplacementVector2D.h:78
 DisplacementVector2D.h:79
 DisplacementVector2D.h:80
 DisplacementVector2D.h:81
 DisplacementVector2D.h:82
 DisplacementVector2D.h:83
 DisplacementVector2D.h:84
 DisplacementVector2D.h:85
 DisplacementVector2D.h:86
 DisplacementVector2D.h:87
 DisplacementVector2D.h:88
 DisplacementVector2D.h:89
 DisplacementVector2D.h:90
 DisplacementVector2D.h:91
 DisplacementVector2D.h:92
 DisplacementVector2D.h:93
 DisplacementVector2D.h:94
 DisplacementVector2D.h:95
 DisplacementVector2D.h:96
 DisplacementVector2D.h:97
 DisplacementVector2D.h:98
 DisplacementVector2D.h:99
 DisplacementVector2D.h:100
 DisplacementVector2D.h:101
 DisplacementVector2D.h:102
 DisplacementVector2D.h:103
 DisplacementVector2D.h:104
 DisplacementVector2D.h:105
 DisplacementVector2D.h:106
 DisplacementVector2D.h:107
 DisplacementVector2D.h:108
 DisplacementVector2D.h:109
 DisplacementVector2D.h:110
 DisplacementVector2D.h:111
 DisplacementVector2D.h:112
 DisplacementVector2D.h:113
 DisplacementVector2D.h:114
 DisplacementVector2D.h:115
 DisplacementVector2D.h:116
 DisplacementVector2D.h:117
 DisplacementVector2D.h:118
 DisplacementVector2D.h:119
 DisplacementVector2D.h:120
 DisplacementVector2D.h:121
 DisplacementVector2D.h:122
 DisplacementVector2D.h:123
 DisplacementVector2D.h:124
 DisplacementVector2D.h:125
 DisplacementVector2D.h:126
 DisplacementVector2D.h:127
 DisplacementVector2D.h:128
 DisplacementVector2D.h:129
 DisplacementVector2D.h:130
 DisplacementVector2D.h:131
 DisplacementVector2D.h:132
 DisplacementVector2D.h:133
 DisplacementVector2D.h:134
 DisplacementVector2D.h:135
 DisplacementVector2D.h:136
 DisplacementVector2D.h:137
 DisplacementVector2D.h:138
 DisplacementVector2D.h:139
 DisplacementVector2D.h:140
 DisplacementVector2D.h:141
 DisplacementVector2D.h:142
 DisplacementVector2D.h:143
 DisplacementVector2D.h:144
 DisplacementVector2D.h:145
 DisplacementVector2D.h:146
 DisplacementVector2D.h:147
 DisplacementVector2D.h:148
 DisplacementVector2D.h:149
 DisplacementVector2D.h:150
 DisplacementVector2D.h:151
 DisplacementVector2D.h:152
 DisplacementVector2D.h:153
 DisplacementVector2D.h:154
 DisplacementVector2D.h:155
 DisplacementVector2D.h:156
 DisplacementVector2D.h:157
 DisplacementVector2D.h:158
 DisplacementVector2D.h:159
 DisplacementVector2D.h:160
 DisplacementVector2D.h:161
 DisplacementVector2D.h:162
 DisplacementVector2D.h:163
 DisplacementVector2D.h:164
 DisplacementVector2D.h:165
 DisplacementVector2D.h:166
 DisplacementVector2D.h:167
 DisplacementVector2D.h:168
 DisplacementVector2D.h:169
 DisplacementVector2D.h:170
 DisplacementVector2D.h:171
 DisplacementVector2D.h:172
 DisplacementVector2D.h:173
 DisplacementVector2D.h:174
 DisplacementVector2D.h:175
 DisplacementVector2D.h:176
 DisplacementVector2D.h:177
 DisplacementVector2D.h:178
 DisplacementVector2D.h:179
 DisplacementVector2D.h:180
 DisplacementVector2D.h:181
 DisplacementVector2D.h:182
 DisplacementVector2D.h:183
 DisplacementVector2D.h:184
 DisplacementVector2D.h:185
 DisplacementVector2D.h:186
 DisplacementVector2D.h:187
 DisplacementVector2D.h:188
 DisplacementVector2D.h:189
 DisplacementVector2D.h:190
 DisplacementVector2D.h:191
 DisplacementVector2D.h:192
 DisplacementVector2D.h:193
 DisplacementVector2D.h:194
 DisplacementVector2D.h:195
 DisplacementVector2D.h:196
 DisplacementVector2D.h:197
 DisplacementVector2D.h:198
 DisplacementVector2D.h:199
 DisplacementVector2D.h:200
 DisplacementVector2D.h:201
 DisplacementVector2D.h:202
 DisplacementVector2D.h:203
 DisplacementVector2D.h:204
 DisplacementVector2D.h:205
 DisplacementVector2D.h:206
 DisplacementVector2D.h:207
 DisplacementVector2D.h:208
 DisplacementVector2D.h:209
 DisplacementVector2D.h:210
 DisplacementVector2D.h:211
 DisplacementVector2D.h:212
 DisplacementVector2D.h:213
 DisplacementVector2D.h:214
 DisplacementVector2D.h:215
 DisplacementVector2D.h:216
 DisplacementVector2D.h:217
 DisplacementVector2D.h:218
 DisplacementVector2D.h:219
 DisplacementVector2D.h:220
 DisplacementVector2D.h:221
 DisplacementVector2D.h:222
 DisplacementVector2D.h:223
 DisplacementVector2D.h:224
 DisplacementVector2D.h:225
 DisplacementVector2D.h:226
 DisplacementVector2D.h:227
 DisplacementVector2D.h:228
 DisplacementVector2D.h:229
 DisplacementVector2D.h:230
 DisplacementVector2D.h:231
 DisplacementVector2D.h:232
 DisplacementVector2D.h:233
 DisplacementVector2D.h:234
 DisplacementVector2D.h:235
 DisplacementVector2D.h:236
 DisplacementVector2D.h:237
 DisplacementVector2D.h:238
 DisplacementVector2D.h:239
 DisplacementVector2D.h:240
 DisplacementVector2D.h:241
 DisplacementVector2D.h:242
 DisplacementVector2D.h:243
 DisplacementVector2D.h:244
 DisplacementVector2D.h:245
 DisplacementVector2D.h:246
 DisplacementVector2D.h:247
 DisplacementVector2D.h:248
 DisplacementVector2D.h:249
 DisplacementVector2D.h:250
 DisplacementVector2D.h:251
 DisplacementVector2D.h:252
 DisplacementVector2D.h:253
 DisplacementVector2D.h:254
 DisplacementVector2D.h:255
 DisplacementVector2D.h:256
 DisplacementVector2D.h:257
 DisplacementVector2D.h:258
 DisplacementVector2D.h:259
 DisplacementVector2D.h:260
 DisplacementVector2D.h:261
 DisplacementVector2D.h:262
 DisplacementVector2D.h:263
 DisplacementVector2D.h:264
 DisplacementVector2D.h:265
 DisplacementVector2D.h:266
 DisplacementVector2D.h:267
 DisplacementVector2D.h:268
 DisplacementVector2D.h:269
 DisplacementVector2D.h:270
 DisplacementVector2D.h:271
 DisplacementVector2D.h:272
 DisplacementVector2D.h:273
 DisplacementVector2D.h:274
 DisplacementVector2D.h:275
 DisplacementVector2D.h:276
 DisplacementVector2D.h:277
 DisplacementVector2D.h:278
 DisplacementVector2D.h:279
 DisplacementVector2D.h:280
 DisplacementVector2D.h:281
 DisplacementVector2D.h:282
 DisplacementVector2D.h:283
 DisplacementVector2D.h:284
 DisplacementVector2D.h:285
 DisplacementVector2D.h:286
 DisplacementVector2D.h:287
 DisplacementVector2D.h:288
 DisplacementVector2D.h:289
 DisplacementVector2D.h:290
 DisplacementVector2D.h:291
 DisplacementVector2D.h:292
 DisplacementVector2D.h:293
 DisplacementVector2D.h:294
 DisplacementVector2D.h:295
 DisplacementVector2D.h:296
 DisplacementVector2D.h:297
 DisplacementVector2D.h:298
 DisplacementVector2D.h:299
 DisplacementVector2D.h:300
 DisplacementVector2D.h:301
 DisplacementVector2D.h:302
 DisplacementVector2D.h:303
 DisplacementVector2D.h:304
 DisplacementVector2D.h:305
 DisplacementVector2D.h:306
 DisplacementVector2D.h:307
 DisplacementVector2D.h:308
 DisplacementVector2D.h:309
 DisplacementVector2D.h:310
 DisplacementVector2D.h:311
 DisplacementVector2D.h:312
 DisplacementVector2D.h:313
 DisplacementVector2D.h:314
 DisplacementVector2D.h:315
 DisplacementVector2D.h:316
 DisplacementVector2D.h:317
 DisplacementVector2D.h:318
 DisplacementVector2D.h:319
 DisplacementVector2D.h:320
 DisplacementVector2D.h:321
 DisplacementVector2D.h:322
 DisplacementVector2D.h:323
 DisplacementVector2D.h:324
 DisplacementVector2D.h:325
 DisplacementVector2D.h:326
 DisplacementVector2D.h:327
 DisplacementVector2D.h:328
 DisplacementVector2D.h:329
 DisplacementVector2D.h:330
 DisplacementVector2D.h:331
 DisplacementVector2D.h:332
 DisplacementVector2D.h:333
 DisplacementVector2D.h:334
 DisplacementVector2D.h:335
 DisplacementVector2D.h:336
 DisplacementVector2D.h:337
 DisplacementVector2D.h:338
 DisplacementVector2D.h:339
 DisplacementVector2D.h:340
 DisplacementVector2D.h:341
 DisplacementVector2D.h:342
 DisplacementVector2D.h:343
 DisplacementVector2D.h:344
 DisplacementVector2D.h:345
 DisplacementVector2D.h:346
 DisplacementVector2D.h:347
 DisplacementVector2D.h:348
 DisplacementVector2D.h:349
 DisplacementVector2D.h:350
 DisplacementVector2D.h:351
 DisplacementVector2D.h:352
 DisplacementVector2D.h:353
 DisplacementVector2D.h:354
 DisplacementVector2D.h:355
 DisplacementVector2D.h:356
 DisplacementVector2D.h:357
 DisplacementVector2D.h:358
 DisplacementVector2D.h:359
 DisplacementVector2D.h:360
 DisplacementVector2D.h:361
 DisplacementVector2D.h:362
 DisplacementVector2D.h:363
 DisplacementVector2D.h:364
 DisplacementVector2D.h:365
 DisplacementVector2D.h:366
 DisplacementVector2D.h:367
 DisplacementVector2D.h:368
 DisplacementVector2D.h:369
 DisplacementVector2D.h:370
 DisplacementVector2D.h:371
 DisplacementVector2D.h:372
 DisplacementVector2D.h:373
 DisplacementVector2D.h:374
 DisplacementVector2D.h:375
 DisplacementVector2D.h:376
 DisplacementVector2D.h:377
 DisplacementVector2D.h:378
 DisplacementVector2D.h:379
 DisplacementVector2D.h:380
 DisplacementVector2D.h:381
 DisplacementVector2D.h:382
 DisplacementVector2D.h:383
 DisplacementVector2D.h:384
 DisplacementVector2D.h:385
 DisplacementVector2D.h:386
 DisplacementVector2D.h:387
 DisplacementVector2D.h:388
 DisplacementVector2D.h:389
 DisplacementVector2D.h:390
 DisplacementVector2D.h:391
 DisplacementVector2D.h:392
 DisplacementVector2D.h:393
 DisplacementVector2D.h:394
 DisplacementVector2D.h:395
 DisplacementVector2D.h:396
 DisplacementVector2D.h:397
 DisplacementVector2D.h:398
 DisplacementVector2D.h:399
 DisplacementVector2D.h:400
 DisplacementVector2D.h:401
 DisplacementVector2D.h:402
 DisplacementVector2D.h:403
 DisplacementVector2D.h:404
 DisplacementVector2D.h:405
 DisplacementVector2D.h:406
 DisplacementVector2D.h:407
 DisplacementVector2D.h:408
 DisplacementVector2D.h:409
 DisplacementVector2D.h:410
 DisplacementVector2D.h:411
 DisplacementVector2D.h:412
 DisplacementVector2D.h:413
 DisplacementVector2D.h:414
 DisplacementVector2D.h:415
 DisplacementVector2D.h:416
 DisplacementVector2D.h:417
 DisplacementVector2D.h:418
 DisplacementVector2D.h:419
 DisplacementVector2D.h:420
 DisplacementVector2D.h:421
 DisplacementVector2D.h:422
 DisplacementVector2D.h:423
 DisplacementVector2D.h:424
 DisplacementVector2D.h:425
 DisplacementVector2D.h:426
 DisplacementVector2D.h:427
 DisplacementVector2D.h:428
 DisplacementVector2D.h:429
 DisplacementVector2D.h:430
 DisplacementVector2D.h:431
 DisplacementVector2D.h:432
 DisplacementVector2D.h:433
 DisplacementVector2D.h:434
 DisplacementVector2D.h:435
 DisplacementVector2D.h:436
 DisplacementVector2D.h:437
 DisplacementVector2D.h:438
 DisplacementVector2D.h:439
 DisplacementVector2D.h:440
 DisplacementVector2D.h:441
 DisplacementVector2D.h:442
 DisplacementVector2D.h:443
 DisplacementVector2D.h:444
 DisplacementVector2D.h:445
 DisplacementVector2D.h:446
 DisplacementVector2D.h:447
 DisplacementVector2D.h:448
 DisplacementVector2D.h:449
 DisplacementVector2D.h:450
 DisplacementVector2D.h:451
 DisplacementVector2D.h:452
 DisplacementVector2D.h:453
 DisplacementVector2D.h:454
 DisplacementVector2D.h:455
 DisplacementVector2D.h:456
 DisplacementVector2D.h:457
 DisplacementVector2D.h:458
 DisplacementVector2D.h:459
 DisplacementVector2D.h:460
 DisplacementVector2D.h:461
 DisplacementVector2D.h:462
 DisplacementVector2D.h:463
 DisplacementVector2D.h:464
 DisplacementVector2D.h:465
 DisplacementVector2D.h:466
 DisplacementVector2D.h:467
 DisplacementVector2D.h:468
 DisplacementVector2D.h:469
 DisplacementVector2D.h:470
 DisplacementVector2D.h:471
 DisplacementVector2D.h:472
 DisplacementVector2D.h:473
 DisplacementVector2D.h:474
 DisplacementVector2D.h:475
 DisplacementVector2D.h:476
 DisplacementVector2D.h:477
 DisplacementVector2D.h:478
 DisplacementVector2D.h:479
 DisplacementVector2D.h:480
 DisplacementVector2D.h:481
 DisplacementVector2D.h:482
 DisplacementVector2D.h:483
 DisplacementVector2D.h:484
 DisplacementVector2D.h:485
 DisplacementVector2D.h:486
 DisplacementVector2D.h:487
 DisplacementVector2D.h:488
 DisplacementVector2D.h:489
 DisplacementVector2D.h:490
 DisplacementVector2D.h:491
 DisplacementVector2D.h:492
 DisplacementVector2D.h:493
 DisplacementVector2D.h:494
 DisplacementVector2D.h:495
 DisplacementVector2D.h:496
 DisplacementVector2D.h:497
 DisplacementVector2D.h:498
 DisplacementVector2D.h:499
 DisplacementVector2D.h:500
 DisplacementVector2D.h:501
 DisplacementVector2D.h:502
 DisplacementVector2D.h:503
 DisplacementVector2D.h:504
 DisplacementVector2D.h:505
 DisplacementVector2D.h:506
 DisplacementVector2D.h:507
 DisplacementVector2D.h:508
 DisplacementVector2D.h:509
 DisplacementVector2D.h:510
 DisplacementVector2D.h:511
 DisplacementVector2D.h:512
 DisplacementVector2D.h:513
 DisplacementVector2D.h:514
 DisplacementVector2D.h:515
 DisplacementVector2D.h:516
 DisplacementVector2D.h:517
 DisplacementVector2D.h:518
 DisplacementVector2D.h:519
 DisplacementVector2D.h:520
 DisplacementVector2D.h:521
 DisplacementVector2D.h:522
 DisplacementVector2D.h:523
 DisplacementVector2D.h:524
 DisplacementVector2D.h:525
 DisplacementVector2D.h:526
 DisplacementVector2D.h:527
 DisplacementVector2D.h:528
 DisplacementVector2D.h:529
 DisplacementVector2D.h:530
 DisplacementVector2D.h:531
 DisplacementVector2D.h:532
 DisplacementVector2D.h:533
 DisplacementVector2D.h:534
 DisplacementVector2D.h:535
 DisplacementVector2D.h:536
 DisplacementVector2D.h:537
 DisplacementVector2D.h:538
 DisplacementVector2D.h:539
 DisplacementVector2D.h:540
 DisplacementVector2D.h:541
 DisplacementVector2D.h:542
 DisplacementVector2D.h:543
 DisplacementVector2D.h:544
 DisplacementVector2D.h:545
 DisplacementVector2D.h:546
 DisplacementVector2D.h:547
 DisplacementVector2D.h:548
 DisplacementVector2D.h:549
 DisplacementVector2D.h:550
 DisplacementVector2D.h:551
 DisplacementVector2D.h:552