通过alpha_shape_2的点循环

时间:2018-12-19 16:56:28

标签: c++ cgal

我对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

0 个答案:

没有答案