From b537c21b4c1652a3a05a057ad45a7a490d66c7a4 Mon Sep 17 00:00:00 2001 From: cignoni Date: Fri, 1 Jul 2005 11:33:36 +0000 Subject: [PATCH] Added a class BasicGrid with some utility function that are scattered among similar classes --- vcg/space/index/grid_util.h | 68 +++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/vcg/space/index/grid_util.h b/vcg/space/index/grid_util.h index d5baf86c..374afd87 100644 --- a/vcg/space/index/grid_util.h +++ b/vcg/space/index/grid_util.h @@ -24,18 +24,80 @@ History $Log: not supported by cvs2svn $ +Revision 1.1 2005/03/15 11:43:18 cignoni +Removed BestDim function from the grid_static_ptr class and moved to a indipendent file (grid_util.h) for sake of generality. + ****************************************************************************/ #ifndef __VCGLIB_GRID_UTIL #define __VCGLIB_GRID_UTIL - /** Calcolo dimensioni griglia. + 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 + + + template + class BasicGrid { + public: + Box3 bbox; + /// Dimensione spaziale (lunghezza lati) del bbox + Point3 dim; + /// Dimensioni griglia in celle + Point3i siz; + /// Dimensioni di una cella + Point3 voxel; + + + + // Dato un punto ritorna le coordinate della cella + inline Point3i GridP( const Point3 & p ) const + { + Point3i pi; return PToIP(p,pi); + } + + /// Dato un punto 3d ritorna l'indice del box corrispondente + inline void PToIP(const Point3 & p, Point3i &pi ) const + { + Point3 t = p - bbox.min; + pi[0] = int( t[0]/voxel[0] ); + pi[1] = int( t[1]/voxel[1] ); + 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 + { + 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); + } + + + + }; + + /** Calcolo dimensioni griglia. Calcola la dimensione della griglia in funzione della ratio del bounding box e del numero di elementi */ - namespace vcg { - template void BestDim( const int elems, const Point3 & size, Point3i & dim ) {