CGAL:如何使用CGAL::Polygon_mesh_processing::area()? C++

CGAL: How to use CGAL::Polygon_mesh_processing::area()? C++

我正在尝试估计分段叶子的面积。我已经使用先进的前表面重建对叶子进行了三角测量。目前,我很难理解 area() 函数的 CGAL 文档。重建的结果产生了.off 文件。我想将文件作为输入并使用 CGAL::Polygon_mesh_processing::area (const TriangleMesh &tmesh, const NamedParameters &np)

计算面积

这是我重构的代码:

#define CGAL_EIGEN3_ENABLED 1

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>
#include <CGAL/Point_set_3/IO.h>
#include <CGAL/remove_outliers.h>
#include <CGAL/grid_simplify_point_set.h>
#include <CGAL/jet_smooth_point_set.h>
#include <CGAL/jet_estimate_normals.h>
#include <CGAL/mst_orient_normals.h>
#include <CGAL/poisson_surface_reconstruction.h>
#include <CGAL/Advancing_front_surface_reconstruction.h>
#include <CGAL/Scale_space_surface_reconstruction_3.h>
#include <CGAL/Scale_space_reconstruction_3/Jet_smoother.h>
#include <CGAL/Scale_space_reconstruction_3/Advancing_front_mesher.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>
#include <cstdlib>
#include <vector>
#include <fstream>

// types
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::FT FT;
typedef Kernel::Point_3 Point_3;
typedef Kernel::Vector_3 Vector_3;
typedef Kernel::Sphere_3 Sphere_3;
typedef CGAL::Point_set_3<Point_3, Vector_3> Point_set;

int main(int argc, char*argv[])
{
  Point_set points;
  std::string fname = argc==1?CGAL::data_file_path("points_3/kitten.xyz") : argv[1];

  if (argc < 2)
  {
    std::cerr << "Usage: " << argv[0] << " [input.xyz/off/ply/las]" << std::endl;
    std::cerr <<"Running " << argv[0] << " data/kitten.xyz -1\n";
  }

  std::ifstream stream (fname, std::ios_base::binary);
  if (!stream)
  {
    std::cerr << "Error: cannot read file " << fname << std::endl;
    return EXIT_FAILURE;
  }

  stream >> points;
  std::cout << "Read " << points.size () << " point(s)" << std::endl;

  if (points.empty())
    return EXIT_FAILURE;
  typename Point_set::iterator rout_it = CGAL::remove_outliers<CGAL::Sequential_tag>
    (points,
     24, // Number of neighbors considered for evaluation
     points.parameters().threshold_percent (5.0)); // Percentage of points to remove

  points.remove(rout_it, points.end());
  std::cout << points.number_of_removed_points()
            << " point(s) are outliers." << std::endl;

          
  // Applying point set processing algorithm to a CGAL::Point_set_3
  // object does not erase the points from memory but place them in
  // the garbage of the object: memory can be freeed by the user.

  points.collect_garbage();

  // Compute average spacing using neighborhood of 6 points
  double spacing = CGAL::compute_average_spacing<CGAL::Sequential_tag> (points, 6);

  // Simplify using a grid of size 2 * average spacing
  typename Point_set::iterator gsim_it = CGAL::grid_simplify_point_set (points, 2. * spacing);
  points.remove(gsim_it, points.end());

  std::cout << points.number_of_removed_points()
            << " point(s) removed after simplification." << std::endl;
  
  points.collect_garbage();
 
  CGAL::jet_smooth_point_set<CGAL::Sequential_tag> (points, 24);
  


  typedef std::array<std::size_t, 3> Facet; // Triple of indices
  std::vector<Facet> facets;

  // The function is called using directly the points raw iterators
  CGAL::advancing_front_surface_reconstruction(points.points().begin(),
                                                points.points().end(),
                                                std::back_inserter(facets));
  
  std::cout << facets.size ()
            << " facet(s) generated by reconstruction." << std::endl;

  // copy points for random access
  std::vector<Point_3> vertices;
  vertices.reserve (points.size());
  std::copy (points.points().begin(), points.points().end(), std::back_inserter (vertices));

  CGAL::Surface_mesh<Point_3> output_mesh;
  CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(vertices, facets, output_mesh);
  std::ofstream f ("out_af.off");
  f << output_mesh;
  f.close ();
  
  return EXIT_SUCCESS;
}

Link to the code where I based my answer in using this function。您还可以在包含的 CGAL 中查看 .h 文件,其中还包含有关如何使用这些函数的文档。

#define CGAL_EIGEN3_ENABLED 1

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
#include <CGAL/Polygon_mesh_processing/measure.h>

#include <fstream>
#include <iostream>

typedef CGAL::Exact_predicates_inexact_constructions_kernel       K;

typedef K::FT FT;
typedef K::Point_3                                                Point;
typedef K::Vector_3                                               Vector;

typedef CGAL::Surface_mesh<Point>                                 Surface_mesh;

namespace PMP = CGAL::Polygon_mesh_processing;

int main(int argc, char* argv[])
{
  const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/out_af.off");

  Surface_mesh mesh;


  if(!PMP::IO::read_polygon_mesh(filename, mesh))
  {
    std::cerr << "Invalid input." << std::endl;
    return 1;
  }

  std::cout << PMP::area(mesh) << std::endl;
  
  
  return 0;
}