Subversion Repositories gelsvn

Rev

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

Rev 113 Rev 115
Line 101... Line 101...
101
 
101
 
102
	bool Manifold::collapse_precond(VertexIter v1, HalfEdgeIter h)
102
	bool Manifold::collapse_precond(VertexIter v1, HalfEdgeIter h)
103
	{			
103
	{			
104
		VertexIter v2 = h->vert;
104
		VertexIter v2 = h->vert;
105
 
105
 
106
		std::vector<int> link1;
106
		std::vector<Vertex*> link1;
107
		VertexCirculator vc1(v1);
107
		VertexCirculator vc1(v1);
108
		for(;!vc1.end();++vc1)
108
		for(;!vc1.end();++vc1)
109
			link1.push_back(reinterpret_cast<int>(&(*vc1.get_vertex())));
109
			link1.push_back(&(*vc1.get_vertex()));
110
		assert(link1.size()>=2);
110
		assert(link1.size()>=2);
111
 
111
 
112
		std::vector<int> link2;
112
		std::vector<Vertex*> link2;
113
		VertexCirculator vc2(v2);
113
		VertexCirculator vc2(v2);
114
		for(;!vc2.end();++vc2)
114
		for(;!vc2.end();++vc2)
115
			link2.push_back(reinterpret_cast<int>(&(*vc2.get_vertex())));
115
			link2.push_back(&(*vc2.get_vertex()));
116
		assert(link2.size()>=2);
116
		assert(link2.size()>=2);
117
 
117
 
118
		sort(link1.begin(),link1.end());
118
		sort(link1.begin(),link1.end());
119
		sort(link2.begin(),link2.end());
119
		sort(link2.begin(),link2.end());
120
 
120
 
121
		vector<int> lisect;
121
		vector<Vertex*> lisect;
122
		back_insert_iterator<vector<int> > lii(lisect);
122
		back_insert_iterator<vector<Vertex*> > lii(lisect);
123
 
123
 
124
		set_intersection(link1.begin(), link1.end(),
124
		set_intersection(link1.begin(), link1.end(),
125
										 link2.begin(), link2.end(),
125
										 link2.begin(), link2.end(),
126
										 lii);
126
										 lii);
127
 
127
 
Line 132... Line 132...
132
		{
132
		{
133
			// VALENCY 4 TEST
133
			// VALENCY 4 TEST
134
			if(valency(h->next->vert)<4)
134
			if(valency(h->next->vert)<4)
135
				return false;
135
				return false;
136
 
136
 
137
			vector<int>::iterator iter;
137
			vector<Vertex*>::iterator iter;
138
			iter = find(lisect.begin(),	lisect.end(),
138
			iter = find(lisect.begin(),	lisect.end(),&(*h->next->vert));
139
									reinterpret_cast<int>(&(*h->next->vert)));
-
 
140
			assert(iter != lisect.end());
139
			assert(iter != lisect.end());
141
			lisect.erase(iter);
140
			lisect.erase(iter);
142
			++k;
141
			++k;
143
 
142
 
144
		}
143
		}
Line 147... Line 146...
147
		{
146
		{
148
			// VALENCY 4 TEST
147
			// VALENCY 4 TEST
149
			if(valency(h->opp->next->vert)<4)
148
			if(valency(h->opp->next->vert)<4)
150
				return false;
149
				return false;
151
 
150
 
152
			vector<int>::iterator iter;
151
			vector<Vertex*>::iterator iter;
153
			iter = find(lisect.begin(),	lisect.end(),
152
			iter = find(lisect.begin(),	lisect.end(),&(*h->opp->next->vert));
154
									reinterpret_cast<int>(&(*h->opp->next->vert)));
-
 
155
			assert(iter != lisect.end());
153
			assert(iter != lisect.end());
156
			lisect.erase(iter);
154
			lisect.erase(iter);
157
			++k;
155
			++k;
158
 
156
 
159
		}
157
		}
Line 246... Line 244...
246
			}
244
			}
247
				
245
				
248
		VertexIter vi = vertices_begin();
246
		VertexIter vi = vertices_begin();
249
		while(vi != vertices_end())
247
		while(vi != vertices_end())
250
			{
248
			{
251
				std::vector<int> link;
249
				std::vector<Vertex*> link;
252
				VertexCirculator vc(vi);
250
				VertexCirculator vc(vi);
253
				int k=0;
251
				int k=0;
254
				for(;!vc.end();++vc,++k)
252
				for(;!vc.end();++vc,++k)
255
					{
253
					{
256
						if(vc.get_halfedge() == NULL_HALFEDGE_ITER)
254
						if(vc.get_halfedge() == NULL_HALFEDGE_ITER)
257
							{
255
							{
258
								cout << "Vertex has null outgoing he" << endl;
256
								cout << "Vertex has null outgoing he" << endl;
259
								return false;
257
								return false;
260
							}
258
							}
261
						int x = reinterpret_cast<int>(&(*vc.get_vertex()));
259
						Vertex* x = &(*vc.get_vertex());
262
						if(find(link.begin(), link.end(), x) != link.end())
260
						if(find(link.begin(), link.end(), x) != link.end())
263
							{
261
							{
264
								cout << "Vertex appears two times in one-ring of other vertex" << endl;
262
								cout << "Vertex appears two times in one-ring of other vertex" << endl;
265
 								return false;
263
 								return false;
266
							}
264
							}