You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
7.0 KiB

5 months ago
/*===========================================================================*\
* *
* IsoEx *
* Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen *
* www.rwth-graphics.de *
* *
*---------------------------------------------------------------------------*
* *
* License *
* *
* This library is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Library General Public License as published *
* by the Free Software Foundation, version 2. *
* *
* This library 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 *
* Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; if not, write to the Free Software *
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
* *
\*===========================================================================*/
//=============================================================================
//
// CLASS RegularGrid
//
//=============================================================================
#ifndef ISOEX_REGULARGRID_HH
#define ISOEX_REGULARGRID_HH
//== INCLUDES =================================================================
#include "Grid.hh"
#include <IsoEx/Math/Matrix4x4T.hh>
#include <IsoEx/Config/IsoExDefines.hh>
//== NAMESPACES ===============================================================
namespace IsoEx
{
//== CLASS DEFINITION =========================================================
/** \class RegularGrid RegularGrid.hh <IsoEx/Grids/RegularGrid.hh>
This class implements a regular 3D grid.
\ingroup grids
*/
template <class Vec3 >
class ISOEXDLLEXPORT RegularGrid : public Grid< Vec3 >
{
public:
typedef ACG::Matrix4x4T< typename Vec3::value_type > Matrix;
typedef typename Vec3::value_type real;
/// CubeIdx can be used to refer to cubes
typedef typename Grid< Vec3 >::CubeIdx CubeIdx;
/// The grid points can be referred to by PointIdx
typedef typename Grid< Vec3 >::PointIdx PointIdx;
// ray plane intersections
struct Intersection
{
real lambda;
bool enter;
};
/** Constructor: given the implicit to be sampled, the grids extend
in 3-space (origin and 3 axes) as well as the resolution (number
of steps) of the axes. The grid will contain
_x_res*_y_res*_z_res points and
(_x_res-1)*(_y_res-1)*(_z_res-1) cubes.
\note The resolution of each axis has to be less than 1024. This is
to make sure that a cube or point can be represented by one
integer.
*/
RegularGrid( const Vec3& _origin = Vec3( 0, 0, 0 ),
const Vec3& _x_axis = Vec3( 1, 0, 0 ),
const Vec3& _y_axis = Vec3( 0, 1, 0 ),
const Vec3& _z_axis = Vec3( 0, 0, 1 ),
unsigned int _x_res = 1,
unsigned int _y_res = 1,
unsigned int _z_res = 1 )
{ initialize( _origin, _x_axis, _y_axis, _z_axis, _x_res, _y_res, _z_res ); }
/// function to initialize the grid
void initialize( const Vec3& _origin,
const Vec3& _x_axis,
const Vec3& _y_axis,
const Vec3& _z_axis,
unsigned int _x_res,
unsigned int _y_res,
unsigned int _z_res );
//------------------------------------------------------- mandatory interface
/// Return number of cubes
unsigned int n_cubes() const { return n_cubes_; }
/// Return number of points
unsigned int n_points() const { return n_points_; }
/// Return the PointIdx of the \b _corners'th corner of the cube \b _idx
PointIdx point_idx( CubeIdx _idx, unsigned char _corner ) const;
/// Return the 3D point refered to by \b _idx.
Vec3 point( PointIdx _idx ) const;
/// Return the 3D point refered to by x,y,z
Vec3 point( int x, int y, int z ) const;
/// Return the nearest grid point
PointIdx nearest_point( const Vec3 &_p );
const Vec3& origin() const { return origin_; }
const Vec3& x_axis() const { return x_axis_; }
const Vec3& y_axis() const { return y_axis_; }
const Vec3& z_axis() const { return z_axis_; }
const Vec3& dx() const { return dx_; }
const Vec3& dy() const { return dy_; }
const Vec3& dz() const { return dz_; }
unsigned int x_resolution() const { return x_res_; }
unsigned int y_resolution() const { return y_res_; }
unsigned int z_resolution() const { return z_res_; }
/// transforms a point to local cube coordinates
Vec3 to_local( const Vec3 &_pw );
/// transforms a point for local cube coordinates to world coordinates
Vec3 to_world( const Vec3 &_pl );
/// function to intersect a Ray with the cube ( local coordinates )
bool ray_intersect_local( const Vec3 &_o, const Vec3 &_d,
Vec3 &_entry, Vec3 &_exit );
/// returns the volume of the grid
real volume() { return this->x_axis().norm()*this->y_axis().norm()*this->z_axis().norm(); }
/// returns the outer surface of the grid
virtual real outer_surface()
{
return ( this->x_axis().norm()*this->y_axis().norm()*2.0f +
this->y_axis().norm()*this->z_axis().norm()*2.0f +
this->x_axis().norm()*this->z_axis().norm()*2.0f );
}
protected:
// matrices which transform points to local and world coordinates
Matrix to_local_;
Matrix to_world_;
Vec3 origin_, x_axis_, y_axis_, z_axis_, dx_, dy_, dz_;
unsigned int x_res_, y_res_, z_res_, n_cubes_, n_points_;
CubeIdx offsets_[8];
};
//=============================================================================
} // namespace IsoEx
//=============================================================================
#if !defined(ISOEX_REGULAR_GRID_C)
#define ISOEX_REGULAR_GRID_TEMPLATES
#include "RegularGridT.cc"
#endif
#endif // ISOEX_REGULARGRID_HH defined
//=============================================================================