Subversion Repositories gelsvn

Rev

Rev 39 | Blame | Last modification | View Log | RSS feed

#include <algorithm>
#include "CGLA/Mat3x3f.h"
#include "smooth.h"
#include "HMesh/VertexCirculator.h"


namespace HMeshUtil
{

        using namespace std;
        using namespace CGLA;
        using namespace HMesh;

        Vec3f laplacian(VertexIter vi)
        {
                Vec3f avg_pos;
                int n=0;
                
                VertexCirculator vc(vi);
                for(;!vc.end();++vc)
                        {
                                avg_pos += vc.get_vertex()->pos;
                                ++n;
                        }
                return avg_pos/n-vi->pos;
        }

        void laplacian_smooth(Manifold& m, float t)
        {
                vector<Vec3f> pos(m.no_vertices());
                int i=0;
                for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,++i)
                        if(!is_boundary(vi))
                                pos[i] =  t*laplacian(vi) + vi->pos;
                i=0;
                for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,++i)
                        if(!is_boundary(vi))
                                vi->pos = pos[i];
        }

        void taubin_smooth(Manifold& m, int iter)
        {
                for(int j=0;j<iter;++j)
                        {
                                vector<Vec3f> laplacian(m.no_vertices());
                                int i=0;
                                for(VertexIter vi = m.vertices_begin(); 
                                                vi != m.vertices_end(); ++vi,++i)
                                        if(!is_boundary(vi))
                                                {
                                                        Vec3f avg_pos;
                                                        int n=0;
                                                        
                                                        VertexCirculator vc(vi);
                                                        for(;!vc.end();++vc)
                                                                {
                                                                        avg_pos += vc.get_vertex()->pos;
                                                                        ++n;
                                                                }
                                                        laplacian[i] =  avg_pos/n - vi->pos;
                                                }
                                i=0;
                                for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); 
                                                ++vi,++i)
                                        if(!is_boundary(vi))
                                                vi->pos += (j%2 == 0) ? 0.5 * laplacian[i] : -0.52 * laplacian[i];
                        }
        }


}