Subversion Repositories gelsvn

Rev

Rev 62 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 62 Rev 118
Line 11... Line 11...
11
	using namespace CGLA;
11
	using namespace CGLA;
12
	using namespace HMesh;
12
	using namespace HMesh;
13
 
13
 
14
	Vec3f laplacian(VertexIter vi)
14
	Vec3f laplacian(VertexIter vi)
15
	{
15
	{
16
		Vec3f avg_pos;
16
		Vec3f avg_pos(0);
17
		int n=0;
17
		int n=0;
18
		
18
		
19
		VertexCirculator vc(vi);
19
		VertexCirculator vc(vi);
20
		for(;!vc.end();++vc)
20
		for(;!vc.end();++vc)
21
			{
21
			{
Line 36... Line 36...
36
		for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); ++vi,++i)
36
		for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); ++vi,++i)
37
			if(!is_boundary(vi))
37
			if(!is_boundary(vi))
38
				vi->pos = pos[i];
38
				vi->pos = pos[i];
39
	}
39
	}
40
 
40
 
41
	void taubin_smooth(Manifold& m, int iter)
41
	void taubin_smooth(Manifold& m, int max_iter)
42
	{
42
	{
43
		for(int j=0;j<iter;++j)
43
		for(int iter=0;iter<max_iter;++iter)
44
			{
44
			{
45
				vector<Vec3f> laplacian(m.no_vertices());
45
				vector<Vec3f> lap(m.no_vertices());
46
				int i=0;
46
				int i=0;
47
				for(VertexIter vi = m.vertices_begin();	
47
				for(VertexIter vi = m.vertices_begin();	
48
						vi != m.vertices_end(); ++vi,++i)
48
						vi != m.vertices_end(); ++vi,++i)
49
					if(!is_boundary(vi))
49
					if(!is_boundary(vi))
50
						{
-
 
51
							Vec3f avg_pos;
-
 
52
							int n=0;
-
 
53
							
-
 
54
							VertexCirculator vc(vi);
50
							lap[i] =  laplacian(vi);
55
							for(;!vc.end();++vc)
-
 
56
								{
-
 
57
									avg_pos += vc.get_vertex()->pos;
-
 
58
									++n;
-
 
59
								}
-
 
60
							laplacian[i] =  avg_pos/n - vi->pos;
-
 
61
						}
-
 
62
				i=0;
51
				i=0;
63
				for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); 
52
				for(VertexIter vi = m.vertices_begin();	vi != m.vertices_end(); 
64
						++vi,++i)
53
						++vi,++i)
65
					if(!is_boundary(vi))
54
					if(!is_boundary(vi))
66
						vi->pos += (j%2 == 0) ? 0.5 * laplacian[i] : -0.52 * laplacian[i];
55
						vi->pos += (iter%2 == 0) ? 
-
 
56
								 0.5  * lap[i] : 
-
 
57
								-0.52 * lap[i];
67
			}
58
			}
68
	}
59
	}
69
 
60
 
70
 
61
 
71
}
62
}