Циркуляция через точки alpha_shape_2 - PullRequest
0 голосов
/ 19 декабря 2018

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