Esempio n. 1
0
    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);
    }
Esempio n. 2
0
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;
    }
  }
}