16 #ifndef ROOT_Math_GenVector_PositionVector2D
17 #define ROOT_Math_GenVector_PositionVector2D 1
47 template <
class CoordSystem,
class Tag = DefaultCoordinateSystemTag >
48 class PositionVector2D {
52 typedef typename CoordSystem::Scalar Scalar;
53 typedef CoordSystem CoordinateType;
54 typedef Tag CoordinateSystemTag;
62 PositionVector2D() : fCoordinates() { }
69 PositionVector2D(
const Scalar & a,
const Scalar & b) :
70 fCoordinates ( a , b) { }
77 explicit PositionVector2D(
const PositionVector2D<T,Tag> & v) :
78 fCoordinates ( v.Coordinates() ) { }
84 explicit PositionVector2D(
const DisplacementVector2D<T,Tag> & p) :
85 fCoordinates ( p.Coordinates() ) { }
91 template <
class ForeignVector>
92 explicit PositionVector2D(
const ForeignVector & v) :
93 fCoordinates ( Cartesian2D<Scalar>( v.x(), v.y() ) ) { }
102 template <
class OtherCoords>
103 PositionVector2D &
operator=
104 (
const PositionVector2D<OtherCoords,Tag> & v) {
105 fCoordinates = v.Coordinates();
112 template <
class OtherCoords>
113 PositionVector2D &
operator=
114 (
const DisplacementVector2D<OtherCoords,Tag> & v) {
115 fCoordinates = v.Coordinates();
123 template <
class ForeignVector>
124 PositionVector2D & operator= (
const ForeignVector & v) {
125 SetXY( v.x(), v.y() );
132 const CoordSystem & Coordinates()
const {
140 PositionVector2D<CoordSystem, Tag>& SetCoordinates( Scalar a, Scalar b) {
141 fCoordinates.SetCoordinates(a, b);
150 void GetCoordinates( Scalar& a, Scalar& b)
const
151 { fCoordinates.GetCoordinates(a, b); }
159 PositionVector2D<CoordSystem, Tag>& SetXY (Scalar a, Scalar b) {
160 fCoordinates.SetXY (a,b);
169 bool operator==(
const PositionVector2D & rhs)
const {
170 return fCoordinates==rhs.fCoordinates;
172 bool operator!= (
const PositionVector2D & rhs)
const {
173 return !(operator==(rhs));
181 Scalar X()
const {
return fCoordinates.X(); }
186 Scalar Y()
const {
return fCoordinates.Y(); }
191 Scalar R()
const {
return fCoordinates.R(); }
196 Scalar Phi()
const {
return fCoordinates.Phi(); }
201 Scalar Mag2()
const {
return fCoordinates.Mag2();}
212 PositionVector2D<CoordSystem, Tag>& SetX (Scalar a) {
213 fCoordinates.SetX(a);
220 PositionVector2D<CoordSystem, Tag>& SetY (Scalar a) {
221 fCoordinates.SetY(a);
229 PositionVector2D<CoordSystem, Tag>& SetR (Scalar a) {
230 fCoordinates.SetR(a);
237 PositionVector2D<CoordSystem, Tag>& SetPhi (Scalar ang) {
238 fCoordinates.SetPhi(ang);
250 template<
class OtherCoords >
251 Scalar Dot(
const DisplacementVector2D<OtherCoords,Tag> & v)
const {
252 return X()*v.x() + Y()*v.y();
263 template <
class OtherCoords>
264 PositionVector2D & operator+= (
const DisplacementVector2D<OtherCoords,Tag> & v)
266 SetXY( X() + v.X(), Y() + v.Y() );
273 template <
class OtherCoords>
274 PositionVector2D & operator-= (
const DisplacementVector2D<OtherCoords,Tag> & v)
276 SetXY( X() - v.X(), Y() - v.Y() );
283 PositionVector2D & operator *= (Scalar a) {
284 fCoordinates.Scale(a);
291 PositionVector2D & operator /= (Scalar a) {
292 fCoordinates.Scale(1/a);
301 PositionVector2D operator * ( Scalar a )
const {
302 PositionVector2D tmp(*
this);
310 PositionVector2D operator / (Scalar a)
const {
311 PositionVector2D tmp(*
this);
319 void Rotate( Scalar angle) {
320 return fCoordinates.Rotate(angle);
325 Scalar x()
const {
return fCoordinates.X(); }
326 Scalar y()
const {
return fCoordinates.Y(); }
327 Scalar r()
const {
return fCoordinates.R(); }
328 Scalar phi()
const {
return fCoordinates.Phi(); }
329 Scalar mag2()
const {
return fCoordinates.Mag2(); }
333 CoordSystem fCoordinates;
339 template <
class OtherCoords,
class OtherTag>
340 explicit PositionVector2D(
const PositionVector2D<OtherCoords, OtherTag> & );
342 template <
class OtherCoords,
class OtherTag>
343 explicit PositionVector2D(
const DisplacementVector2D<OtherCoords, OtherTag> & );
345 template <
class OtherCoords,
class OtherTag>
346 PositionVector2D & operator=(
const PositionVector2D<OtherCoords, OtherTag> & );
348 template <
class OtherCoords,
class OtherTag>
349 PositionVector2D & operator=(
const DisplacementVector2D<OtherCoords, OtherTag> & );
351 template <
class OtherCoords,
class OtherTag>
352 PositionVector2D & operator+=(
const DisplacementVector2D<OtherCoords, OtherTag> & );
354 template <
class OtherCoords,
class OtherTag>
355 PositionVector2D & operator-=(
const DisplacementVector2D<OtherCoords, OtherTag> & );
373 template <
class CoordSystem,
class U>
375 PositionVector2D<CoordSystem>
376 operator * (
typename PositionVector2D<CoordSystem,U>::Scalar a,
377 PositionVector2D<CoordSystem,U> v) {
390 template <
class CoordSystem1,
class CoordSystem2,
class U>
392 DisplacementVector2D<CoordSystem1,U>
393 operator-(
const PositionVector2D<CoordSystem1,U> & v1,
394 const PositionVector2D<CoordSystem2,U> & v2) {
395 return DisplacementVector2D<CoordSystem1,U>( Cartesian2D<typename CoordSystem1::Scalar>(
396 v1.X()-v2.X(), v1.Y()-v2.Y() )
405 template <
class CoordSystem1,
class CoordSystem2,
class U>
407 PositionVector2D<CoordSystem2,U>
408 operator+( PositionVector2D<CoordSystem2,U> p1,
409 const DisplacementVector2D<CoordSystem1,U> & v2) {
418 template <
class CoordSystem1,
class CoordSystem2,
class U>
420 PositionVector2D<CoordSystem2,U>
421 operator+( DisplacementVector2D<CoordSystem1,U>
const & v1,
422 PositionVector2D<CoordSystem2,U> p2) {
431 template <
class CoordSystem1,
class CoordSystem2,
class U>
433 PositionVector2D<CoordSystem2,U>
434 operator-( PositionVector2D<CoordSystem2,U> p1,
435 DisplacementVector2D<CoordSystem1,U>
const & v2) {
443 template<
class char_t,
class traits_t,
class T,
class U >
445 std::basic_ostream<char_t,traits_t> &
446 operator << ( std::basic_ostream<char_t,traits_t> & os
447 , PositionVector2D<T,U>
const & v
452 typename T::Scalar a, b;
453 v.GetCoordinates(a, b);
455 if( detail::get_manip( os, detail::bitforbit ) ) {
456 detail::set_manip( os, detail::bitforbit,
'\00' );
457 typedef GenVector_detail::BitReproducible BR;
462 os << detail::get_manip( os, detail::open ) << a
463 << detail::get_manip( os, detail::sep ) << b
464 << detail::get_manip( os, detail::close );
472 template<
class char_t,
class traits_t,
class T,
class U >
474 std::basic_istream<char_t,traits_t> &
475 operator >> ( std::basic_istream<char_t,traits_t> & is
476 , PositionVector2D<T,U> & v
481 typename T::Scalar a, b;
483 if( detail::get_manip( is, detail::bitforbit ) ) {
484 detail::set_manip( is, detail::bitforbit,
'\00' );
485 typedef GenVector_detail::BitReproducible BR;
490 detail::require_delim( is, detail::open ); is >> a;
491 detail::require_delim( is, detail::sep ); is >> b;
492 detail::require_delim( is, detail::close );
496 v.SetCoordinates(a, b);