vcglib/vcg/space/index/grid_static_obj.h

111 lines
4.0 KiB
C
Raw Normal View History

2005-07-28 10:41:00 +02:00
/****************************************************************************
* VCGLib o o *
* Visual and Computer Graphics Library o o *
* _ O _ *
* Copyright(C) 2004-2016 \/)\/ *
2005-07-28 10:41:00 +02:00
* 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_UGRID_OBJ
#define __VCGLIB_UGRID_OBJ
#include <stdio.h>
#include <vcg/space/box3.h>
#include <vcg/space/line3.h>
#include <vcg/space/index/grid_util.h>
namespace vcg {
/** Static Uniform Grid
A simple Spatial grid of object.
Kept in the most trivial way. Every cell is allocated
and contains one istance of the template class.
*/
2007-07-02 06:25:32 +02:00
template < class ObjType, class FLT=float >
class GridStaticObj : public BasicGrid<FLT>
2005-07-28 10:41:00 +02:00
{
public:
2006-08-23 17:20:14 +02:00
/// La matriciona della griglia
ObjType *grid;
2005-07-28 10:41:00 +02:00
2007-07-02 06:25:32 +02:00
int size() const { return this->siz[0]*this->siz[1]*this->siz[2];}
2005-07-28 10:41:00 +02:00
2006-08-23 17:20:14 +02:00
inline GridStaticObj() { grid = 0; }
inline ~GridStaticObj() { if(grid) delete[] grid; }
2006-09-27 10:49:32 +02:00
inline void Init(const ObjType &val)
2006-08-23 17:20:14 +02:00
{
2005-07-28 10:41:00 +02:00
fill(grid,grid+size(),val);
2006-08-23 17:20:14 +02:00
}
2005-07-28 10:41:00 +02:00
2006-08-23 17:20:14 +02:00
/// Date le coordinate ritorna la cella
inline ObjType & Grid( const int x, const int y, const int z ) {return grid[GridIndI(Point3i(x,y,z))]; }
2005-07-28 10:41:00 +02:00
2006-08-23 17:20:14 +02:00
// Dato un punto ritorna la cella
inline ObjType & Grid( const Point3<FLT> & p ) { return grid[GridIndF(p)]; }
2005-07-28 10:41:00 +02:00
inline int GridIndI( const Point3i & pi ) const
2006-08-23 17:20:14 +02:00
{
2005-07-28 10:41:00 +02:00
#ifndef NDEBUG
2007-07-02 06:25:32 +02:00
if ( pi[0]<0 || pi[0]>=this->siz[0] || pi[1]<0 || pi[1]>=this->siz[1] || pi[2]<0 || pi[2]>=this->siz[2] )
2006-08-23 17:20:14 +02:00
{ assert(0);
return 0;
}
2005-07-28 10:41:00 +02:00
#endif
2007-07-02 06:25:32 +02:00
return pi[0]+this->siz[0]*(pi[1]+this->siz[1]*pi[2]);
2006-08-23 17:20:14 +02:00
}
2005-07-28 10:41:00 +02:00
2006-08-23 17:20:14 +02:00
// Dato un punto ritorna l'indice della cella
2011-10-05 17:04:40 +02:00
inline int GridIndF( const Point3<FLT> & p ) const { return GridIndI(this->GridP(p)); }
2005-07-28 10:41:00 +02:00
2008-10-07 08:56:26 +02:00
void Create( const Point3i &_siz, const ObjType & init )
2005-07-28 10:41:00 +02:00
{
2007-07-02 06:25:32 +02:00
this->siz=_siz;
this->voxel[0] = this->dim[0]/this->siz[0];
this->voxel[1] = this->dim[1]/this->siz[1];
this->voxel[2] = this->dim[2]/this->siz[2];
2005-07-28 10:41:00 +02:00
if(grid) delete[] grid;
2007-07-02 06:25:32 +02:00
int n = this->siz[0]*this->siz[1]*this->siz[2];
2005-07-28 10:41:00 +02:00
grid = new ObjType[n];
2011-10-05 17:04:40 +02:00
std::fill(grid,grid+n,init);
2005-07-28 10:41:00 +02:00
}
/// Crea una griglia di un dato bbox e con un certo numero di elem.
2006-08-23 17:20:14 +02:00
/// il bbox viene gonfiato appositamente.
2005-07-28 10:41:00 +02:00
2006-08-23 17:20:14 +02:00
template<class FLT2>
void Create(const Box3<FLT2> & b, int ncell, const ObjType & init, bool Inflate = true )
2005-07-28 10:41:00 +02:00
{
2007-07-02 06:25:32 +02:00
this->bbox.Import(b);
if(Inflate) this->bbox.Offset(0.01*this->bbox.Diag());
this->dim = this->bbox.max - this->bbox.min;
2005-07-28 10:41:00 +02:00
2006-08-23 17:20:14 +02:00
// Calcola la dimensione della griglia
2005-07-28 10:41:00 +02:00
Point3i _siz;
2007-07-02 06:25:32 +02:00
BestDim( ncell, this->dim, _siz );
2006-08-23 17:20:14 +02:00
Create(_siz, init );
2005-07-28 10:41:00 +02:00
}
};
//end class SGrid
}
#endif