Subversion Repositories gelsvn

Rev

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> > >;
}