17 #ifndef ROOT_Math_GenVector_DisplacementVector2D
18 #define ROOT_Math_GenVector_DisplacementVector2D 1
55 template <
class CoordSystem,
class Tag = DefaultCoordinateSystemTag >
56 class DisplacementVector2D {
60 typedef typename CoordSystem::Scalar Scalar;
61 typedef CoordSystem CoordinateType;
62 typedef Tag CoordinateSystemTag;
69 DisplacementVector2D ( ) : fCoordinates() { }
77 DisplacementVector2D(Scalar a, Scalar b) :
78 fCoordinates ( a , b ) { }
84 template <
class OtherCoords>
85 explicit DisplacementVector2D(
const DisplacementVector2D<OtherCoords, Tag> & v) :
86 fCoordinates ( v.Coordinates() ) { }
93 template <
class OtherCoords>
94 explicit DisplacementVector2D(
const PositionVector2D<OtherCoords,Tag> & p) :
95 fCoordinates ( p.Coordinates() ) { }
102 template <
class ForeignVector>
103 explicit DisplacementVector2D(
const ForeignVector & v) :
104 fCoordinates ( Cartesian2D<Scalar>( v.x(), v.y() ) ) { }
115 template <
class OtherCoords>
116 DisplacementVector2D &
operator=
117 (
const DisplacementVector2D<OtherCoords, Tag> & v) {
118 fCoordinates = v.Coordinates();
126 template <
class OtherCoords>
127 DisplacementVector2D &
operator=
128 (
const PositionVector2D<OtherCoords,Tag> & rhs) {
129 SetXY(rhs.x(), rhs.y() );
138 template <
class ForeignVector>
139 DisplacementVector2D & operator= (
const ForeignVector & v) {
140 SetXY( v.x(), v.y() );
150 CoordSystem Coordinates()
const {
158 DisplacementVector2D<CoordSystem, Tag>& SetCoordinates( Scalar a, Scalar b) {
159 fCoordinates.SetCoordinates(a, b);
168 void GetCoordinates( Scalar& a, Scalar& b)
const
169 { fCoordinates.GetCoordinates(a, b); }
177 DisplacementVector2D<CoordSystem, Tag>& SetXY (Scalar a, Scalar b) {
178 fCoordinates.SetXY(a,b);
187 bool operator==(
const DisplacementVector2D & rhs)
const {
188 return fCoordinates==rhs.fCoordinates;
190 bool operator!= (
const DisplacementVector2D & rhs)
const {
191 return !(operator==(rhs));
199 Scalar X()
const {
return fCoordinates.X(); }
204 Scalar Y()
const {
return fCoordinates.Y(); }
210 Scalar R()
const {
return fCoordinates.R(); }
216 Scalar Phi()
const {
return fCoordinates.Phi(); }
224 Scalar Mag2()
const {
return fCoordinates.Mag2();}
230 DisplacementVector2D Unit()
const {
232 return tot == 0 ? *
this : DisplacementVector2D(*
this) / tot;
240 DisplacementVector2D<CoordSystem, Tag>& SetX (Scalar a) {
241 fCoordinates.SetX(a);
248 DisplacementVector2D<CoordSystem, Tag>& SetY (Scalar a) {
249 fCoordinates.SetY(a);
257 DisplacementVector2D<CoordSystem, Tag>& SetR (Scalar a) {
258 fCoordinates.SetR(a);
266 DisplacementVector2D<CoordSystem, Tag>& SetPhi (Scalar ang) {
267 fCoordinates.SetPhi(ang);
281 template<
class OtherCoords >
282 Scalar Dot(
const DisplacementVector2D<OtherCoords,Tag> & v)
const {
283 return X()*v.X() + Y()*v.Y();
290 template<
class OtherVector >
291 Scalar Dot(
const OtherVector & v)
const {
292 return X()*v.x() + Y()*v.y();
300 template <
class OtherCoords>
301 DisplacementVector2D &
operator+=
302 (
const DisplacementVector2D<OtherCoords,Tag> & v) {
303 SetXY( X() + v.X(), Y() + v.Y() );
310 template <
class OtherCoords>
311 DisplacementVector2D &
operator-=
312 (
const DisplacementVector2D<OtherCoords,Tag> & v) {
313 SetXY( x() - v.x(), y() - v.y() );
321 DisplacementVector2D & operator*= (Scalar a) {
322 fCoordinates.Scale(a);
329 DisplacementVector2D & operator/= (Scalar a) {
330 fCoordinates.Scale(1/a);
340 DisplacementVector2D operator * ( Scalar a )
const {
341 DisplacementVector2D tmp(*
this);
349 DisplacementVector2D operator - ( )
const {
350 return operator*( Scalar(-1) );
356 DisplacementVector2D operator + ( )
const {
return *
this;}
361 DisplacementVector2D operator/ (Scalar a)
const {
362 DisplacementVector2D tmp(*
this);
370 void Rotate( Scalar angle) {
371 return fCoordinates.Rotate(angle);
377 Scalar x()
const {
return fCoordinates.X(); }
378 Scalar y()
const {
return fCoordinates.Y(); }
379 Scalar r()
const {
return fCoordinates.R(); }
380 Scalar phi()
const {
return fCoordinates.Phi(); }
381 Scalar mag2()
const {
return fCoordinates.Mag2(); }
382 DisplacementVector2D unit()
const {
return Unit();}
387 CoordSystem fCoordinates;
393 template <
class OtherCoords,
class OtherTag>
394 explicit DisplacementVector2D(
const DisplacementVector2D<OtherCoords, OtherTag> & ) {}
396 template <
class OtherCoords,
class OtherTag>
397 explicit DisplacementVector2D(
const PositionVector2D<OtherCoords, OtherTag> & ) {}
399 template <
class OtherCoords,
class OtherTag>
400 DisplacementVector2D & operator=(
const DisplacementVector2D<OtherCoords, OtherTag> & );
403 template <
class OtherCoords,
class OtherTag>
404 DisplacementVector2D & operator=(
const PositionVector2D<OtherCoords, OtherTag> & );
406 template <
class OtherCoords,
class OtherTag>
407 DisplacementVector2D & operator+=(
const DisplacementVector2D<OtherCoords, OtherTag> & );
409 template <
class OtherCoords,
class OtherTag>
410 DisplacementVector2D & operator-=(
const DisplacementVector2D<OtherCoords, OtherTag> & );
412 template<
class OtherCoords,
class OtherTag >
413 Scalar Dot(
const DisplacementVector2D<OtherCoords, OtherTag> & )
const;
415 template<
class OtherCoords,
class OtherTag >
416 DisplacementVector2D Cross(
const DisplacementVector2D<OtherCoords, OtherTag> & )
const;
430 template <
class CoordSystem1,
class CoordSystem2,
class U>
432 DisplacementVector2D<CoordSystem1,U>
433 operator+( DisplacementVector2D<CoordSystem1,U> v1,
434 const DisplacementVector2D<CoordSystem2,U> & v2) {
443 template <
class CoordSystem1,
class CoordSystem2,
class U>
445 DisplacementVector2D<CoordSystem1,U>
446 operator-( DisplacementVector2D<CoordSystem1,U> v1,
447 DisplacementVector2D<CoordSystem2,U>
const & v2) {
458 template <
class CoordSystem,
class U>
460 DisplacementVector2D<CoordSystem,U>
461 operator * (
typename DisplacementVector2D<CoordSystem,U>::Scalar a,
462 DisplacementVector2D<CoordSystem,U> v) {
476 template<
class char_t,
class traits_t,
class T,
class U >
478 std::basic_ostream<char_t,traits_t> &
479 operator << ( std::basic_ostream<char_t,traits_t> & os
480 , DisplacementVector2D<T,U>
const & v
485 typename T::Scalar a, b;
486 v.GetCoordinates(a, b);
488 if( detail::get_manip( os, detail::bitforbit ) ) {
489 detail::set_manip( os, detail::bitforbit,
'\00' );
490 typedef GenVector_detail::BitReproducible BR;
495 os << detail::get_manip( os, detail::open ) << a
496 << detail::get_manip( os, detail::sep ) << b
497 << detail::get_manip( os, detail::close );
505 template<
class char_t,
class traits_t,
class T,
class U >
507 std::basic_istream<char_t,traits_t> &
508 operator >> ( std::basic_istream<char_t,traits_t> & is
509 , DisplacementVector2D<T,U> & v
514 typename T::Scalar a, b;
516 if( detail::get_manip( is, detail::bitforbit ) ) {
517 detail::set_manip( is, detail::bitforbit,
'\00' );
518 typedef GenVector_detail::BitReproducible BR;
523 detail::require_delim( is, detail::open ); is >> a;
524 detail::require_delim( is, detail::sep ); is >> b;
525 detail::require_delim( is, detail::close );
529 v.SetCoordinates(a, b);