我对alpha_shape_2的输出点进行了循环测试。在顶点(0 0),(10 0),(10 10),(0 10)处有一个正方形。
很显然,A.alpha_shape_vertices_begin()
以(10 0)开头,而incident_vertices
选择的入射顶点为(10,10)。直到我得到一个怪异的输出(0.5 0.5)才应该是(10 0)之前,循环一直很好。
我认为(0.5 0.5)是过期价值,尽管流通者没有这样的东西。这就是为什么我尝试--vccopy
尽早停止发行并避免(0.5 0.5)的原因。这种便宜的技巧适用于这种特定情况,但一般而言并非如此。
我也检查了边缘。再次出现相同的怪异数字(0.5 0.5)。
我的最终目标是根据alpha_shape_2返回的点制作一个简单的多边形。循环的目的是获得有序点。
有人知道为什么我会得到这个怪异的数字吗?
#include <CGAL/Exact_predicates_exact_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/Polygon_2.h>
#include <CGAL/Iso_rectangle_2.h>
#include <CGAL/Delaunay_triangulation_2.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel CGAL_kernel;
typedef CGAL_kernel::Point_2 CGAL_Point;
typedef CGAL::Alpha_shape_vertex_base_2<CGAL_kernel> Vb;
typedef CGAL::Alpha_shape_face_base_2<CGAL_kernel> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb> Tds;
typedef CGAL::Delaunay_triangulation_2<CGAL_kernel,Tds> Triangulation_2;
typedef CGAL::Alpha_shape_2<Triangulation_2> Alpha_shape_2;
typedef CGAL_kernel::FT FT;
typedef CGAL::Polygon_2<CGAL_kernel> Polygon_2;
int main()
{
std::deque<Polygon_2> pols;
std::vector<CGAL_Point> ptscgal;
ptscgal.push_back(CGAL_Point(0,0));
ptscgal.push_back(CGAL_Point(10,0));
ptscgal.push_back(CGAL_Point(10,10));
ptscgal.push_back(CGAL_Point(0,10));
Alpha_shape_2 A(ptscgal.begin(), ptscgal.end(), FT(10000), Alpha_shape_2::REGULARIZED);
Alpha_shape_2::Alpha_shape_vertices_iterator vit = A.alpha_shape_vertices_begin(),
vend = A.alpha_shape_vertices_end();
Alpha_shape_2::Alpha_shape_edges_iterator it = A.alpha_shape_edges_begin(),
end = A.alpha_shape_edges_end();
Triangulation_2::Vertex_circulator vc = A.incident_vertices(*vit);
Triangulation_2::Vertex_circulator vccopy = vc;
// --vccopy;
Triangulation_2::Edge_circulator ec = A.incident_edges(*vit);
Triangulation_2::Edge_circulator eccopy = ec;
do
{
std::cout << vc->point() << std::endl;
}
while(++vc != vccopy);
do
{
std::cout << *(ec->first->vertex(0)) << " " << *(ec->first->vertex(1)) << std::endl;
}
while(++ec != eccopy);
return 0;
}
输出:
10 10
0 10
0 0
0.5 0.5 // ??
10 0 10 10
10 0 0 10
0.5 0.5 10 0 // ??
10 10 10 0