如何使用 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;
}
根据 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;
}