【问题标题】:How to get the remaining triangles after 2D alpha shape using CGAL?如何使用 CGAL 在 2D alpha 形状后获得剩余的三角形?
【发布时间】:2020-01-27 22:02:41
【问题描述】:

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

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

但是该操作破坏了三角测量。

在我的问题中,我有一堆三角点。我需要使用 alpha 形状算法识别“直角”三角形。我已经从 delaunay 三角测量中计算了自己(自己计算外接圆半径等等),因为我没有找到从 alpha_shape_2 中提取剩余三角形的方法(我可以提取 alpha 形状的边缘,但不能提取内部三角形) .只能使用CGAL吗?

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

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

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

【问题讨论】:

    标签: cgal


    【解决方案1】:

    有关附带问题,请参阅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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多