void triangulate(const Vertices& vertices, PolygonMesh& output) { const int n_vertices = vertices.vertices.size(); if (n_vertices <= 3) { output.polygons.push_back(vertices); return; } std::vector<uint32_t> remaining_vertices(n_vertices); if (area(vertices.vertices) > 0) // clockwise? { remaining_vertices = vertices.vertices; } else { for (int v = 0; v < n_vertices; v++) remaining_vertices[v] = vertices.vertices[n_vertices - 1 - v]; } // Avoid closed loops. if (remaining_vertices.front() == remaining_vertices.back()) remaining_vertices.erase(remaining_vertices.end()-1); // null_iterations avoids infinite loops if the polygon is not simple. for (int u = remaining_vertices.size() - 1, null_iterations = 0; remaining_vertices.size() > 2 && null_iterations < remaining_vertices.size()*2; ++null_iterations, u=(u+1)%remaining_vertices.size()) { int v = (u + 1) % remaining_vertices.size(); int w = (u + 2) % remaining_vertices.size(); if (isEar(u, v, w, remaining_vertices)) { Vertices triangle; triangle.vertices.resize(3); triangle.vertices[0] = remaining_vertices[u]; triangle.vertices[1] = remaining_vertices[v]; triangle.vertices[2] = remaining_vertices[w]; output.polygons.push_back(triangle); remaining_vertices.erase(remaining_vertices.begin()+v); null_iterations = 0; } } for (int i = 0; i < remaining_vertices.size(); ++i) ntk_dbg_print(remaining_vertices[i], 1); }
void pcl::EarClipping::triangulate (const Vertices& vertices, PolygonMesh& output) { const int n_vertices = static_cast<const int> (vertices.vertices.size ()); if (n_vertices <= 3) return; std::vector<uint32_t> remaining_vertices (n_vertices); if (area (vertices.vertices) > 0) // clockwise? remaining_vertices = vertices.vertices; else for (int v = 0; v < n_vertices; v++) remaining_vertices[v] = vertices.vertices[n_vertices - 1 - v]; // Avoid closed loops. if (remaining_vertices.front () == remaining_vertices.back ()) remaining_vertices.erase (remaining_vertices.end () - 1); // null_iterations avoids infinite loops if the polygon is not simple. for (int u = static_cast<int> (remaining_vertices.size ()) - 1, null_iterations = 0; remaining_vertices.size () > 2 && null_iterations < static_cast<int >(remaining_vertices.size () * 2); ++null_iterations, u = (u+1) % static_cast<int> (remaining_vertices.size ())) { int v = (u + 1) % static_cast<int> (remaining_vertices.size ()); int w = (u + 2) % static_cast<int> (remaining_vertices.size ()); if (isEar (u, v, w, remaining_vertices)) { Vertices triangle; triangle.vertices.resize (3); triangle.vertices[0] = remaining_vertices[u]; triangle.vertices[1] = remaining_vertices[v]; triangle.vertices[2] = remaining_vertices[w]; output.polygons.push_back (triangle); remaining_vertices.erase (remaining_vertices.begin () + v); null_iterations = 0; } } }