Subversion Repositories gelsvn

Rev

Rev 39 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 39 Rev 62
Line 28... Line 28...
28
										 const Vec3f& pa,
28
										 const Vec3f& pa,
29
										 const Vec3f& pb)
29
										 const Vec3f& pb)
30
		{
30
		{
31
			QEM q;
31
			QEM q;
32
			if(h->face != NULL_FACE_ITER)
32
			if(h->face != NULL_FACE_ITER)
33
				q += QEM(Vec3d(0), Vec3d(get_normal(h->face)));
33
				q += QEM(Vec3d(0), Vec3d(normal(h->face)));
34
			if(h->opp->face != NULL_FACE_ITER)
34
			if(h->opp->face != NULL_FACE_ITER)
35
				q += QEM(Vec3d(0), Vec3d(get_normal(h->opp->face)));
35
				q += QEM(Vec3d(0), Vec3d(normal(h->opp->face)));
36
			return q.error(pb-pa);
36
			return q.error(pb-pa);
37
		}
37
		}
38
 
38
 
39
 
39
 
40
		float vertex_error(VertexIter va, const Vec3f& pb)
40
		float vertex_error(VertexIter va, const Vec3f& pb)
41
		{
41
		{
42
			QEM q;
42
			QEM q;
43
			Vec3f pa = va->get_pos();
43
			Vec3f pa = va->pos;
44
			for(VertexCirculator vc(va); !vc.end(); ++vc)
44
			for(VertexCirculator vc(va); !vc.end(); ++vc)
45
				{
45
				{
46
					FaceIter f = vc.get_face();
46
					FaceIter f = vc.get_face();
47
					if(f != NULL_FACE_ITER)
47
					if(f != NULL_FACE_ITER)
48
						{
48
						{
49
							Vec3f n = get_normal(f);
49
							Vec3f n = normal(f);
50
							q += QEM(Vec3d(0), Vec3d(n));
50
							q += QEM(Vec3d(0), Vec3d(n));
51
						}
51
						}
52
				}
52
				}
53
			return q.error(pb-pa);
53
			return q.error(pb-pa);
54
		}
54
		}
Line 65... Line 65...
65
 
65
 
66
				int n=0;
66
				int n=0;
67
				for(FaceCirculator fc(fi); !fc.end(); ++fc,++n)
67
				for(FaceCirculator fc(fi); !fc.end(); ++fc,++n)
68
					{
68
					{
69
						vi[n] = fc.get_vertex();
69
						vi[n] = fc.get_vertex();
70
						p[n]  = fc.get_vertex()->get_pos();
70
						p[n]  = fc.get_vertex()->pos;
71
						he[n]= fc.get_halfedge();
71
						he[n]= fc.get_halfedge();
72
					}
72
					}
73
				assert(n=3);
73
				assert(n=3);
74
				
74
				
75
				bool is_collapsed = false;
75
				bool is_collapsed = false;
Line 95... Line 95...
95
								Vec3f edge_dir = edges[iplus1];
95
								Vec3f edge_dir = edges[iplus1];
96
								Vec3f pprj =  
96
								Vec3f pprj =  
97
									edge_dir * dot(edge_dir,p[i]-p[iplus1])+p[iplus1];
97
									edge_dir * dot(edge_dir,p[i]-p[iplus1])+p[iplus1];
98
 
98
 
99
								HalfEdgeIter h = he[iplus1];
99
								HalfEdgeIter h = he[iplus1];
100
								Vec3f v0 = h->vert->get_pos();
100
								Vec3f v0 = h->vert->pos;
101
								Vec3f v1 = h->next->vert->get_pos();
101
								Vec3f v1 = h->next->vert->pos;
102
								Vec3f v2 = h->opp->vert->get_pos();
102
								Vec3f v2 = h->opp->vert->pos;
103
								Vec3f v3 = h->opp->next->vert->get_pos();
103
								Vec3f v3 = h->opp->next->vert->pos;
104
								
104
								
105
								float m1 = min(min_angle(v0,v1,v2), min_angle(v0,v2,v3));
105
								float m1 = min(min_angle(v0,v1,v2), min_angle(v0,v2,v3));
106
								float m2 = min(min_angle(v0,pprj,v3), min_angle(pprj,v2,v3));
106
								float m2 = min(min_angle(v0,pprj,v3), min_angle(pprj,v2,v3));
107
								if(m1 < m2)
107
								if(m1 < m2)
108
									{
108
									{
109
										if(edge_error(he[iplus1], pprj, vi[i]->get_pos()) >
109
											if(edge_error(he[iplus1], pprj, vi[i]->pos) >
110
											 vertex_error(vi[i], pprj))
110
											 vertex_error(vi[i], pprj))
111
											vi[i]->set_pos(pprj);
111
												vi[i]->pos = pprj;
112
 
112
 
113
										mani.flip(he[iplus1]);
113
										mani.flip(he[iplus1]);
114
										break;
114
										break;
115
									}
115
									}
116
							}
116
							}
Line 129... Line 129...
129
			{
129
			{
130
				did_work = false;
130
				did_work = false;
131
				for(VertexIter vi=mani.vertices_begin(); 
131
				for(VertexIter vi=mani.vertices_begin(); 
132
						vi != mani.vertices_end(); ++vi)
132
						vi != mani.vertices_end(); ++vi)
133
					{
133
					{
134
						if(vi->is_boundary()) continue;
134
							if(is_boundary(vi)) continue;
135
						for(VertexCirculator vc(vi);!vc.end();++vc)
135
						for(VertexCirculator vc(vi);!vc.end();++vc)
136
							{
136
							{
137
								if(vc.get_halfedge()->vert->is_boundary()) continue;
137
								if(is_boundary(vc.get_halfedge()->vert)) continue;
138
								HalfEdgeIter he = vc.get_halfedge()->opp;
138
								HalfEdgeIter he = vc.get_halfedge()->opp;
139
 
139
 
140
								VertexIter n = vc.get_vertex();
140
								VertexIter n = vc.get_vertex();
141
								float dist = length(he);
141
								float dist = length(he);
142
								if((dist<thresh) && mani.collapse_precond(n,he))
142
								if((dist<thresh) && mani.collapse_precond(n,he))
143
									{
143
									{
144
										if(vertex_error(vi,n->get_pos()) < 
144
											if(vertex_error(vi,n->pos) < 
145
											 vertex_error(n,vi->get_pos()))
145
											 vertex_error(n,vi->pos))
146
											vi->set_pos(n->get_pos());
146
													vi->pos = n->pos;
147
 
147
 
148
										mani.collapse_halfedge(n,he);
148
										mani.collapse_halfedge(n,he);
149
										did_work = true;
149
										did_work = true;
150
										break;
150
										break;
151
									}
151
									}