77 if(_halffaces.size() != 6) {
80 std::cerr <<
"Cell valence is not six! Aborting." << std::endl;
82 return TopologyKernel::InvalidCellHandle;
84 for(std::vector<HalfFaceHandle>::const_iterator it = _halffaces.begin();
85 it != _halffaces.end(); ++it)
87 if (
valence(it->face_handle()) != 4) {
89 std::cerr <<
"Incident face does not have valence four! Aborting." << std::endl;
91 return TopologyKernel::InvalidCellHandle;
96 std::vector<HalfFaceHandle> ordered_halffaces;
102 if(check_halfface_ordering(_halffaces)) {
108 std::cerr <<
"The specified half-faces are not in correct order. Trying automatic re-ordering." << std::endl;
112 const int orderTop[] = {2, 4, 3, 5};
115 ordered_halffaces.resize(6, TopologyKernel::InvalidHalfFaceHandle);
118 ordered_halffaces[0] = _halffaces[0];
122 unsigned int idx = 0;
123 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin();
124 he_it != hes.end(); ++he_it) {
126 HalfFaceHandle ahfh = get_adjacent_halfface(ordered_halffaces[0], *he_it, _halffaces);
127 if(ahfh == TopologyKernel::InvalidHalfFaceHandle) {
129 std::cerr <<
"The current halfface is invalid!" << std::endl;
133 ordered_halffaces[orderTop[idx]] = ahfh;
140 cur_hf = get_adjacent_halfface(cur_hf, cur_he, _halffaces);
141 cur_he = TopologyKernel::opposite_halfedge_handle(cur_he);
144 cur_hf = get_adjacent_halfface(cur_hf, cur_he, _halffaces);
146 if(cur_hf != TopologyKernel::InvalidHalfFaceHandle) {
147 ordered_halffaces[1] = cur_hf;
150 std::cerr <<
"The current halfface is invalid!" << std::endl;
152 return TopologyKernel::InvalidCellHandle;
264 assert(TopologyKernel::has_full_bottom_up_incidences());
265 assert(_vertices.size() == 8);
268 if(!TopologyKernel::has_full_bottom_up_incidences()) {
272 if(_vertices.size() != 8) {
278 std::vector<VertexHandle> vs;
281 vs.push_back(_vertices[3]);
282 vs.push_back(_vertices[2]);
283 vs.push_back(_vertices[1]);
284 vs.push_back(_vertices[0]);
288 vs.push_back(_vertices[7]);
289 vs.push_back(_vertices[6]);
290 vs.push_back(_vertices[5]);
291 vs.push_back(_vertices[4]);
295 vs.push_back(_vertices[1]);
296 vs.push_back(_vertices[2]);
297 vs.push_back(_vertices[6]);
298 vs.push_back(_vertices[7]);
302 vs.push_back(_vertices[4]);
303 vs.push_back(_vertices[5]);
304 vs.push_back(_vertices[3]);
305 vs.push_back(_vertices[0]);
309 vs.push_back(_vertices[1]);
310 vs.push_back(_vertices[7]);
311 vs.push_back(_vertices[4]);
312 vs.push_back(_vertices[0]);
316 vs.push_back(_vertices[2]);
317 vs.push_back(_vertices[3]);
318 vs.push_back(_vertices[5]);
319 vs.push_back(_vertices[6]);
322 if(!hf0.is_valid()) {
325 vs.push_back(_vertices[3]); vs.push_back(_vertices[2]);
326 vs.push_back(_vertices[1]); vs.push_back(_vertices[0]);
331 if(!hf1.is_valid()) {
334 vs.push_back(_vertices[7]); vs.push_back(_vertices[6]);
335 vs.push_back(_vertices[5]); vs.push_back(_vertices[4]);
340 if(!hf2.is_valid()) {
343 vs.push_back(_vertices[1]); vs.push_back(_vertices[2]);
344 vs.push_back(_vertices[6]); vs.push_back(_vertices[7]);
349 if(!hf3.is_valid()) {
352 vs.push_back(_vertices[4]); vs.push_back(_vertices[5]);
353 vs.push_back(_vertices[3]); vs.push_back(_vertices[0]);
358 if(!hf4.is_valid()) {
361 vs.push_back(_vertices[1]); vs.push_back(_vertices[7]);
362 vs.push_back(_vertices[4]); vs.push_back(_vertices[0]);
367 if(!hf5.is_valid()) {
370 vs.push_back(_vertices[2]); vs.push_back(_vertices[3]);
371 vs.push_back(_vertices[5]); vs.push_back(_vertices[6]);
376 assert(hf0.is_valid()); assert(hf1.is_valid()); assert(hf2.is_valid());
377 assert(hf3.is_valid()); assert(hf4.is_valid()); assert(hf5.is_valid());
380 std::vector<HalfFaceHandle> hfs;
381 hfs.push_back(hf0); hfs.push_back(hf1); hfs.push_back(hf2);
382 hfs.push_back(hf3); hfs.push_back(hf4); hfs.push_back(hf5);
384 if (_topologyCheck) {
393 std::set<HalfEdgeHandle> incidentHalfedges;
394 std::set<EdgeHandle> incidentEdges;
396 for(std::vector<HalfFaceHandle>::const_iterator it = hfs.begin(),
397 end = hfs.end(); it != end; ++it) {
400 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hface.halfedges().begin(),
401 he_end = hface.halfedges().end(); he_it != he_end; ++he_it) {
402 incidentHalfedges.insert(*he_it);
407 if(incidentHalfedges.size() != (incidentEdges.size() * 2u)) {
409 std::cerr <<
"The specified halffaces are not connected!" << std::endl;
411 return InvalidCellHandle;
415 if(has_face_bottom_up_incidences()) {
417 for(std::vector<HalfFaceHandle>::const_iterator it = hfs.begin(),
418 end = hfs.end(); it != end; ++it) {
421 std::cerr <<
"Warning: One of the specified half-faces is already incident to another cell!" << std::endl;
423 return InvalidCellHandle;