bool Bface::get_quad_verts(Bvert*& a, Bvert*& b, Bvert*& c, Bvert*& d) const { // Return CCW verts a, b, c, d as in the picture, orienting // things so that the weak edge runs NE as shown: // // d ---------- c = w->v2() ^ // | / | | // | / | | // | w / | tan1 tan2 | // | / | --------> | // | / f | | // |/ | // a ---------- b // = w->v1() // if (!is_quad()) return 0; Bedge* w = weak_edge(); Bface* f = w->ccw_face(w->v2()); a = w->v1(); b = f->next_vert_ccw(a); c = w->v2(); d = f->quad_vert(); return true; }
void EdgeStrip::build_ccw_boundaries( CBedge_list& edges, CSimplexFilter& face_filter ) { // Similar to previous... // // XXX - needs comments // Clear edge flags to screen for unreached edges: // set edge flags to 1 in 1-ring of verts, // then clear edge flags of internal edges set_adjacent_edges(edges.get_verts(), 1); edges.clear_flags(); // get an edge filter that accepts "boundary" edges WRT the // given face filter BoundaryEdgeFilter boundary(face_filter); // Pull out the edge tips: Bedge_list tips = edges.filter(ChainTipEdgeFilter(boundary)); // Construct the filter that screens out previously reached // edges: UnreachedSimplexFilter unreached; AndFilter wanted = unreached + boundary; int k; // Start from all the tips first: for (k=0; k<tips.num(); k++) { Bedge* e = tips[k]; Bvert* v = (e->v2()->degree(boundary) != 2) ? e->v2() : e->v1(); Bface* f = e->screen_face(face_filter); assert(f); // e must have 1 face satisfying the filter // If this will start out running ccw, take it. // otherwise skip: if (f->next_vert_ccw(v) == e->other_vertex(v)) build(v, e, wanted); } // Now check the rest: for (k=0; k<edges.num(); k++) { Bedge* e = edges[k]; Bface* f = e->screen_face(face_filter); assert(f); // e must have 1 face satisfying the filter // Go CCW around faces build(f->leading_vert_ccw(e), e, wanted); } }