Jpp
JAngle2D.hh
Go to the documentation of this file.
1 #ifndef __JANGLE2D__
2 #define __JANGLE2D__
3 
4 #include <istream>
5 #include <ostream>
6 #include <limits>
7 #include <cmath>
8 
9 #include "JTools/JConstants.hh"
10 #include "JIO/JSerialisable.hh"
11 #include "JMath/JMath.hh"
12 
13 
14 /**
15  * \author mdejong
16  */
17 
18 namespace JGEOMETRY2D {}
19 namespace JPP { using namespace JGEOMETRY2D; }
20 
21 namespace JGEOMETRY2D {
22 
23  using JIO::JReader;
24  using JIO::JWriter;
25 
26 
27  /**
28  * Data structure for angle in two dimensions.
29  * This class serves as input to the rotation matrix JRotation2D.
30  */
31  class JAngle2D :
32  public JMATH::JMath<JAngle2D>
33  {
34  public:
35  /**
36  * Default constructor.
37  */
39  __phi(0.0)
40  {}
41 
42 
43  /**
44  * Constructor.
45  *
46  * \param phi phi angle [rad]
47  */
48  JAngle2D(const double phi) :
49  __phi(phi)
50  {}
51 
52 
53  /**
54  * Constructor.
55  *
56  * \param x x value
57  * \param y y value
58  */
59  JAngle2D(const double x,
60  const double y) :
61  __phi(atan2(y,x))
62  {}
63 
64 
65  /**
66  * Get phi angle.
67  *
68  * \return phi angle
69  */
70  double getPhi() const
71  {
72  return __phi;
73  }
74 
75 
76  /**
77  * Get x direction.
78  *
79  * \return x direction
80  */
81  double getDX() const
82  {
83  return cos(__phi);
84  }
85 
86 
87  /**
88  * Get y direction.
89  *
90  * \return y direction
91  */
92  double getDY() const
93  {
94  return sin(__phi);
95  }
96 
97 
98  /**
99  * Negate angle.
100  *
101  * \return this angle
102  */
104  {
105  __phi = -__phi;
106 
107  return *this;
108  }
109 
110 
111  /**
112  * Add angle.
113  *
114  * \param angle angle
115  * \return this angle
116  */
117  JAngle2D& add(const JAngle2D& angle)
118  {
119  __phi += angle.getPhi();
120 
121  return *this;
122  }
123 
124 
125  /**
126  * Subtract angle.
127  *
128  * \param angle angle
129  * \return this angle
130  */
131  JAngle2D& sub(const JAngle2D& angle)
132  {
133  __phi -= angle.getPhi();
134 
135  return *this;
136  }
137 
138 
139  /**
140  * Scale angle.
141  *
142  * \param factor multiplication factor
143  * \return this angle
144  */
145  JAngle2D& mul(const double factor)
146  {
147  __phi *= factor;
148 
149  return *this;
150  }
151 
152 
153  /**
154  * Scale angle.
155  *
156  * \param factor division factor
157  * \return this angle
158  */
159  JAngle2D& div(const double factor)
160  {
161  __phi /= factor;
162 
163  return *this;
164  }
165 
166 
167  /**
168  * Check equality.
169  *
170  * \param angle angle
171  * \return true if angles are equal; else false
172  */
173  bool equals(const JAngle2D& angle,
174  const double precision = std::numeric_limits<double>::min()) const
175  {
176  return fabs(getPhi() - angle.getPhi()) <= precision;
177  }
178 
179 
180  /**
181  * Get dot product.
182  *
183  * \param angle angle
184  * \return dot product
185  */
186  double getDot(const JAngle2D& angle) const
187  {
188  return cos(getPhi() - angle.getPhi());
189  }
190 
191 
192  /**
193  * Normalise angle.
194 
195  * - phi angle will be between 0 and 2&pi;
196  *
197  * \return this angle
198  */
200  {
201  using JTOOLS::PI;
202 
203  if (__phi > 2*PI) { do { __phi -= 2*PI; } while (__phi > 2*PI); }
204  if (__phi < 0.0) { do { __phi += 2*PI; } while (__phi < 0.0); }
205 
206  return *this;
207  }
208 
209 
210  /**
211  * Read angle from input.
212  *
213  * \param in input stream
214  * \param angle angle
215  * \return input stream
216  */
217  friend inline std::istream& operator>>(std::istream& in, JAngle2D& angle)
218  {
219  return in >> angle.__phi;
220  }
221 
222 
223  /**
224  * Write angle to output.
225  *
226  * \param out output stream
227  * \param angle angle
228  * \return output stream
229  */
230  friend inline std::ostream& operator<<(std::ostream& out, const JAngle2D& angle)
231  {
232  return out << angle.getPhi();
233  }
234 
235 
236  /**
237  * Read angle from input.
238  *
239  * \param in reader
240  * \param angle angle
241  * \return reader
242  */
243  friend inline JReader& operator>>(JReader& in, JAngle2D& angle)
244  {
245  return in >> angle.__phi;
246  }
247 
248 
249  /**
250  * Write angle to output.
251  *
252  * \param out writer
253  * \param angle angle
254  * \return writer
255  */
256  friend inline JWriter& operator<<(JWriter& out, const JAngle2D& angle)
257  {
258  return out << angle.__phi;
259  }
260 
261  protected:
262  double __phi;
263  };
264 }
265 
266 #endif
JIO::JReader
Interface for binary input.
Definition: JSerialisable.hh:62
JGEOMETRY2D::JAngle2D::equals
bool equals(const JAngle2D &angle, const double precision=std::numeric_limits< double >::min()) const
Check equality.
Definition: JAngle2D.hh:173
JGEOMETRY2D::JAngle2D::getDX
double getDX() const
Get x direction.
Definition: JAngle2D.hh:81
JGEOMETRY2D::JAngle2D::__phi
double __phi
Definition: JAngle2D.hh:262
JGEOMETRY2D::JAngle2D::sub
JAngle2D & sub(const JAngle2D &angle)
Subtract angle.
Definition: JAngle2D.hh:131
JGEOMETRY2D::JAngle2D::operator<<
friend JWriter & operator<<(JWriter &out, const JAngle2D &angle)
Write angle to output.
Definition: JAngle2D.hh:256
JGEOMETRY2D::JAngle2D::operator>>
friend std::istream & operator>>(std::istream &in, JAngle2D &angle)
Read angle from input.
Definition: JAngle2D.hh:217
JGEOMETRY2D::JAngle2D::mul
JAngle2D & mul(const double factor)
Scale angle.
Definition: JAngle2D.hh:145
JGEOMETRY2D::JAngle2D::operator<<
friend std::ostream & operator<<(std::ostream &out, const JAngle2D &angle)
Write angle to output.
Definition: JAngle2D.hh:230
JMATH::JMath
Auxiliary base class for aritmetic operations of derived class types.
Definition: JMath.hh:26
JGEOMETRY2D
Auxiliary classes and methods for 2D geometrical objects and operations.
Definition: JAngle2D.hh:18
JGEOMETRY2D::JAngle2D::add
JAngle2D & add(const JAngle2D &angle)
Add angle.
Definition: JAngle2D.hh:117
JGEOMETRY2D::JAngle2D::operator>>
friend JReader & operator>>(JReader &in, JAngle2D &angle)
Read angle from input.
Definition: JAngle2D.hh:243
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JSerialisable.hh
JConstants.hh
JGEOMETRY2D::JAngle2D::normalise
JAngle2D & normalise()
Normalise angle.
Definition: JAngle2D.hh:199
JIO::JWriter
Interface for binary output.
Definition: JSerialisable.hh:130
JGEOMETRY2D::JAngle2D::getDY
double getDY() const
Get y direction.
Definition: JAngle2D.hh:92
JGEOMETRY2D::JAngle2D::JAngle2D
JAngle2D(const double x, const double y)
Constructor.
Definition: JAngle2D.hh:59
JGEOMETRY2D::JAngle2D::JAngle2D
JAngle2D(const double phi)
Constructor.
Definition: JAngle2D.hh:48
JGEOMETRY2D::JAngle2D::JAngle2D
JAngle2D()
Default constructor.
Definition: JAngle2D.hh:38
JMath.hh
JGEOMETRY2D::JAngle2D
Data structure for angle in two dimensions.
Definition: JAngle2D.hh:31
JTOOLS::PI
static const double PI
Constants.
Definition: JConstants.hh:20
JGEOMETRY2D::JAngle2D::getDot
double getDot(const JAngle2D &angle) const
Get dot product.
Definition: JAngle2D.hh:186
JGEOMETRY2D::JAngle2D::div
JAngle2D & div(const double factor)
Scale angle.
Definition: JAngle2D.hh:159
JGEOMETRY2D::JAngle2D::getPhi
double getPhi() const
Get phi angle.
Definition: JAngle2D.hh:70
JGEOMETRY2D::JAngle2D::negate
JAngle2D & negate()
Negate angle.
Definition: JAngle2D.hh:103