You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							146 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							146 lines
						
					
					
						
							4.7 KiB
						
					
					
				| /*===========================================================================*\ | |
|  *                                                                           * | |
|  *                                IsoEx                                      * | |
|  *        Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen         * | |
|  *                         www.rwth-graphics.de                              * | |
|  *                                                                           * | |
|  *---------------------------------------------------------------------------*  | |
|  *                                                                           * | |
|  *                                License                                    * | |
|  *                                                                           * | |
|  *  This library is free software; you can redistribute it and/or modify it  * | |
|  *  under the terms of the GNU Library General Public License as published   * | |
|  *  by the Free Software Foundation, version 2.                              * | |
|  *                                                                           * | |
|  *  This library is distributed in the hope that it will be useful, but      * | |
|  *  WITHOUT ANY WARRANTY; without even the implied warranty of               * | |
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        * | |
|  *  Library General Public License for more details.                         * | |
|  *                                                                           * | |
|  *  You should have received a copy of the GNU Library General Public        * | |
|  *  License along with this library; if not, write to the Free Software      * | |
|  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                * | |
|  *                                                                           * | |
| \*===========================================================================*/ | |
| 
 | |
| //============================================================================= | |
| // | |
| //  CLASS ImplicitSphere | |
| // | |
| //============================================================================= | |
|  | |
| 
 | |
| #ifndef ISOEX_IMPLICITSPHERE_HH | |
| #define ISOEX_IMPLICITSPHERE_HH | |
|  | |
| 
 | |
| //== INCLUDES ================================================================= | |
|  | |
| #include "Implicit.hh" | |
| #include <IsoEx/Config/IsoExDefines.hh> | |
|  | |
| //== NAMESPACES =============================================================== | |
|  | |
| namespace IsoEx { | |
| 
 | |
| //== CLASS DEFINITION ========================================================= | |
|  | |
| 	       | |
| /** \class ImplicitSphere ImplicitSphere.hh <IsoEx/Implicits/ImplicitSphere.hh> | |
|     This class implements a very simple implicit object: a sphere given its | |
|     center and its radius. | |
|     \see IsoEx::Implicit | |
|     \ingroup implicits | |
| */	       | |
| template< class Vec3 > | |
| class ISOEXDLLEXPORT ImplicitSphere : public Implicit<Vec3> | |
| { | |
| public: | |
| 
 | |
|   typedef typename Vec3::value_type real; | |
|     | |
|   /// \name Constructor & destructor | |
|   //@{ | |
|  | |
|   /// Constructor: given sphere center and radius | |
|   ImplicitSphere(const Vec3& _center, real _radius) | |
|     : center_(_center),  | |
|       radius_(_radius),  | |
|       sqr_radius_(_radius*_radius) | |
|   {} | |
| 
 | |
|   /// Empty destructor | |
|   ~ImplicitSphere() {} | |
| 
 | |
|   //@} | |
|  | |
| 
 | |
| 
 | |
|   /// \name Abstract interface of implicit objects, see also IsoEx::Implicit. | |
|   //@{ | |
|  | |
|   //_isovalue is not implemented in this class //YANG LIU | |
|  | |
|   bool is_inside(const Vec3& _point, const Real _isovalue = 0) const | |
|   { | |
|     return (center_ - _point).sqrnorm() <= sqr_radius_; | |
|   } | |
| 
 | |
|   real scalar_distance(const Vec3& _point) const | |
|   { | |
|     return (center_ - _point).norm() - radius_; | |
|   } | |
| 
 | |
|   bool directed_distance(const Vec3&  _p0, | |
| 			 const Vec3&  _p1, | |
| 			 Vec3&        _point, | |
| 			 Vec3&        _normal, | |
| 			 real&        _distance, | |
|             const real _isovalue = 0) const | |
|   { | |
|     Vec3 orig(_p0), dir(_p1-_p0); | |
| 
 | |
|     double a = dir.sqrnorm(); | |
|     double b = 2.0*(dir | (orig - center_)); | |
|     double c = (orig - center_).sqrnorm() - radius_*radius_; | |
|     double d = b*b - 4.0*a*c; | |
| 
 | |
|     if (d >= 0) | |
|     { | |
|       d = sqrt(d); | |
| 
 | |
|       double t1 = (-b-d) / (2.0*a); | |
|       double t2 = (-b+d) / (2.0*a); | |
|       double t  = 1.00001; | |
|       if (t1 >= 0.0 && t1 < t) t = t1; | |
|       if (t2 >= 0.0 && t2 < t) t = t2; | |
| 
 | |
|       if (t != 1.00001) | |
|       { | |
| 	_point    = orig + dir*t; | |
| 	_normal   = (_point - center_) / radius_; | |
| 	_distance = ((dir | _normal) < 0.0) ? dir.norm()*t : -dir.norm()*t; | |
| 	return true; | |
|       } | |
|     } | |
| 
 | |
|     return false; | |
|   } | |
|    | |
|   //@} | |
|  | |
| 
 | |
| private: | |
| 
 | |
|   Vec3  center_; | |
|   real            radius_; | |
|   real            sqr_radius_; | |
| }; | |
| 
 | |
| 
 | |
| //============================================================================= | |
| } // namespace IsoEx | |
| //============================================================================= | |
| #endif // ISOEX_IMPLICITSPHERE_HH defined | |
| //============================================================================= | |
| 
 | |
| 
 |