如何使用 CGAL 获得 2D alpha 形状后的剩余三角形?

How to get the remaining triangles after 2D alpha shape using CGAL?

根据 CGAL 文档,可以从 Delaunay 三角剖分创建 alpha_shape_2:

CGAL::Alpha_shape_2< Dt, ExactAlphaComparisonTag >::Alpha_shape_2(Dt& dt, FT alpha = 0, Mode m = GENERAL)

但是该操作破坏了三角剖分。

在我的问题中,我有一堆三角点。我需要使用 alpha 形状算法识别 "right" 个三角形。我已经从 delaunay 三角剖分(自己计算外接圆半径等)中计算出自己,因为我没有找到从 alpha_shape_2 中提取剩余三角形的方法(我可以提取 alpha 形状的边缘但不能内三角)。是否只能使用 CGAL?

例如在 matlab 中(哎哟)可以这样做:

shp = alphaShape(points.x,points.y);
shp.Alpha = alpha;
tri = alphaTriangulation(shp);
bf = boundaryFacets(shp);

附带问题:cgal 的 alpha 值的定义是什么?我的是:r_c/h>alpha,其中r_c是三角形外接圆半径和h和尺寸参数?

关于附带问题,请参阅 this section。关于你最初的问题,我不确定你想要得到什么,但你可以使用以下代码迭代所有三角形并获得它们的分类:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Alpha_shape_2.h>
#include <CGAL/Alpha_shape_vertex_base_2.h>
#include <CGAL/Alpha_shape_face_base_2.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <vector>

typedef CGAL::Exact_predicates_inexact_constructions_kernel  K;
typedef K::FT                                                FT;
typedef K::Point_2                                           Point;
typedef CGAL::Alpha_shape_vertex_base_2<K>                   Vb;
typedef CGAL::Alpha_shape_face_base_2<K>                     Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb>          Tds;
typedef CGAL::Delaunay_triangulation_2<K,Tds>                Triangulation_2;
typedef CGAL::Alpha_shape_2<Triangulation_2>                 Alpha_shape_2;

int main()
{
  std::vector<Point> points;
  double alpha;
  Alpha_shape_2 A(points.begin(), points.end(),
                  alpha,
                  Alpha_shape_2::GENERAL);

  for (Alpha_shape_2::Finite_faces_iterator fit=A.finite_faces_begin();
                                            fit!=A.finite_faces_end();++fit)
  {
    switch(A.classify(fit))
    {
      case Alpha_shape_2::REGULAR:
      break;
      case Alpha_shape_2::SINGULAR:
      break;
      case Alpha_shape_2::EXTERIOR:
      break;
      case Alpha_shape_2::INTERIOR:
      break;
    }
  }

  return 0;
}