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); } }
bool SELECT_WIDGET::select_edges(CPIXEL_list& pts) { err_adv(debug, "SELECT_WIDGET::select_edges:"); if (pts.num() < 2) { err_adv(debug, " bad gesture: %d points", pts.num()); return false; } // Find edit-level vert near start of pixel trail: Bvert* v = find_vert(pts[0]); if (!v) { err_adv(debug, " can't get starter vertex"); return false; } // 2. Extract edge sequence within tolerance of gest Bedge_list chain; int k = 0; // index of cur position in gesture Bvert* cur = v; // current vertex Bedge* e = 0; while ((e = match_span(cur, pts, k))) { if(!e->is_selected()) chain += e; cur = e->other_vertex(cur); } err_adv(debug, " got %d edges", chain.num()); // Confirm gest is sufficiently close to edge chain // 3. Select the edges WORLD::add_command(new MESH_SELECT_CMD(chain)); return true; }
// Like above, but returns the next border vertex: Bvert* next_border_vert_cw() { Bedge* border = next_border_edge_cw(); return border ? border->other_vertex(this) : nullptr; }