//============================================================================= // // CLASS ImplicitGrid // //============================================================================= #ifndef ISOEX_IMPLICITGRID_HH #define ISOEX_IMPLICITGRID_HH //== INCLUDES ================================================================= #include #include #include #include #include "IsoSurfGen/TinyVector.h" //== NAMESPACES =============================================================== namespace IsoEx { //== CLASS DEFINITION ========================================================= /** \class ImplicitGrid ImplicitGrid.hh This is the base class for all grids representing implicit objects, i.e. they store a reference to an implicit. All inside/outside tests and distance queries will be passed on to the implicit. In addition, this grid also provides caching of inside/outside tests and scalar distance queries. \ingroup grids */ template class ImplicitGrid : public RegularGrid< Vec3 > { public: typedef typename Vec3::value_type real; /// CubeIdx can be used to refer to cubes typedef typename Grid< Vec3 >::CubeIdx CubeIdx; /// The grid points can be referred to by PointIdx typedef typename Grid< Vec3 >::PointIdx PointIdx; //------------------------------------------------------------ public methods /// Default constructor ImplicitGrid(const Implicit& _implicit, const Vec3& _origin, const Vec3& _x_axis, const Vec3& _y_axis, const Vec3& _z_axis, unsigned int _x_res, unsigned int _y_res, unsigned int _z_res) : RegularGrid< Vec3 >(_origin, _x_axis, _y_axis, _z_axis, _x_res, _y_res, _z_res), implicit_(_implicit) {} /// Destructor virtual ~ImplicitGrid() {} /// \name This function calls will be passed to the implicit object. //@{ /// See IsoEx::Implicit::is_inside() virtual bool is_inside(PointIdx _pidx, const real _isovalue = 0) const { return (is_inside_cache_.empty() ? implicit_.is_inside(this->point(_pidx), _isovalue) : is_inside_cache_[_pidx]); } /// See IsoEx::Implicit::scalar_distance() virtual real scalar_distance(PointIdx _pidx) const { return (scalar_distance_cache_.empty() ? implicit_.scalar_distance(this->point(_pidx)) : scalar_distance_cache_[_pidx]); } /// See IsoEx::Implicit::directed_distance() virtual bool directed_distance(const Vec3& _p0, const Vec3& _p1, Vec3& _point, Vec3& _normal, real& _distance, const real _isovalue = 0 ) const { return implicit_.directed_distance(_p0, _p1, _point, _normal, _distance, _isovalue); } virtual void directed_distance( const std::vector>& _p0vec, const std::vector>& _p1vec, const std::vector& _p0vec_values, const std::vector& _p1vec_values, std::vector>& _point, std::vector>& _normal, const real _isovalue = 0) const { return implicit_.directed_distance(_p0vec, _p1vec, _p0vec_values, _p1vec_values, _point, _normal, _isovalue); } //@} /// \name Enable caching of inside/outside/distance computations //@{ /// Cache results of is_inside() void build_is_inside_cache(const real _isovalue = 0) const { int i, np( this->n_points() ); is_inside_cache_.clear(); is_inside_cache_.resize( this->n_points()); for (i=0; ipoint(i), _isovalue); } /// Cache results of scalar_distance() void build_scalar_distance_cache() const { int i, np(this->n_points()); scalar_distance_cache_.clear(); scalar_distance_cache_.resize(np); for (i=0; ipoint(i)); } std::vector& get_is_inside_cache() { return is_inside_cache_; } const std::vector& get_is_inside_cache() const { return is_inside_cache_; } std::vector& get_scalar_distance_cache() { return scalar_distance_cache_; } const std::vector& get_scalar_distance_cache() const { return scalar_distance_cache_; } //@} protected: const Implicit& implicit_; mutable std::vector is_inside_cache_; mutable std::vector scalar_distance_cache_; }; //============================================================================= } // namespace IsoEx //============================================================================= #endif // ISOEX_IMPLICITGRID_HH defined //=============================================================================