From af76e5fde88541ab5e3b6b479e979934caba0101 Mon Sep 17 00:00:00 2001 From: ganovelli Date: Fri, 16 Jan 2009 17:01:17 +0000 Subject: [PATCH] added keyword "public" for deriving SpatialHashTable from SpatialIndex --- vcg/space/index/spatial_hashing.h | 618 +++++++++++++++--------------- 1 file changed, 309 insertions(+), 309 deletions(-) diff --git a/vcg/space/index/spatial_hashing.h b/vcg/space/index/spatial_hashing.h index 31501071..773eedea 100644 --- a/vcg/space/index/spatial_hashing.h +++ b/vcg/space/index/spatial_hashing.h @@ -1,316 +1,316 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program 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 General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ - -#ifndef VCGLIB_SPATIAL_HASHING -#define VCGLIB_SPATIAL_HASHING - -#include -#include -//#include -#include -#include -#ifdef _WIN32 - #ifndef __MINGW32__ - #include - #define STDEXT stdext - #else - #include - #define STDEXT __gnu_cxx - #endif -#else - #include - #define STDEXT __gnu_cxx -#endif - - -namespace vcg{ - - - - // hashing function - struct HashFunctor : public std::unary_function - { +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program 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 General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ + +#ifndef VCGLIB_SPATIAL_HASHING +#define VCGLIB_SPATIAL_HASHING + +#include +#include +//#include +#include +#include +#ifdef _WIN32 + #ifndef __MINGW32__ + #include + #define STDEXT stdext + #else + #include + #define STDEXT __gnu_cxx + #endif +#else + #include + #define STDEXT __gnu_cxx +#endif + + +namespace vcg{ + + + + // hashing function + struct HashFunctor : public std::unary_function + { enum { // parameters for hash table bucket_size = 4, // 0 < bucket_size - min_buckets = 8 - }; - - size_t operator()(const Point3i &p) const - { - const size_t _HASH_P0 = 73856093u; - const size_t _HASH_P1 = 19349663u; - const size_t _HASH_P2 = 83492791u; - - return size_t(p.V(0))*_HASH_P0 ^ size_t(p.V(1))*_HASH_P1 ^ size_t(p.V(2))*_HASH_P2; - } + min_buckets = 8 + }; + + size_t operator()(const Point3i &p) const + { + const size_t _HASH_P0 = 73856093u; + const size_t _HASH_P1 = 19349663u; + const size_t _HASH_P2 = 83492791u; + + return size_t(p.V(0))*_HASH_P0 ^ size_t(p.V(1))*_HASH_P1 ^ size_t(p.V(2))*_HASH_P2; + } bool operator()(const Point3i &s1, const Point3i &s2) const { // test if s1 ordered before s2 return (s1 < s2); - } - }; - - - - - /** Spatial Hash Table - Spatial Hashing as described in - "Optimized Spatial Hashing for Coll ision Detection of Deformable Objects", - Matthias Teschner and Bruno Heidelberger and Matthias Muller and Danat Pomeranets and Markus Gross - */ - template < typename ObjType,class FLT=double> - class SpatialHashTable:public BasicGrid, SpatialIndex - { - - public: - typedef SpatialHashTable SpatialHashType; - typedef ObjType* ObjPtr; - typedef typename ObjType::ScalarType ScalarType; - typedef Point3 CoordType; - typedef typename BasicGrid::Box3x Box3x; - - // Hash table definition - // the hash index directly the grid structure. - // We use a MultiMap because we need to store many object (faces) inside each cell of the grid. - - typedef typename STDEXT::hash_multimap HashType; - typedef typename HashType::iterator HashIterator; - HashType hash_table; // The real HASH TABLE ************************************** - - // This vector is just a handy reference to all the allocated cells, - // becouse hashed multimaps does not expose a direct list of all the different keys. - std::vector AllocatedCells; - - // Class to abstract a HashIterator (that stores also the key, - // while the interface of the generic spatial indexing need only simple object (face) pointers. - - struct CellIterator - { - CellIterator(){} - HashIterator t; - ObjPtr &operator *(){return t->second;} - bool operator != (const CellIterator & p) const {return t!=p.t;} - void operator ++() {t++;} - }; - - protected: - - ///insert a new cell - void InsertObject(ObjType* s, const Point3i &cell) - { - if(hash_table.count(cell)==0) AllocatedCells.push_back(cell); - hash_table.insert(typename HashType::value_type(cell, s)); - } - - - public: - - vcg::Box3i Add( ObjType* s) - { - Box3 b; - s->GetBBox(b); - vcg::Box3i bb; - BoxToIBox(b,bb); - //then insert all the cell of bb - for (int i=bb.min.X();i<=bb.max.X();i++) - for (int j=bb.min.Y();j<=bb.max.Y();j++) - for (int k=bb.min.Z();k<=bb.max.Z();k++) - InsertObject(s,vcg::Point3i(i,j,k)); - - return bb; - } - - - /// set an empty spatial hash table - void InitEmpty(const Box3x &_bbox, vcg::Point3i grid_size) - { - Box3x b; - Box3x &bbox = this->bbox; - CoordType &dim = this->dim; - Point3i &siz = this->siz; - CoordType &voxel = this->voxel; - - assert(!_bbox.IsNull()); - bbox=_bbox; - dim = bbox.max - bbox.min; - assert((grid_size.V(0)>0)&&(grid_size.V(1)>0)&&(grid_size.V(2)>0)); - siz=grid_size; - - voxel[0] = dim[0]/siz[0]; - voxel[1] = dim[1]/siz[1]; - voxel[2] = dim[2]/siz[2]; - } - - /// Insert a mesh in the grid. - template - void Set(const OBJITER & _oBegin, const OBJITER & _oEnd, const Box3x &_bbox=Box3x() ) - { - OBJITER i; - Box3x b; - Box3x &bbox = this->bbox; - CoordType &dim = this->dim; - Point3i &siz = this->siz; - CoordType &voxel = this->voxel; - - int _size=(int)std::distance(_oBegin,_oEnd); - if(!_bbox.IsNull()) this->bbox=_bbox; - else - { - for(i = _oBegin; i!= _oEnd; ++i) - { - (*i).GetBBox(b); - this->bbox.Add(b); - } - ///inflate the bb calculated - bbox.Offset(bbox.Diag()/100.0) ; - } - - dim = bbox.max - bbox.min; - BestDim( _size, dim, siz ); - // find voxel size - voxel[0] = dim[0]/siz[0]; - voxel[1] = dim[1]/siz[1]; - voxel[2] = dim[2]/siz[2]; - - for(i = _oBegin; i!= _oEnd; ++i) - Add(&(*i)); - } - - - ///return the simplexes of the cell that contain p - void Grid( const Point3 & p, CellIterator & first, CellIterator & last ) - { - vcg::Point3i _c; - this->PToIP(p,_c); - Grid(_c,first,last); - } - - ///return the simplexes on a specified cell - void Grid( int x,int y,int z, CellIterator & first, CellIterator & last ) - { - Grid(vcg::Point3i(x,y,z),first,last); - } - - ///return the simplexes on a specified cell - void Grid( const Point3i & _c, CellIterator & first, CellIterator & end ) - { - std::pair CellRange = hash_table.equal_range(_c); - first.t=CellRange.first; - end.t=CellRange.second; - } - - void Clear() - { - hash_table.clear(); - AllocatedCells.clear(); - } - - - template - ObjPtr GetClosest(OBJPOINTDISTFUNCTOR & _getPointDistance, OBJMARKER & _marker, - const CoordType & _p, const ScalarType & _maxDist,ScalarType & _minDist, CoordType & _closestPt) - { - return (vcg::GridClosest(*this,_getPointDistance,_marker, _p,_maxDist,_minDist,_closestPt)); - } - - - template - unsigned int GetKClosest(OBJPOINTDISTFUNCTOR & _getPointDistance,OBJMARKER & _marker, - const unsigned int _k, const CoordType & _p, const ScalarType & _maxDist,OBJPTRCONTAINER & _objectPtrs, - DISTCONTAINER & _distances, POINTCONTAINER & _points) - { - return (vcg::GridGetKClosest - (*this,_getPointDistance,_marker,_k,_p,_maxDist,_objectPtrs,_distances,_points)); - } - - template - unsigned int GetInSphere(OBJPOINTDISTFUNCTOR & _getPointDistance, - OBJMARKER & _marker, - const CoordType & _p, - const ScalarType & _r, - OBJPTRCONTAINER & _objectPtrs, - DISTCONTAINER & _distances, - POINTCONTAINER & _points) - { - return(vcg::GridGetInSphere - (*this,_getPointDistance,_marker,_p,_r,_objectPtrs,_distances,_points)); - } - - template - unsigned int GetInBox(OBJMARKER & _marker, - const Box3x _bbox, - OBJPTRCONTAINER & _objectPtrs) - { - return(vcg::GridGetInBox - (*this,_marker,_bbox,_objectPtrs)); - } - - template - ObjPtr DoRay(OBJRAYISECTFUNCTOR & _rayIntersector, OBJMARKER & _marker, const Ray3 & _ray, const ScalarType & _maxDist, ScalarType & _t) - { - return(vcg::GridDoRay - (*this,_rayIntersector,_marker,_ray,_maxDist,_t)); - } - - - }; // end class - - /** Spatial Hash Table Dynamic - Update the Hmark value on the simplex for dynamic updating of contents of the cell. - The simplex must have the HMark() function. - */ - template < typename ContainerType,class FLT=double> - class DynamicSpatialHashTable: public SpatialHashTable - { - public: - typedef typename SpatialHashTable::CoordType CoordType; - typedef typename SpatialHashTable::ObjType ObjType; - typedef typename SpatialHashTable::ObjPtr ObjPtr; - typedef typename SpatialHashTable::Box3x Box3x; - typedef typename SpatialHashTable::CellIterator CellIterator; - - void _UpdateHMark(ObjType* s){ s->HMark() = this->tempMark;} - - void getInCellUpdated(vcg::Point3i cell,std::vector &elems) - { - CellIterator first,last,l; - Grid(cell,first,last); - for (l=first;l!=last;l++) - { - if ((l->second)>=(**l).HMark()) - elems.push_back(&(**l)); - } - } - - }; - - - - - -}// end namespace - -#endif + } + }; + + + + + /** Spatial Hash Table + Spatial Hashing as described in + "Optimized Spatial Hashing for Coll ision Detection of Deformable Objects", + Matthias Teschner and Bruno Heidelberger and Matthias Muller and Danat Pomeranets and Markus Gross + */ + template < typename ObjType,class FLT=double> + class SpatialHashTable:public BasicGrid, public SpatialIndex + { + + public: + typedef SpatialHashTable SpatialHashType; + typedef ObjType* ObjPtr; + typedef typename ObjType::ScalarType ScalarType; + typedef Point3 CoordType; + typedef typename BasicGrid::Box3x Box3x; + + // Hash table definition + // the hash index directly the grid structure. + // We use a MultiMap because we need to store many object (faces) inside each cell of the grid. + + typedef typename STDEXT::hash_multimap HashType; + typedef typename HashType::iterator HashIterator; + HashType hash_table; // The real HASH TABLE ************************************** + + // This vector is just a handy reference to all the allocated cells, + // becouse hashed multimaps does not expose a direct list of all the different keys. + std::vector AllocatedCells; + + // Class to abstract a HashIterator (that stores also the key, + // while the interface of the generic spatial indexing need only simple object (face) pointers. + + struct CellIterator + { + CellIterator(){} + HashIterator t; + ObjPtr &operator *(){return t->second;} + bool operator != (const CellIterator & p) const {return t!=p.t;} + void operator ++() {t++;} + }; + + protected: + + ///insert a new cell + void InsertObject(ObjType* s, const Point3i &cell) + { + if(hash_table.count(cell)==0) AllocatedCells.push_back(cell); + hash_table.insert(typename HashType::value_type(cell, s)); + } + + + public: + + vcg::Box3i Add( ObjType* s) + { + Box3 b; + s->GetBBox(b); + vcg::Box3i bb; + BoxToIBox(b,bb); + //then insert all the cell of bb + for (int i=bb.min.X();i<=bb.max.X();i++) + for (int j=bb.min.Y();j<=bb.max.Y();j++) + for (int k=bb.min.Z();k<=bb.max.Z();k++) + InsertObject(s,vcg::Point3i(i,j,k)); + + return bb; + } + + + /// set an empty spatial hash table + void InitEmpty(const Box3x &_bbox, vcg::Point3i grid_size) + { + Box3x b; + Box3x &bbox = this->bbox; + CoordType &dim = this->dim; + Point3i &siz = this->siz; + CoordType &voxel = this->voxel; + + assert(!_bbox.IsNull()); + bbox=_bbox; + dim = bbox.max - bbox.min; + assert((grid_size.V(0)>0)&&(grid_size.V(1)>0)&&(grid_size.V(2)>0)); + siz=grid_size; + + voxel[0] = dim[0]/siz[0]; + voxel[1] = dim[1]/siz[1]; + voxel[2] = dim[2]/siz[2]; + } + + /// Insert a mesh in the grid. + template + void Set(const OBJITER & _oBegin, const OBJITER & _oEnd, const Box3x &_bbox=Box3x() ) + { + OBJITER i; + Box3x b; + Box3x &bbox = this->bbox; + CoordType &dim = this->dim; + Point3i &siz = this->siz; + CoordType &voxel = this->voxel; + + int _size=(int)std::distance(_oBegin,_oEnd); + if(!_bbox.IsNull()) this->bbox=_bbox; + else + { + for(i = _oBegin; i!= _oEnd; ++i) + { + (*i).GetBBox(b); + this->bbox.Add(b); + } + ///inflate the bb calculated + bbox.Offset(bbox.Diag()/100.0) ; + } + + dim = bbox.max - bbox.min; + BestDim( _size, dim, siz ); + // find voxel size + voxel[0] = dim[0]/siz[0]; + voxel[1] = dim[1]/siz[1]; + voxel[2] = dim[2]/siz[2]; + + for(i = _oBegin; i!= _oEnd; ++i) + Add(&(*i)); + } + + + ///return the simplexes of the cell that contain p + void Grid( const Point3 & p, CellIterator & first, CellIterator & last ) + { + vcg::Point3i _c; + this->PToIP(p,_c); + Grid(_c,first,last); + } + + ///return the simplexes on a specified cell + void Grid( int x,int y,int z, CellIterator & first, CellIterator & last ) + { + Grid(vcg::Point3i(x,y,z),first,last); + } + + ///return the simplexes on a specified cell + void Grid( const Point3i & _c, CellIterator & first, CellIterator & end ) + { + std::pair CellRange = hash_table.equal_range(_c); + first.t=CellRange.first; + end.t=CellRange.second; + } + + void Clear() + { + hash_table.clear(); + AllocatedCells.clear(); + } + + + template + ObjPtr GetClosest(OBJPOINTDISTFUNCTOR & _getPointDistance, OBJMARKER & _marker, + const CoordType & _p, const ScalarType & _maxDist,ScalarType & _minDist, CoordType & _closestPt) + { + return (vcg::GridClosest(*this,_getPointDistance,_marker, _p,_maxDist,_minDist,_closestPt)); + } + + + template + unsigned int GetKClosest(OBJPOINTDISTFUNCTOR & _getPointDistance,OBJMARKER & _marker, + const unsigned int _k, const CoordType & _p, const ScalarType & _maxDist,OBJPTRCONTAINER & _objectPtrs, + DISTCONTAINER & _distances, POINTCONTAINER & _points) + { + return (vcg::GridGetKClosest + (*this,_getPointDistance,_marker,_k,_p,_maxDist,_objectPtrs,_distances,_points)); + } + + template + unsigned int GetInSphere(OBJPOINTDISTFUNCTOR & _getPointDistance, + OBJMARKER & _marker, + const CoordType & _p, + const ScalarType & _r, + OBJPTRCONTAINER & _objectPtrs, + DISTCONTAINER & _distances, + POINTCONTAINER & _points) + { + return(vcg::GridGetInSphere + (*this,_getPointDistance,_marker,_p,_r,_objectPtrs,_distances,_points)); + } + + template + unsigned int GetInBox(OBJMARKER & _marker, + const Box3x _bbox, + OBJPTRCONTAINER & _objectPtrs) + { + return(vcg::GridGetInBox + (*this,_marker,_bbox,_objectPtrs)); + } + + template + ObjPtr DoRay(OBJRAYISECTFUNCTOR & _rayIntersector, OBJMARKER & _marker, const Ray3 & _ray, const ScalarType & _maxDist, ScalarType & _t) + { + return(vcg::GridDoRay + (*this,_rayIntersector,_marker,_ray,_maxDist,_t)); + } + + + }; // end class + + /** Spatial Hash Table Dynamic + Update the Hmark value on the simplex for dynamic updating of contents of the cell. + The simplex must have the HMark() function. + */ + template < typename ContainerType,class FLT=double> + class DynamicSpatialHashTable: public SpatialHashTable + { + public: + typedef typename SpatialHashTable::CoordType CoordType; + typedef typename SpatialHashTable::ObjType ObjType; + typedef typename SpatialHashTable::ObjPtr ObjPtr; + typedef typename SpatialHashTable::Box3x Box3x; + typedef typename SpatialHashTable::CellIterator CellIterator; + + void _UpdateHMark(ObjType* s){ s->HMark() = this->tempMark;} + + void getInCellUpdated(vcg::Point3i cell,std::vector &elems) + { + CellIterator first,last,l; + Grid(cell,first,last); + for (l=first;l!=last;l++) + { + if ((l->second)>=(**l).HMark()) + elems.push_back(&(**l)); + } + } + + }; + + + + + +}// end namespace + +#endif