Added some help and inndentation

This commit is contained in:
Federico Ponchio 2004-06-23 15:49:03 +00:00
parent ed7382539c
commit 956a626273
1 changed files with 452 additions and 419 deletions

View File

@ -24,6 +24,9 @@
History
$Log: not supported by cvs2svn $
Revision 1.3 2004/05/12 18:50:58 ganovelli
changed calls to Dist
Revision 1.2 2004/05/11 14:33:46 ganovelli
changed to grid_static_obj to grid_static_ptr
@ -46,17 +49,38 @@ Initial commit
namespace vcg {
/** Static Uniform Grid
A spatial search structure for a accessing a container of objects. It is based on a uniform grid overlayed over a protion of space.
The grid partion the space into cells. Cells contains just pointers to the object that are stored elsewhere.
The set of object is meant to be static and pointer stable.
Useful for situation were many space related query are issued over the same dataset (ray tracing, measuring distances between meshes, re-detailing ecc.). Works well for distribution that ar reasonably uniform.
A spatial search structure for a accessing a container of objects.
It is based on a uniform grid overlayed over a protion of space.
The grid partion the space into cells. Cells contains just pointers
to the object that are stored elsewhere.
The set of objects is meant to be static and pointer stable.
Useful for situation were many space related query are issued over
the same dataset (ray tracing, measuring distances between meshes,
re-detailing ecc.).
Works well for distribution that ar reasonably uniform.
How to use it:
ContainerType must have a 'value_type' typedef inside.
(stl containers already have it)
Objects pointed by cells (of kind 'value_type') must have
a 'ScalarType' typedef (float or double usually)
and 2 member functions:
bool Dist(const Point3f &point, ScalarType &mindist, Point3f &result);
which return true if the distance from point to the object is < mindist
and set mindist to said distance, and result must be set as the closest
point of the object to point)
void GetBBox(Box3<ScalarType> &b)
which return the bounding box of the object
*/
template < typename ContainerType >
class GridStaticPtr
{
public:
public:
/** Internal class for keeping the first pointer of object.
Definizione Link dentro la griglia. Classe di supporto per GridStaticObj.
@ -110,10 +134,9 @@ public:
Point3i siz; /// Dimensioni griglia in celle
Point3x voxel; /// Dimensioni di una cella
/// Insieme di tutti i links
std::vector<Link> links;
/// Griglia vera e propria
std::vector<Cell> grid;
std::vector<Link> links; /// Insieme di tutti i links
std::vector<Cell> grid; /// Griglia vera e propria
/// Dato un punto, ritorna la cella che lo contiene
inline Cell* Grid( const Point3d & p )
@ -151,7 +174,9 @@ public:
std::vector<Point3i> &o)
{
#ifndef NDEBUG
if ( p[0]<0 || p[0]>siz[0] || p[1]<0 || p[1]>siz[1] || p[2]<0 || p[2]>siz[2] )
if ( p[0]<0 || p[0]>siz[0] ||
p[1]<0 || p[1]>siz[1] ||
p[2]<0 || p[2]>siz[2] )
assert(0);
//return NULL;
else
@ -269,9 +294,14 @@ public:
ScalarType radius=(dx-ScalarType(ix));
if (radius>0.5) radius=(1.0-radius); radius*=voxel[0];
ScalarType
tmp=dy-ScalarType(iy); if (tmp>0.5) tmp=1.0-tmp; tmp*=voxel[1]; if (radius>tmp) radius=tmp;
tmp=dz-ScalarType(iz); if (tmp>0.5) tmp=1.0-tmp; tmp*=voxel[2]; if (radius>tmp) radius=tmp;
ScalarType tmp=dy-ScalarType(iy);
if (tmp>0.5) tmp=1.0-tmp;
tmp*=voxel[1];
if (radius>tmp) radius=tmp;
tmp=dz-ScalarType(iz);
if (tmp>0.5) tmp=1.0-tmp;
tmp*=voxel[2];
if (radius>tmp) radius=tmp;
Point3x t_res;
//ScalarType min_dist=1e10;
@ -279,7 +309,8 @@ public:
Link *first, *last;
Link *l;
if ((ix>=0) && (iy>=0) && (iz>=0) && (ix<siz[0]) && (iy<siz[1]) && (iz<siz[2])) {
if ((ix>=0) && (iy>=0) && (iz>=0) &&
(ix<siz[0]) && (iy<siz[1]) && (iz<siz[2])) {
Grid( ix, iy, iz, first, last );
for(l=first;l!=last;++l)
@ -382,7 +413,8 @@ public:
}
}
// Push della sentinella
links.push_back( Link((typename ContainerType::iterator)NULL,(grid.size()-1)));
links.push_back( Link((typename ContainerType::iterator)NULL,
(grid.size()-1)));
// Ordinamento dei links
sort( links.begin(), links.end() );
@ -481,7 +513,8 @@ public:
int MemUsed()
{
return sizeof(GridStaticObj)+ sizeof(Link)*links.size() + sizeof(Cell) * grid.size();
return sizeof(GridStaticObj)+ sizeof(Link)*links.size() +
sizeof(Cell) * grid.size();
}
}; //end class GridStaticObj