void LinearizerBase::process_edge(int iv1, int iv2, int marker) { int mid = peek_vertex(iv1, iv2); if(mid != -1) { process_edge(iv1, mid, marker); process_edge(mid, iv2, marker); } else add_edge(iv1, iv2, marker); }
void Vectorizer::process_dash(int iv1, int iv2) { int mid = peek_vertex(iv1, iv2); if (mid != -1) { process_dash(iv1, mid); process_dash(mid, iv2); } else add_dash(iv1, iv2); }
void LinearizerBase::regularize_triangle(int iv0, int iv1, int iv2, int mid0, int mid1, int mid2, int marker) { // count the number of hanging mid-edge vertices int n = 0; if(mid0 >= 0) n++; if(mid1 >= 0) n++; if(mid2 >= 0) n++; if(n == 3) { // three hanging vertices: split into four triangles regularize_triangle(iv0, mid0, mid2, peek_vertex(iv0, mid0), -1, peek_vertex(mid2, iv0), marker); regularize_triangle(mid0, iv1, mid1, peek_vertex(mid0, iv1), peek_vertex(iv1, mid1), -1, marker); regularize_triangle(mid2, mid1, iv2, -1, peek_vertex(mid1, iv2), peek_vertex(iv2, mid2), marker); regularize_triangle(mid0, mid1, mid2, -1, -1, -1, marker); } else if(n == 2) { // two hanging vertices: split into three triangles if(mid0 < 0) { regularize_triangle(iv0, iv1, mid1, peek_vertex(iv0, iv1), peek_vertex(iv1, mid1), -1, marker); regularize_triangle(mid2, iv0, mid1, peek_vertex(mid2, iv0), -1, -1, marker); regularize_triangle(mid2, mid1, iv2, -1, peek_vertex(mid1, iv2), peek_vertex(iv2, mid2), marker); } else if(mid1 < 0) { regularize_triangle(iv1, iv2, mid2, peek_vertex(iv1, iv2), peek_vertex(iv2, mid2), -1, marker); regularize_triangle(mid0, iv1, mid2, peek_vertex(mid0, iv1), -1, -1, marker); regularize_triangle(mid0, mid2, iv0, -1, peek_vertex(mid2, iv0), peek_vertex(iv0, mid0), marker); } else { regularize_triangle(iv2, iv0, mid0, peek_vertex(iv2, iv0), peek_vertex(iv0, mid0), -1, marker); regularize_triangle(mid1, iv2, mid0, peek_vertex(mid1, iv2), -1, -1, marker); regularize_triangle(mid1, mid0, iv1, -1, peek_vertex(mid0, iv1), peek_vertex(iv1, mid1), marker); } } else if(n == 1) { // one hanging vertex: split into two triangles if(mid0 >= 0) { regularize_triangle(iv0, mid0, iv2, peek_vertex(iv0, mid0), -1, peek_vertex(iv2, iv0), marker); regularize_triangle(mid0, iv1, iv2, peek_vertex(mid0, iv1), peek_vertex(iv1, iv2), -1, marker); } else if(mid1 >= 0) { regularize_triangle(iv1, mid1, iv0, peek_vertex(iv1, mid1), -1, peek_vertex(iv0, iv1), marker); regularize_triangle(mid1, iv2, iv0, peek_vertex(mid1, iv2), peek_vertex(iv2, iv0), -1, marker); } else { regularize_triangle(iv2, mid2, iv1, peek_vertex(iv2, mid2), -1, peek_vertex(iv1, iv2), marker); regularize_triangle(mid2, iv0, iv1, peek_vertex(mid2, iv0), peek_vertex(iv0, iv1), -1, marker); } } else { // no hanging vertices: produce a single triangle add_triangle(iv0, iv1, iv2, marker); } }