16 #ifndef ROOT_Math_GenVector_Cartesian2D
17 #define ROOT_Math_GenVector_Cartesian2D 1
36 template <
class T =
double>
46 Cartesian2D() : fX(0.0), fY(0.0) { }
51 Cartesian2D(Scalar xx, Scalar yy) : fX(xx), fY(yy) { }
57 template <
class CoordSystem>
58 explicit Cartesian2D(
const CoordSystem & v)
59 : fX(v.X()), fY(v.Y()) { }
67 Cartesian2D(
const Cartesian2D & v) :
68 fX(v.X()), fY(v.Y()) { }
73 Cartesian2D & operator= (
const Cartesian2D & v) {
82 void SetCoordinates(Scalar xx, Scalar yy) { fX=xx; fY=yy; }
87 void GetCoordinates(Scalar& xx, Scalar& yy )
const {xx=fX; yy=fY; }
89 Scalar X()
const {
return fX;}
90 Scalar Y()
const {
return fY;}
91 Scalar Mag2()
const {
return fX*fX + fY*fY; }
92 Scalar R()
const {
return sqrt(Mag2()); }
93 Scalar Phi()
const {
return (fX == Scalar(0) && fY == Scalar(0)) ? Scalar(0) : atan2(fY, fX); }
98 void SetX(Scalar a) { fX = a; }
103 void SetY(Scalar a) { fY = a; }
108 void SetXY(Scalar xx, Scalar yy ) {
116 void Scale(Scalar a) { fX *= a; fY *= a; }
121 void Negate() { fX = -fX; fY = -fY; }
126 void Rotate(Scalar angle) {
127 const Scalar s = sin(angle);
128 const Scalar c = cos(angle);
129 SetCoordinates(c * fX - s * fY, s * fX + c * fY);
136 template <
class CoordSystem>
137 Cartesian2D & operator = (
const CoordSystem & v) {
146 bool operator == (
const Cartesian2D & rhs)
const {
147 return fX == rhs.fX && fY == rhs.fY;
149 bool operator != (
const Cartesian2D & rhs)
const {
return !(operator==(rhs));}
156 Scalar x()
const {
return X();}
157 Scalar y()
const {
return Y();}
162 explicit Cartesian2D(
const Polar2D<T2> & v )
164 const Scalar r = v.R();
166 fX = r * std::cos(v.Phi());
167 fY = r * std::sin(v.Phi());
175 Cartesian2D & operator = (
const Polar2D<T2> & v)
177 const Scalar r = v.R();
178 fX = r * cos(v.Phi());
179 fY = r * sin(v.Phi());
185 #if defined(__MAKECINT__) || defined(G__DICTIONARY)
191 void SetPhi(Scalar phi);
212 #if defined(__MAKECINT__) || defined(G__DICTIONARY)
227 void Cartesian2D<T>::SetR(Scalar r) {
228 GenVector_exception e(
"Cartesian2D::SetR() is not supposed to be called");
230 Polar2D<Scalar> v(*
this); v.SetR(r); *
this = Cartesian2D<Scalar>(v);
235 void Cartesian2D<T>::SetPhi(Scalar phi) {
236 GenVector_exception e(
"Cartesian2D::SetPhi() is not supposed to be called");
238 Polar2D<Scalar> v(*
this); v.SetPhi(phi); *
this = Cartesian2D<Scalar>(v);