Как получить оставшиеся треугольники после 2D альфа-формы, используя CGAL? - PullRequest
0 голосов
/ 28 января 2020

Из документации CGAL можно создать alpha_shape_2 из триангуляции Делоне:

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

Однако операция разрушает триангуляцию.

В моей задаче у меня есть куча точек, которые триангулированы. Мне нужно определить «правильные» треугольники, используя алгоритм альфа-формы. Я уже вычислил это сам по триангуляции Делоне (вычисление радиуса окружности самостоятельно и т. Д.), Поскольку я не нашел способа извлечь оставшиеся треугольники из alpha_shape_2 (я могу извлечь края формы альфа, но не внутренние треугольники) , Возможно ли использование только CGAL?

Например, в Matlab (ой) можно сделать:

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

Дополнительный вопрос: каково определение альфа-значения cgal? У меня есть: r_c / h> alpha, где r_ c - радиус окружности треугольника, а h и параметр размера?

1 Ответ

0 голосов
/ 28 января 2020

Дополнительный вопрос см. в этом разделе . Что касается вашего первоначального вопроса, я не уверен, что точно понимаю, что вы хотите получить, но вы можете перебрать все треугольники и получить их классификацию, используя следующий код:

#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;
}
...