00001 
00002 
00003 #if !defined(__geom_kernel_Circle3_h__)
00004 #define __geom_kernel_Circle3_h__
00005 
00006 
00007 #if defined(DEBUG_geom) && !defined(DEBUG_Circle3)
00008 #define DEBUG_Circle3
00009 #endif
00010 
00011 #ifdef DEBUG_Circle3
00012 #ifndef DEBUG_Point
00013 #define DEBUG_Point
00014 #endif
00015 #endif
00016 
00017 #include "Point.h"
00018 #include "SegmentMath.h"
00019 
00020 BEGIN_NAMESPACE_GEOM
00021 
00023 
00028 template<typename T = double>
00029 class Circle3 {
00030   
00031   
00032   
00033 
00034 public:
00035     
00037   typedef T Number;
00039   typedef ads::FixedArray<3,Number> Point;
00040 
00041   
00042   
00043   
00044 
00045 private:
00046     
00047   Point _center;
00048   Point _normal;
00049   Number _radius;
00050     
00051 public:
00052     
00053   
00055   
00056 
00058   Circle3() 
00059   {}
00060 
00062   Circle3(const Point& center, const Point& normal, const Number radius) : 
00063     _center(center),
00064     _normal(normal),
00065     _radius(radius) 
00066   {}
00067 
00069   Circle3(const Circle3& other) :
00070     _center(other._center),
00071     _normal(other._normal),
00072     _radius(other._radius) 
00073   {}
00074 
00076   Circle3& 
00077   operator=(const Circle3& other);
00078 
00080   ~Circle3() 
00081   {}
00082 
00084   void 
00085   make(const Point& center, const Point& normal, const Number radius) { 
00086     _center = center;
00087     _normal = normal;
00088     _radius = radius;
00089   }
00090 
00091   
00092   
00094   
00095 
00097   const Point&
00098   getCenter() const { 
00099     return _center; 
00100   }
00101 
00103   const Point&
00104   getNormal() const { 
00105     return _normal; 
00106   }
00107 
00109   Number
00110   getRadius() const { 
00111     return _radius; 
00112   }
00113     
00114   
00115   
00117   
00118 
00120   void
00121   setCenter(const Point& center) { 
00122     _center = center;
00123   }
00124 
00126   void
00127   setNormal(const Point& normal) { 
00128     _normal = normal;
00129   }
00130 
00132   void
00133   setRadius(const Number radius) { 
00134     _radius = radius;
00135   }
00136     
00137   
00138   
00140   
00141 
00143   Circle3& 
00144   operator+=(const Point& x) {
00145     _center += x;
00146     return (*this);
00147   }
00148 
00150   Circle3& 
00151   operator-=(const Point& x) {
00152     _center -= x;
00153     return (*this);
00154   }
00155 
00156   
00157   
00159 
00160   
00162   bool
00163   isValid() const;
00164   
00166 };
00167 
00168 
00169 
00170 
00171 
00173 template<typename T>
00174 void 
00175 computeClosestPoint(const Circle3<T>& circle, 
00176                     typename Circle3<T>::Point x,
00177                     typename Circle3<T>::Point* closestPoint);
00178 
00180 template<typename T>
00181 void 
00182 computeClosestPoint(const Circle3<T>& circle, 
00183                     const typename Circle3<T>::Point& source,
00184                     const typename Circle3<T>::Point& target,
00185                     typename Circle3<T>::Point* closestPoint,
00186                     T tolerance = std::sqrt(std::numeric_limits<T>::epsilon()),
00187                     int maximumSteps = 10);
00188 
00189 
00190 
00191 
00192 
00194 
00195 template<typename T>
00196 inline
00197 bool 
00198 operator==(const Circle3<T>& x, const Circle3<T>& y) {
00199   return (x.getCenter() == y.getCenter() && x.getNormal() == y.getNormal() && 
00200           x.getRadius() == y.getRadius() );
00201 }
00202 
00203 
00205 
00206 template<typename T>
00207 inline
00208 bool 
00209 operator!=(const Circle3<T>& x, const Circle3<T>& y) {
00210   return !(x == y);
00211 }
00212 
00213 
00214 
00215 
00216 
00217 
00219 
00220 template<typename T>
00221 inline
00222 Circle3<T> 
00223 operator+(const Circle3<T>& circle, const typename Circle3<T>::Point& vector) {
00224   return Circle3<T>(circle.getCenter() + vector, circle.getNormal(),
00225                     circle.getRadius());
00226 }
00227 
00229 
00230 template<typename T>
00231 inline
00232 Circle3<T> 
00233 operator-(const Circle3<T>& circle, const typename Circle3<T>::Point& vector) {
00234   return Circle3<T>(circle.getCenter() - vector, circle.getNormal(),
00235                     circle.getRadius());
00236 }
00237 
00238 
00239 
00240 
00241 
00242 
00244 
00245 template<typename T>
00246 std::istream& 
00247 operator>>(std::istream& in, Circle3<T>& x);
00248 
00250 
00251 template<typename T>
00252 inline
00253 std::ostream& 
00254 operator<<(std::ostream& out, const Circle3<T>& x) {
00255   return out << x.getCenter() << " " << x.getNormal() << " " << x.getRadius();
00256 }
00257 
00258 
00259 END_NAMESPACE_GEOM
00260 
00261 #define __geom_kernel_Circle3_ipp__
00262 #include "Circle3.ipp"
00263 #undef __geom_kernel_Circle3_ipp__
00264   
00265 #endif