added IPToP and IBoxToBox functions, modified BoxToIBox function in order to use PToIP function

This commit is contained in:
Nico Pietroni 2005-08-02 11:01:05 +00:00
parent a96663b39e
commit 7bc4ef59fd
1 changed files with 116 additions and 110 deletions

View File

@ -21,9 +21,12 @@
* * * *
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
History History
$Log: not supported by cvs2svn $ $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 Revision 1.2 2005/07/01 11:33:36 cignoni
Added a class BasicGrid with some utility function that are scattered among similar classes Added a class BasicGrid with some utility function that are scattered among similar classes
@ -36,16 +39,19 @@ Removed BestDim function from the grid_static_ptr class and moved to a indipende
#define __VCGLIB_GRID_UTIL #define __VCGLIB_GRID_UTIL
namespace vcg { namespace vcg {
// classe di base per tutte le strutture dati di indexing spaziale basate su griglia. // 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 // contiene tutte le funzioni solite per le conversioni tra point3f e point3i
template <class ScalarType> template <class ScalarType>
class BasicGrid { class BasicGrid {
typedef typename Box3<ScalarType> Box3x;
public: public:
Box3<ScalarType> bbox; Box3x bbox;
/// Dimensione spaziale (lunghezza lati) del bbox /// Dimensione spaziale (lunghezza lati) del bbox
Point3<ScalarType> dim; Point3<ScalarType> dim;
/// Dimensioni griglia in celle /// Dimensioni griglia in celle
@ -63,6 +69,7 @@ Removed BestDim function from the grid_static_ptr class and moved to a indipende
return pi; return pi;
} }
/// Dato un punto 3d ritorna l'indice del box corrispondente /// Dato un punto 3d ritorna l'indice del box corrispondente
inline void PToIP(const Point3<ScalarType> & p, Point3i &pi ) const inline void PToIP(const Point3<ScalarType> & p, Point3i &pi ) const
{ {
@ -72,30 +79,29 @@ Removed BestDim function from the grid_static_ptr class and moved to a indipende
pi[2] = int( t[2]/voxel[2] ); pi[2] = int( t[2]/voxel[2] );
} }
/// Dato un box reale ritorna gli indici dei voxel compresi dentro un ibox /// Given a voxel index return the lower corner of the voxel
void BoxToIBox( const Box3d & b, Box3i & ib ) const inline void IPToP(const Point3i & pi, Point3<ScalarType> &p ) const
{ {
Point3d t; p[0] = ((ScalarType)pi[0])*voxel[0];
p[1] = ((ScalarType)pi[1])*voxel[1];
p[2] = ((ScalarType)pi[2])*voxel[2];
p +=bbox.min;
}
t = (b.min - bbox.min); // Traslo il box b; /// Dato un box reale ritorna gli indici dei voxel compresi dentro un ibox
t[0] /= voxel[0]; void BoxToIBox( const Box3x & b, Box3i & ib ) const
t[1] /= voxel[1]; {
t[2] /= voxel[2]; PToIP(b.min,ib.min);
ib.min[0] = int( t[0] ); // Trasformazione in intero PToIP(b.max,ib.max);
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); 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);
}
}; };
@ -172,5 +178,5 @@ Removed BestDim function from the grid_static_ptr class and moved to a indipende
dim[1] = math::Max(dim[1],1); dim[1] = math::Max(dim[1],1);
dim[2] = math::Max(dim[2],1); dim[2] = math::Max(dim[2],1);
} }
} }
#endif #endif