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()->get_pos();
++n;
}
return avg_pos/n-vi->get_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(!vi->is_boundary())
pos[i] = t*laplacian(vi) + vi->get_pos();
i=0;
for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,++i)
if(!vi->is_boundary())
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(!vi->is_boundary())
{
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(!vi->is_boundary())
vi->pos += (j%2 == 0) ? 0.5 * laplacian[i] : -0.52 * laplacian[i];
}
}
}