bool Triangulator::RemoveAnyEdge(_Internal::_edge* e) { _Internal::_edge* bedge = NULL; _Internal::_edge* hedge = NULL; if(e->type == _Internal::Inside) e->type = _Internal::Hole; //after removal, a hole will be created. for(int k=0; k<2; ++k) { if(e->faces[k]) { for(int i=0; i<3; ++i) { if(bedge == NULL && e->faces[k]->edges[i]->type == _Internal::Boundary) { bedge = e->faces[k]->edges[i]; } if(hedge == NULL && e->faces[k]->edges[i]->type == _Internal::Hole) { hedge = e->faces[k]->edges[i]; } } } } _Internal::_edge* dominant = e; if(bedge) { dominant = bedge; } else if(hedge) { dominant = hedge; } for(int k=0; k<2; ++k) { _Internal::_triangle* tr = e->faces[k]; //a triangle to be removed if(tr == NULL) continue; //remove this triangle from three edges forming the triangle. for(int i=0; i<3; ++i) { tr->edges[i]->type = dominant->type; merge(dominant->node, tr->edges[i]->node); tr->edges[i]->RemoveFace(tr); } vector<_Internal::_triangle*>::iterator itf = find(faces.begin(), faces.end(), tr); assert(itf != faces.end()); faces.erase(itf); deleted_faces.push_back(tr); } for(int i=0; i<edges.size(); ++i) { if(findset(dominant->node)==findset(edges[i]->node)) { edges[i]->type = dominant->type; } } _DeleteEdge(e); return true; }
bool Triangulator::RemoveIsolatedEdge(_Internal::_edge* e) { if(e->faces[0]==NULL && e->faces[1]==NULL) { _DeleteEdge(e); return true; } else { return false; } }
bool Triangulator::RemoveSafeEdge(_Internal::_edge* e) { if(isSafe(e)) //only a boundary edge can be removed. { _Internal::_triangle* tr = e->faces[0]; //a triangle to be removed for(int i=0; i<3; ++i) { tr->edges[i]->RemoveFace(tr); tr->edges[i]->type == _Internal::Boundary; } _DeleteEdge(e); vector<_Internal::_triangle*>::iterator it = find(faces.begin(), faces.end(), tr); assert(it != faces.end()); faces.erase(it); deleted_faces.push_back(tr); //delete tr; } else { return false; } }