BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
sphere3.h
Go to the documentation of this file.
1 // -*- Mode: C++; tab-width: 2; -*-
2 // vi: set ts=2:
3 //
4 
5 #ifndef BALL_MATHS_SPHERE3_H
6 #define BALL_MATHS_SPHERE3_H
7 
8 #ifdef BALL_HAS_IEEEFP_H
9 # include <ieeefp.h>
10 #endif
11 
12 #include <iostream>
13 
14 #ifndef BALL_MATHS_PLANE3_H
15 # include <BALL/MATHS/plane3.h>
16 #endif
17 
18 #ifndef BALL_MATHS_VECTOR3_H
19 # include <BALL/MATHS/vector3.h>
20 #endif
21 
22 namespace BALL
23 {
28 
31  template <typename T>
32  class TSphere3
33  {
34  public:
35 
37 
38 
41 
47  : p(),
48  radius(0)
49  {
50  }
51 
56  TSphere3(const TSphere3& sphere)
57  : p(sphere.p),
58  radius(sphere.radius)
59  {
60  }
61 
67  TSphere3(const TVector3<T>& point, const T& radius)
68  : p(point),
69  radius(radius)
70  {
71  }
72 
76  virtual ~TSphere3()
77  {
78  }
79 
82  virtual void clear()
83  {
84  p.clear();
85  radius = (T) 0;
86  }
88 
92 
96  void swap(TSphere3& sphere)
97  {
98  TVector3<T> temp_point(p);
99  p = sphere.p;
100  sphere.p = temp_point;
101 
102  T temp = radius;
103  radius = sphere.radius;
104  sphere.radius = temp;
105  }
106 
110  void set(const TSphere3& sphere)
111  {
112  p = sphere.p;
113  radius = sphere.radius;
114  }
115 
121  void set(const TVector3<T>& point, const T& r)
122  {
123  p = point;
124  radius = r;
125  }
126 
131  TSphere3& operator = (const TSphere3& sphere)
132  {
133  p = sphere.p;
134  radius = sphere.radius;
135  return *this;
136  }
137 
142  void get(TSphere3& sphere) const
143  {
144  sphere.p = p;
145  sphere.radius = radius;
146  }
147 
152  void get(TVector3<T>& point, T& r) const
153  {
154  point = p;
155  r = radius;
156  }
157 
159 
162 
166  bool operator == (const TSphere3& sphere) const
167  {
168  return (p == sphere.p && Maths::isEqual(radius, sphere.radius));
169  }
170 
174  bool operator != (const TSphere3& sphere) const
175  {
176  return (p != sphere.p || Maths::isNotEqual(radius, sphere.radius));
177  }
178 
185  bool has(const TVector3<T>& point, bool on_surface = false) const
186  {
187  if (on_surface)
188  {
189  return Maths::isEqual(p.getDistance(point), radius);
190  }
191  else
192  {
193  return Maths::isLessOrEqual(p.getDistance(point), radius);
194  }
195  }
196 
200  bool isEmpty() const
201 
202  {
203  return Maths::isZero(radius);
204  }
205 
207 
210 
215  bool isValid() const
216 
217  {
218  return true;
219  }
220 
227  void dump(std::ostream& s = std::cout, Size depth = 0) const
228 
229  {
231 
232  BALL_DUMP_HEADER(s, this, this);
233 
234  BALL_DUMP_DEPTH(s, depth);
235  s << " position: " << p << std::endl;
236 
237  BALL_DUMP_DEPTH(s, depth);
238  s << " radius: " << radius << std::endl;
239 
241  }
242 
244 
247 
251 
255 
257  };
259 
266 
270  template <typename T>
271  std::istream& operator >> (std::istream& s, TSphere3<T>& sphere)
272 
273  {
274  char c;
275  s >> c >> sphere.p >> sphere.radius >> c;
276  return s;
277  }
278 
285  template <typename T>
286  std::ostream& operator << (std::ostream& s, const TSphere3<T>& sphere)
287 
288  {
289  s << '(' << sphere.p << ' ' << sphere.radius << ')';
290  return s;
291  }
293 
300 
301 } // namespace BALL
302 
303 #endif // BALL_MATHS_SPHERE3_H