Subversion Repositories gelsvn

Rev

Rev 62 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
39 bj 1
#include <algorithm>
2
#include "CGLA/Mat3x3f.h"
3
#include "smooth.h"
4
#include "HMesh/VertexCirculator.h"
5
 
6
 
7
namespace HMeshUtil
8
{
9
 
10
	using namespace std;
11
	using namespace CGLA;
12
	using namespace HMesh;
13
 
14
	Vec3f laplacian(VertexIter vi)
15
	{
118 jab 16
		Vec3f avg_pos(0);
39 bj 17
		int n=0;
18
 
19
		VertexCirculator vc(vi);
20
		for(;!vc.end();++vc)
21
			{
62 jab 22
				avg_pos += vc.get_vertex()->pos;
39 bj 23
				++n;
24
			}
62 jab 25
		return avg_pos/n-vi->pos;
39 bj 26
	}
27
 
28
	void laplacian_smooth(Manifold& m, float t)
29
	{
30
		vector<Vec3f> pos(m.no_vertices());
31
		int i=0;
32
		for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); ++vi,++i)
62 jab 33
			if(!is_boundary(vi))
34
				pos[i] =  t*laplacian(vi) + vi->pos;
39 bj 35
		i=0;
36
		for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); ++vi,++i)
62 jab 37
			if(!is_boundary(vi))
39 bj 38
				vi->pos = pos[i];
39
	}
40
 
118 jab 41
	void taubin_smooth(Manifold& m, int max_iter)
39 bj 42
	{
118 jab 43
		for(int iter=0;iter<max_iter;++iter)
39 bj 44
			{
118 jab 45
				vector<Vec3f> lap(m.no_vertices());
39 bj 46
				int i=0;
47
				for(VertexIter vi = m.vertices_begin();	
48
						vi != m.vertices_end(); ++vi,++i)
62 jab 49
					if(!is_boundary(vi))
118 jab 50
							lap[i] =  laplacian(vi);
39 bj 51
				i=0;
52
				for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); 
53
						++vi,++i)
62 jab 54
					if(!is_boundary(vi))
118 jab 55
						vi->pos += (iter%2 == 0) ? 
56
								 0.5  * lap[i] : 
57
								-0.52 * lap[i];
39 bj 58
			}
59
	}
60
 
61
 
62
}