CMS 3D CMS Logo

extBasic2DVector.h
Go to the documentation of this file.
1 #ifndef GeometryVector_newBasic2DVector_h
2 #define GeometryVector_newBasic2DVector_h
3 
8 
9 #include <cmath>
10 #include <iosfwd>
11 
12 template <class T>
14 public:
15  typedef T ScalarType;
19 
24  Basic2DVector() : v{0, 0} {}
25 
27  Basic2DVector(const Basic2DVector& p) : v(p.v) {}
28 
30  Basic2DVector& operator=(const Basic2DVector&) = default;
31 
32  template <typename U>
33  Basic2DVector(const Basic2DVector<U>& p) : v{T(p.v[0]), T(p.v[1])} {}
34 
42  template <class Other>
43  explicit Basic2DVector(const Other& p) : v{T(p.x()), T(p.y())} {}
44 
46  Basic2DVector(const T& x, const T& y) : v{x, y} {}
47 
48  // constructor from Vec2 or vec4
49  Basic2DVector(MathVector const& iv) : v(iv) {}
50  template <typename U>
51  Basic2DVector(Vec2<U> const& iv) : v{iv[0], iv[1]} {}
52  template <typename U>
53  Basic2DVector(Vec4<U> const& iv) : v{iv[0], iv[1]} {}
54 
55  MathVector const& mathVector() const { return v; }
56  MathVector& mathVector() { return v; }
57 
58  T operator[](int i) const { return v[i]; }
59  T& operator[](int i) { return v[i]; }
60 
62  T x() const { return v[0]; }
63 
65  T y() const { return v[1]; }
66 
68  T mag2() const { return ::dot(v, v); }
69 
71  T mag() const { return std::sqrt(mag2()); }
72 
74  T r() const { return mag(); }
75 
80  T barePhi() const { return std::atan2(y(), x()); }
81  Geom::Phi<T> phi() const { return Geom::Phi<T>(atan2(y(), x())); }
82 
86  Basic2DVector unit() const {
87  T my_mag = mag();
88  return my_mag == 0 ? *this : *this / my_mag;
89  }
90 
93  template <class U>
95  v = v + p.v;
96  return *this;
97  }
98 
101  template <class U>
103  v = v - p.v;
104  return *this;
105  }
106 
108  Basic2DVector operator-() const { return Basic2DVector(-v); }
109 
112  v = v * t;
113  return *this;
114  }
115 
118  t = T(1) / t;
119  v = v * t;
120  return *this;
121  }
122 
124  T dot(const Basic2DVector& lh) const { return ::dot(v, lh.v); }
125 
131  template <class U>
135  }
136 
138  T cross(const Basic2DVector& lh) const { return ::cross2(v, lh.v); }
139 
145  template <class U>
149  }
150 
151 public:
153 };
154 
155 namespace geometryDetails {
156  std::ostream& print2D(std::ostream& s, double x, double y);
157 
158 }
159 
161 template <class T>
162 inline std::ostream& operator<<(std::ostream& s, const Basic2DVector<T>& v) {
163  return geometryDetails::print2D(s, v.x(), v.y());
164 }
165 
167 template <class T>
169  return a.v + b.v;
170 }
171 template <class T>
173  return a.v - b.v;
174 }
175 
176 template <class T, class U>
178  const Basic2DVector<U>& b) {
180  return RT(a) + RT(b);
181 }
182 
183 template <class T, class U>
185  const Basic2DVector<U>& b) {
187  return RT(a) - RT(b);
188 }
189 
190 // scalar product of vectors of same precision
191 template <class T>
192 inline T operator*(const Basic2DVector<T>& v1, const Basic2DVector<T>& v2) {
193  return v1.dot(v2);
194 }
195 
197 template <class T, class U>
199  return v1.dot(v2);
200 }
201 
205 template <class T>
207  return v.v * t;
208 }
209 
211 template <class T>
213  return v.v * t;
214 }
215 
216 template <class T, class Scalar>
218  T t = static_cast<T>(s);
219  return v * t;
220 }
221 
223 template <class T, class Scalar>
225  T t = static_cast<T>(s);
226  return v * t;
227 }
228 
232 template <class T>
234  return v.v / t;
235 }
236 
237 template <class T, class Scalar>
239  // T t = static_cast<T>(Scalar(1)/s); return v*t;
240  T t = static_cast<T>(s);
241  return v / t;
242 }
243 
246 
247 #endif // GeometryVector_Basic2DVector_h
ExtVec< T, 2 > Vec2
Definition: ExtVec.h:62
Basic2DVector(const T &x, const T &y)
construct from cartesian coordinates
auto cross2(V1 x, V2 y) -> typename std::remove_reference< decltype(x[0])>::type
Definition: ExtVec.h:98
double Scalar
Definition: Definitions.h:25
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
Basic2DVector(Vec2< U > const &iv)
MathVector const & mathVector() const
Basic2DVector(const Basic2DVector &p)
Copy constructor from same type. Should not be needed but for gcc bug 12685.
Vec2< T > MathVector
Basic2DVector(Vec4< U > const &iv)
Basic2DVector< T > operator+(const Basic2DVector< T > &a, const Basic2DVector< T > &b)
vector sum and subtraction of vectors of possibly different precision
T y() const
Cartesian y coordinate.
Basic2DVector & operator=(const Basic2DVector &)=default
Assignment operator.
bool int lh
Definition: SIMDVec.h:20
Basic2DVector(const Basic2DVector< U > &p)
Basic2DVector(const Other &p)
Basic2DVector< double > Basic2DVectorD
T dot(const Basic3DVector &v) const
Scalar product, or "dot" product, with a vector of same type.
Basic2DVector< T > operator-(const Basic2DVector< T > &a, const Basic2DVector< T > &b)
Basic2DVector< float > Basic2DVectorF
Geom::Phi< T > phi() const
Geom::Polar2Cartesian< T > Polar
T sqrt(T t)
Definition: SSEVec.h:19
T operator*(const Basic2DVector< T > &v1, const Basic2DVector< T > &v2)
T cross(const Basic2DVector &lh) const
Vector product, or "cross" product, with a vector of same type.
Basic2DVector & operator*=(T t)
Scaling by a scalar value (multiplication)
PreciseFloatType< T, U >::Type cross(const Basic2DVector< U > &lh) const
Basic2DVector & operator/=(T t)
Scaling by a scalar value (division)
std::ostream & print2D(std::ostream &s, double x, double y)
Definition: print.cc:8
Basic2DVector(MathVector const &iv)
Basic2DVector unit() const
ExtVec< T, 4 > Vec4
Definition: ExtVec.h:60
Basic2DVector & operator+=(const Basic2DVector< U > &p)
Basic2DVector< T > operator/(const Basic2DVector< T > &v, T t)
MathVector & mathVector()
Basic2DVector operator-() const
Unary minus, returns a vector with components (-x(),-y(),-z())
T r() const
Radius, same as mag()
T & operator[](int i)
Basic2DVector & operator-=(const Basic2DVector< U > &p)
T dot(const Basic2DVector &lh) const
Scalar product, or "dot" product, with a vector of same type.
double b
Definition: hdecay.h:120
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
T barePhi() const
double a
Definition: hdecay.h:121
float x
Vec2< T > VectorType
long double T
Definition: Phi.h:52
T x() const
Cartesian x coordinate.
PreciseFloatType< T, U >::Type dot(const Basic2DVector< U > &lh) const
T operator[](int i) const