Rev 70 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "GradientFilter.h"
#include "TrilinFilter.h"
#include "Neighbours.h"
using namespace CGLA;
namespace Geometry
{
template<class GridT>
bool TrilinFilter<GridT>::in_domain(const CGLA::Vec3f& v) const
{
Vec3i c0i(v);
return grid->in_domain(c0i) && grid->in_domain(c0i+Vec3i(1));
}
template<class GridT>
bool TrilinFilter<GridT>::map(const CGLA::Vec3f& v, DataType& f) const
{
Vec3i c0i(v);
const float alpha = v[0] - float(c0i[0]);
const float beta = v[1] - float(c0i[1]);
const float gamm = v[2] - float(c0i[2]);
float m_alpha = 1.0 - alpha;
float m_beta = 1.0 - beta;
float m_gamm = 1.0 - gamm;
DataType voxels[8];
for(int i=0;i<8;++i)
voxels[i] = (*grid)[c0i+Geometry::CubeCorners8i[i]];
f = DataType(0);
f += (m_alpha*m_beta*m_gamm)*voxels[0];
if(alpha>0)
f += (alpha*m_beta*m_gamm)*voxels[1];
if(beta>0)
{
f+=(m_alpha*beta*m_gamm)*voxels[2];
if(alpha>0)
f+=(alpha*beta*m_gamm)*voxels[3];
}
if(gamm>0)
{
f+=(m_alpha*m_beta*gamm)*voxels[4];
if(alpha>0)
f+=(alpha*m_beta*gamm)*voxels[5];
if(beta>0)
{
f+=(m_alpha*beta*gamm)*voxels[6];
if(alpha>0)
f+=(alpha*beta*gamm)*voxels[7];
}
}
return true;
}
template class TrilinFilter<RGrid<float> >;
template class TrilinFilter<GradientFilter<RGrid<float> > >;
template class TrilinFilter<RGrid<unsigned char> >;
template class TrilinFilter<GradientFilter<RGrid<unsigned char> > >;
}