Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JCircle2D.hh
Go to the documentation of this file.
1 #ifndef __JCIRCLE2D__
2 #define __JCIRCLE2D__
3 
4 #include <istream>
5 #include <ostream>
6 #include <iterator>
7 #include <cmath>
8 
9 #include "JIO/JSerialisable.hh"
11 
12 
13 /**
14  * \author mdejong
15  */
16 
17 namespace JGEOMETRY2D {}
18 namespace JPP { using namespace JGEOMETRY2D; }
19 
20 namespace JGEOMETRY2D {
21 
22  using JIO::JReader;
23  using JIO::JWriter;
24 
25 
26  /**
27  * Data structure for circle in two dimensions.
28  */
29  class JCircle2D :
30  public JPosition2D
31  {
32  public:
33  /**
34  * Default constructor.
35  */
37  JPosition2D(),
38  __r(0.0)
39  {}
40 
41 
42  /**
43  * Constructor.
44  *
45  * \param point point
46  * \param r radius
47  */
48  JCircle2D(const JVector2D& point,
49  const double r) :
50  JPosition2D(point),
51  __r(r)
52  {}
53 
54 
55  /**
56  * Constructor.
57  * Determines circle through two points.
58  *
59  * \param p0 first point
60  * \param p1 second point
61  */
62  JCircle2D(const JVector2D& p0,
63  const JVector2D& p1) :
64  JPosition2D(),
65  __r(0.0)
66  {
67  set(p0, p1);
68  }
69 
70 
71  /**
72  * Constructor.
73  * Determines circle through three points.
74  *
75  * \param p0 first point
76  * \param p1 second point
77  * \param p2 third point
78  */
79  JCircle2D(const JVector2D& p0,
80  const JVector2D& p1,
81  const JVector2D& p2) :
82  JPosition2D(),
83  __r(0.0)
84  {
85  set(p0, p1, p2);
86  }
87 
88 
89  /**
90  * Constructor.
91  * Determines smallest enclosing circle around set of points.
92  * The type of data should have the following member methods:
93  * <pre>
94  * double getX(); // x coordinate
95  * double getY(); // y coordinate
96  * </pre>
97  *
98  * Reference:
99  * Computational Geometry
100  * Algorithms and Applications
101  * Authors: de Berg, M., Cheong, O., van Kreveld, M., Overmars, M.
102  *
103  * \param __begin begin of data
104  * \param __end end of data
105  */
106  template<class T>
107  JCircle2D(T __begin,
108  T __end) :
109  JPosition2D(),
110  __r(0.0)
111  {
112  set(__begin, __end);
113  }
114 
115 
116  /**
117  * Get radius.
118  *
119  * \return radius
120  */
121  double getRadius() const
122  {
123  return __r;
124  }
125 
126 
127  /**
128  * Set circle.
129  * Determines circle through two points.
130  *
131  * \param p0 first point
132  * \param p1 second point
133  */
134  void set(const JVector2D& p0,
135  const JVector2D& p1)
136  {
137  __x = 0.5 * (p0.getX() + p1.getX());
138  __y = 0.5 * (p0.getY() + p1.getY());
139  __r = this->getDistance(p0);
140  }
141 
142 
143  /**
144  * Set circle.
145  * Determines circle through three points.
146  *
147  * \param p0 first point
148  * \param p1 second point
149  * \param p2 third point
150  */
151  void set(const JVector2D& p0,
152  const JVector2D& p1,
153  const JVector2D& p2)
154  {
155  const double x0 = p2.getX() - p1.getX();
156  const double x1 = p0.getX() - p2.getX();
157  const double x2 = p1.getX() - p0.getX();
158 
159  const double y0 = p1.getY() - p2.getY();
160  const double y1 = p2.getY() - p0.getY();
161  const double y2 = p0.getY() - p1.getY();
162 
163  const double D = 2.0 * (p0.getX()*y0 + p1.getX()*y1 + p2.getX()*y2);
164 
165  if (D != 0.0) {
166 
167  const double a = p0.getLengthSquared();
168  const double b = p1.getLengthSquared();
169  const double c = p2.getLengthSquared();
170 
171  __x = (a*y0 + b*y1 + c*y2) / D;
172  __y = (a*x0 + b*x1 + c*x2) / D;
173  __r = this->getDistance(p0);
174 
175  } else {
176 
177  set(p0, p1);
178 
179  const JCircle2D c1(p1, p2);
180  const JCircle2D c2(p0, p2);
181 
182  if (c1.getRadius() > this->getRadius()) { *this = c1; }
183  if (c2.getRadius() > this->getRadius()) { *this = c2; }
184  }
185  }
186 
187 
188  /**
189  * Set circle.
190  * Determines smallest enclosing circle around set of points.
191  * <pre>
192  * double getX(); // x coordinate
193  * double getY(); // y coordinate
194  * </pre>
195  *
196  * \param __begin begin of data
197  * \param __end end of data
198  */
199  template<class T>
200  void set(T __begin,
201  T __end)
202  {
203  if (std::distance(__begin,__end) == 1) {
204 
205  __x = __begin->getX();
206  __y = __begin->getY();
207  __r = 0.0;
208 
209  } else if (std::distance(__begin,__end) > 1) {
210 
211  T j = __begin;
212 
213  const JVector2D p0(j->getX(), j->getY());
214 
215  ++j;
216 
217  const JVector2D p1(j->getX(), j->getY());
218 
219  set(p0, p1);
220 
221  while (++j != __end) {
222 
223  const JVector2D p2(j->getX(), j->getY());
224 
225  if (this->getDistance(p2) > this->getRadius()) {
226  configure(__begin, j, p2);
227  }
228  }
229  }
230  }
231 
232 
233  /**
234  * Check whether given point is inside circle.
235  *
236  * \param pos position
237  * \return true if inside; else false
238  */
239  inline bool is_inside(const JVector2D& pos) const
240  {
241  return (this->getDistance(pos) <= this->getRadius());
242  }
243 
244 
245  /**
246  * Read circle from input stream.
247  *
248  * \param in input stream
249  * \param circle circle
250  * \return input stream
251  */
252  friend inline std::istream& operator>>(std::istream& in, JCircle2D& circle)
253  {
254  in >> static_cast<JPosition2D&>(circle);
255  in >> circle.__r;
256 
257  return in;
258  }
259 
260 
261  /**
262  * Write circle to output stream.
263  *
264  * \param out output stream
265  * \param circle circle
266  * \return output stream
267  */
268  friend inline std::ostream& operator<<(std::ostream& out, const JCircle2D& circle)
269  {
270  out << static_cast<const JPosition2D&>(circle);
271  out << ' ';
272  out << circle.__r;
273 
274  return out;
275  }
276 
277 
278  /**
279  * Read circle from input.
280  *
281  * \param in reader
282  * \param circle circle
283  * \return reader
284  */
285  friend inline JReader& operator>>(JReader& in, JCircle2D& circle)
286  {
287  in >> static_cast<JPosition2D&>(circle);
288  in >> circle.__r;
289 
290  return in;
291  }
292 
293 
294  /**
295  * Write circle to output.
296  *
297  * \param out writer
298  * \param circle circle
299  * \return writer
300  */
301  friend inline JWriter& operator<<(JWriter& out, const JCircle2D& circle)
302  {
303  out << static_cast<const JPosition2D&>(circle);
304  out << circle.__r;
305 
306  return out;
307  }
308 
309 
310  protected:
311  double __r;
312 
313 
314  private:
315  /**
316  * Determine smallest enclosing circle.
317  *
318  * \param __begin begin of data
319  * \param __end end of data
320  * \param p0 point on circle
321  */
322  template<class T>
323  void configure(T __begin,
324  T __end,
325  const JVector2D& p0)
326  {
327  this->set(JVector2D(__begin->getX(), __begin->getY()), p0);
328 
329  for (T i = __begin; ++i != __end; ) {
330 
331  const JVector2D p1(i->getX(), i->getY());
332 
333  if (this->getDistance(p1) > this->getRadius()) {
334  configure(__begin, i, p0, p1);
335  }
336  }
337  }
338 
339 
340  /**
341  * Determine smallest enclosing circle.
342  *
343  * \param __begin begin of data
344  * \param __end end of data
345  * \param p0 point on circle
346  * \param p1 point on circle
347  */
348  template<class T>
349  void configure(T __begin,
350  T __end,
351  const JVector2D& p0,
352  const JVector2D& p1)
353  {
354  this->set(p0, p1);
355 
356  for (T i = __begin; i != __end; ++i) {
357 
358  const JVector2D p2(i->getX(), i->getY());
359 
360  if (this->getDistance(p2) > this->getRadius()) {
361 
362  const JCircle2D c1(p0, p1, p2);
363 
364  if (c1.getRadius() > this->getRadius()) { *this = c1; }
365  }
366  }
367  }
368  };
369 }
370 
371 #endif
Data structure for vector in two dimensions.
Definition: JVector2D.hh:31
JCircle2D()
Default constructor.
Definition: JCircle2D.hh:36
double getLengthSquared() const
Get length squared.
Definition: JVector2D.hh:187
Interface for binary output.
do echo Generating $dir eval D
Definition: JDrawLED.sh:50
double getRadius() const
Get radius.
Definition: JCircle2D.hh:121
TPaveText * p1
JVector2D()
Default constructor.
Definition: JVector2D.hh:38
bool is_inside(const JVector2D &pos) const
Check whether given point is inside circle.
Definition: JCircle2D.hh:239
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Data structure for circle in two dimensions.
Definition: JCircle2D.hh:29
double getDistance(const JVector2D &point) const
Get distance to point.
Definition: JVector2D.hh:222
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
Definition: JSirene.sh:45
friend JWriter & operator<<(JWriter &out, const JCircle2D &circle)
Write circle to output.
Definition: JCircle2D.hh:301
data_type r[M+1]
Definition: JPolint.hh:709
void set(const JVector2D &p0, const JVector2D &p1, const JVector2D &p2)
Set circle.
Definition: JCircle2D.hh:151
fi JEventTimesliceWriter a
double getY() const
Get y position.
Definition: JVector2D.hh:73
void configure(T __begin, T __end, const JVector2D &p0, const JVector2D &p1)
Determine smallest enclosing circle.
Definition: JCircle2D.hh:349
JCircle2D(const JVector2D &p0, const JVector2D &p1)
Constructor.
Definition: JCircle2D.hh:62
friend std::ostream & operator<<(std::ostream &out, const JCircle2D &circle)
Write circle to output stream.
Definition: JCircle2D.hh:268
double getX() const
Get x position.
Definition: JVector2D.hh:62
do set_variable OUTPUT_DIRECTORY $WORKDIR T
Interface for binary input.
TCanvas * c1
Global variables to handle mouse events.
Data structure for position in two dimensions.
Definition: JPosition2D.hh:30
void set(T __begin, T __end)
Set circle.
Definition: JCircle2D.hh:200
JCircle2D(const JVector2D &point, const double r)
Constructor.
Definition: JCircle2D.hh:48
JCircle2D(T __begin, T __end)
Constructor.
Definition: JCircle2D.hh:107
friend JReader & operator>>(JReader &in, JCircle2D &circle)
Read circle from input.
Definition: JCircle2D.hh:285
int j
Definition: JPolint.hh:634
void set(const JVector2D &p0, const JVector2D &p1)
Set circle.
Definition: JCircle2D.hh:134
friend std::istream & operator>>(std::istream &in, JCircle2D &circle)
Read circle from input stream.
Definition: JCircle2D.hh:252
JCircle2D(const JVector2D &p0, const JVector2D &p1, const JVector2D &p2)
Constructor.
Definition: JCircle2D.hh:79
void configure(T __begin, T __end, const JVector2D &p0)
Determine smallest enclosing circle.
Definition: JCircle2D.hh:323