对于Delaunay三角剖分中的CGAL顶点句柄的生命周期,我有些困惑。当句柄无效时,我不清楚。
在我的应用程序中,我经常需要移动一个点,并希望我可以做到这一点而又不会使保存顶点句柄的结构无效。 (文档中提到迭代器无效)
例如:
在此示例中,移动了三角剖分中的顶点,使其重复,从而删除了该顶点。
//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
答案 0 :(得分:0)
在CGAL三角剖分中,迭代器和句柄是等效的,并实现为指针。
从三角剖分中删除顶点后,指向它的一个迭代器或句柄将失效。
移动顶点时,相当于插入然后移除。 move
函数返回新的(插入的)顶点句柄。
在移动时,将一个顶点(handle2
)移动到现有顶点(handle0
)的位置。插入将不执行任何操作,并返回handle0
,并且handle2
指向的顶点将被删除。因此handle2
无效。