CGAL顶点句柄的生命周期?

时间:2018-12-26 15:27:56

标签: c++ computational-geometry cgal delaunay

对于Delaunay三角剖分中的CGAL顶点句柄的生命周期,我有些困惑。当句柄无效时,我不清楚。

在我的应用程序中,我经常需要移动一个点,并希望我可以做到这一点而又不会使保存顶点句柄的结构无效。 (文档中提到迭代器无效)

例如:

  1. 如果重建了三角剖分,旧句柄是否无效?
  2. 如果删除了顶点,则该顶点的悬空手柄会发生什么?

在此示例中,移动了三角剖分中的顶点,使其重复,从而删除了该顶点。

//https://doc.cgal.org/latest/Triangulation_2/index.html#title42
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Triangulation_vertex_base_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel         K;
typedef CGAL::Triangulation_vertex_base_2<K>                        Vb;
typedef CGAL::Triangulation_data_structure_2<Vb>                    Tds;
typedef CGAL::Delaunay_triangulation_2<K, Tds>                      Delaunay;
typedef Delaunay::Point                                             Point;
int main()
{
    Delaunay T;
    auto handle0 = T.insert(Point(0, 0));
    auto handle1 = T.insert(Point(1, 0));
    auto handle2 = T.insert(Point(1, 1));
    std::cout << "Beginning" << std::endl;
    for (auto v = T.all_vertices_begin(); v != T.all_vertices_end(); ++v)
    {
        std::cout << *v << std::endl;
    }
    T.move(handle2, Point(0, 0));
    std::cout << "Move to invalid will remove the vertex (expected)" << std::endl;
    for (auto v = T.all_vertices_begin(); v != T.all_vertices_end(); ++v)
    {
        std::cout << *v << std::endl;
    }
    std::cout << "Where does this handle point to?" << std::endl;
    T.move(handle2, Point(1, 1));
    std::cout << "Vertices" << std::endl;
    for (auto v = T.all_vertices_begin(); v != T.all_vertices_end(); ++v)
    {
        std::cout << *v << std::endl;
    }
    return 0;
}

输出

Beginning
-9.25596e+61 -9.25596e+61
0 0
1 0
1 1
Move to invalid will remove the vertex (expected)
-9.25596e+61 -9.25596e+61
0 0
1 0
Where does this handle point to?
Vertices
-9.25596e+61 -9.25596e+61
0 0
1 0

1 个答案:

答案 0 :(得分:0)

在CGAL三角剖分中,迭代器和句柄是等效的,并实现为指针。

从三角剖分中删除顶点后,指向它的一个迭代器或句柄将失效。

移动顶点时,相当于插入然后移除。 move函数返回新的(插入的)顶点句柄。

在移动时,将一个顶点(handle2)移动到现有顶点(handle0)的位置。插入将不执行任何操作,并返回handle0,并且handle2指向的顶点将被删除。因此handle2无效。