Я сделал тест для циркуляции через выходные точки 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