diff --git a/vcg/space/index/grid_util.h b/vcg/space/index/grid_util.h index 0296ac44..464c1a02 100644 --- a/vcg/space/index/grid_util.h +++ b/vcg/space/index/grid_util.h @@ -21,9 +21,12 @@ * * ****************************************************************************/ /**************************************************************************** - History +History $Log: not supported by cvs2svn $ +Revision 1.3 2005/07/28 06:11:12 cignoni +corrected error in GridP (did not compile) + Revision 1.2 2005/07/01 11:33:36 cignoni Added a class BasicGrid with some utility function that are scattered among similar classes @@ -36,35 +39,39 @@ Removed BestDim function from the grid_static_ptr class and moved to a indipende #define __VCGLIB_GRID_UTIL - namespace vcg { - -// classe di base per tutte le strutture dati di indexing spaziale basate su griglia. -// contiene tutte le funzioni solite per le conversioni tra point3f e point3i +namespace vcg { - - template - class BasicGrid { - public: - Box3 bbox; - /// Dimensione spaziale (lunghezza lati) del bbox - Point3 dim; + // classe di base per tutte le strutture dati di indexing spaziale basate su griglia. + // contiene tutte le funzioni solite per le conversioni tra point3f e point3i + + + template + class BasicGrid { + + typedef typename Box3 Box3x; + + public: + Box3x bbox; + /// Dimensione spaziale (lunghezza lati) del bbox + Point3 dim; /// Dimensioni griglia in celle - Point3i siz; + Point3i siz; /// Dimensioni di una cella - Point3 voxel; + Point3 voxel; - - // Dato un punto ritorna le coordinate della cella - inline Point3i GridP( const Point3 & p ) const + + // Dato un punto ritorna le coordinate della cella + inline Point3i GridP( const Point3 & p ) const { - Point3i pi; - PToIP(p,pi); - return pi; + Point3i pi; + PToIP(p,pi); + return pi; } + /// Dato un punto 3d ritorna l'indice del box corrispondente - inline void PToIP(const Point3 & p, Point3i &pi ) const + inline void PToIP(const Point3 & p, Point3i &pi ) const { Point3 t = p - bbox.min; pi[0] = int( t[0]/voxel[0] ); @@ -72,105 +79,104 @@ Removed BestDim function from the grid_static_ptr class and moved to a indipende pi[2] = int( t[2]/voxel[2] ); } - /// Dato un box reale ritorna gli indici dei voxel compresi dentro un ibox - void BoxToIBox( const Box3d & b, Box3i & ib ) const + /// Given a voxel index return the lower corner of the voxel + inline void IPToP(const Point3i & pi, Point3 &p ) const { - Point3d t; - - t = (b.min - bbox.min); // Traslo il box b; - t[0] /= voxel[0]; - t[1] /= voxel[1]; - t[2] /= voxel[2]; - ib.min[0] = int( t[0] ); // Trasformazione in intero - ib.min[1] = int( t[1] ); - ib.min[2] = int( t[2] ); - assert(ib.min[0]>=0 && ib.min[1]>=0 && ib.min[2]>=0); - t = (b.max - bbox.min); // Taslo il box b; - t[0] /= voxel[0]; - t[1] /= voxel[1]; - t[2] /= voxel[2]; - ib.max[0] = int( ceil(t[0]) ); // Trasformazione in intero - ib.max[1] = int( ceil(t[1]) ); - ib.max[2] = int( ceil(t[2]) ); - assert(ib.max[0]>=0 && ib.max[1]>=0 && ib.max[2]>=0); + p[0] = ((ScalarType)pi[0])*voxel[0]; + p[1] = ((ScalarType)pi[1])*voxel[1]; + p[2] = ((ScalarType)pi[2])*voxel[2]; + p +=bbox.min; } + /// Dato un box reale ritorna gli indici dei voxel compresi dentro un ibox + void BoxToIBox( const Box3x & b, Box3i & ib ) const + { + PToIP(b.min,ib.min); + PToIP(b.max,ib.max); + assert(ib.max[0]>=0 && ib.max[1]>=0 && ib.max[2]>=0); + } + /// Dato un box in voxel ritorna gli estremi del box reale + void IBoxToBox( const Box3i & ib, Box3x & b ) const + { + IPtoP(ib.min,b.min); + IPtoP(ib.max,b.max); + } - }; + }; - /** Calcolo dimensioni griglia. - Calcola la dimensione della griglia in funzione - della ratio del bounding box e del numero di elementi - */ - template - void BestDim( const int elems, const Point3 & size, Point3i & dim ) - { - const int mincells = 1; // Numero minimo di celle - const double GFactor = 1.0; // GridEntry = NumElem*GFactor - double diag = size.Norm(); // Diagonale del box - double eps = diag*1e-4; // Fattore di tolleranza - - assert(elems>0); - assert(size[0]>=0.0); - assert(size[1]>=0.0); - assert(size[2]>=0.0); - - - int ncell = int(elems*GFactor); // Calcolo numero di voxel - if(ncelleps) + /** Calcolo dimensioni griglia. + Calcola la dimensione della griglia in funzione + della ratio del bounding box e del numero di elementi + */ + template + void BestDim( const int elems, const Point3 & size, Point3i & dim ) { - if(size[1]>eps) - { - if(size[2]>eps) + const int mincells = 1; // Numero minimo di celle + const double GFactor = 1.0; // GridEntry = NumElem*GFactor + double diag = size.Norm(); // Diagonale del box + double eps = diag*1e-4; // Fattore di tolleranza + + assert(elems>0); + assert(size[0]>=0.0); + assert(size[1]>=0.0); + assert(size[2]>=0.0); + + + int ncell = int(elems*GFactor); // Calcolo numero di voxel + if(ncelleps) { - double k = pow((double)(ncell/(size[0]*size[1]*size[2])),double(1.0/3.f)); - dim[0] = int(size[0] * k); - dim[1] = int(size[1] * k); - dim[2] = int(size[2] * k); - } - else - { - dim[0] = int(::sqrt(ncell*size[0]/size[1])); - dim[1] = int(::sqrt(ncell*size[1]/size[0])); + if(size[1]>eps) + { + if(size[2]>eps) + { + double k = pow((double)(ncell/(size[0]*size[1]*size[2])),double(1.0/3.f)); + dim[0] = int(size[0] * k); + dim[1] = int(size[1] * k); + dim[2] = int(size[2] * k); + } + else + { + dim[0] = int(::sqrt(ncell*size[0]/size[1])); + dim[1] = int(::sqrt(ncell*size[1]/size[0])); + } + } + else + { + if(size[2]>eps) + { + dim[0] = int(::sqrt(ncell*size[0]/size[2])); + dim[2] = int(::sqrt(ncell*size[2]/size[0])); + } + else + dim[0] = int(ncell); + } } - } - else - { - if(size[2]>eps) + else { - dim[0] = int(::sqrt(ncell*size[0]/size[2])); - dim[2] = int(::sqrt(ncell*size[2]/size[0])); + if(size[1]>eps) + { + if(size[2]>eps) + { + dim[1] = int(::sqrt(ncell*size[1]/size[2])); + dim[2] = int(::sqrt(ncell*size[2]/size[1])); + } + else + dim[1] = int(ncell); + } + else if(size[2]>eps) + dim[2] = int(ncell); } - else - dim[0] = int(ncell); - } + dim[0] = math::Max(dim[0],1); + dim[1] = math::Max(dim[1],1); + dim[2] = math::Max(dim[2],1); } - else - { - if(size[1]>eps) - { - if(size[2]>eps) - { - dim[1] = int(::sqrt(ncell*size[1]/size[2])); - dim[2] = int(::sqrt(ncell*size[2]/size[1])); - } - else - dim[1] = int(ncell); - } - else if(size[2]>eps) - dim[2] = int(ncell); - } - dim[0] = math::Max(dim[0],1); - dim[1] = math::Max(dim[1],1); - dim[2] = math::Max(dim[2],1); - } - } +} #endif \ No newline at end of file