在 CGAL 2D 周期性 Delaunay 三角剖分中移动顶点的问题

Issue with moving a vertex in CGAL 2D periodic Delaunay triangulation

我正在构建点粒子的模拟并使用 CGAL Delaunay 三角剖分来确定粒子邻居。在我的实现中,每个顶点都有对应于 (unsigned int) 粒子索引的额外信息。

当不使用周期性边界时它可以工作。 当我然后尝试切换到周期性边界时,我遇到了问题。 最初的 Delaunay 三角剖分没问题,但是当我尝试使用 move_if_no_collisionmove_point 时,出现意外行为。

这是我使用的代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Periodic_2_Delaunay_triangulation_2.h>
#include <CGAL/Periodic_2_Delaunay_triangulation_traits_2.h>
#include <CGAL/Triangulation_vertex_base_with_info_2.h>         
typedef CGAL::Exact_predicates_inexact_constructions_kernel             Kernel;             
typedef CGAL::Periodic_2_Delaunay_triangulation_traits_2<Kernel>            GT;
typedef CGAL::Periodic_2_triangulation_vertex_base_2<GT>                     Vb;
typedef CGAL::Triangulation_vertex_base_with_info_2<unsigned int, GT, Vb>   VbInfo;                 
typedef CGAL::Periodic_2_triangulation_face_base_2<GT>                        Fb;
typedef CGAL::Triangulation_data_structure_2<VbInfo, Fb>           Tds;             
typedef CGAL::Periodic_2_Delaunay_triangulation_2<GT, Tds>                  Delaunay;
typedef Delaunay::Point                                         CGAL_Point;         
typedef Delaunay::Vertex_handle                                 Vertex;


Delaunay Dtriangulation;                
Dtriangulation.insert(particlesNormTriangData.begin(), particlesNormTriangData.end());

//Then This function generates the vector VerticesHandlesVector that holds handles to vertices
generateDelaunayVerticesHandlesVector(); 

Vertex v=VerticesHandlesVector[particle->get_Index()];

//Here are two ways I tried to change vertex position in my code:
Vertex test_v = Dtriangulation.move_if_no_collision(v, newPosition); 
//alternative option:
Dtriangulation.move_point(v, newPosition);

当我将这些函数之一应用于顶点时,它会将顶点的信息更改为 3435973836(似乎始终是相同的值)。

特别是在使用 move_if_no_collision 函数时,它 returns 一个不同的顶点句柄,它应该表示新位置与现有顶点重叠。然而事实并非如此。 {例如,我在应用移动(以新位置作为输入)之前使用 nearest_vertex() 函数检查了这一点。离新位置最近的顶点是正在移动的顶点(因为它是一个小位移)。}

这是非周期性情况的工作代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Delaunay_triangulation_2.h>                      
#include <CGAL/Triangulation_vertex_base_with_info_2.h>         
typedef CGAL::Exact_predicates_inexact_constructions_kernel             Kernel;             
typedef CGAL::Triangulation_vertex_base_with_info_2<unsigned int, Kernel>   Vb;                 
typedef CGAL::Triangulation_data_structure_2<Vb>                            Tds;                
typedef CGAL::Delaunay_triangulation_2<Kernel, Tds>                  Delaunay;          
typedef Kernel::Point_2                                             CGAL_Point; 
typedef Delaunay::Vertex_handle                                         Vertex;



Delaunay Dtriangulation;                
Dtriangulation.insert(particlesNormTriangData.begin(), particlesNormTriangData.end());

//This function generates the vector VerticesHandlesVector that holds handles to vertices
generateDelaunayVerticesHandlesVector(); 

Vertex test_v = Dtriangulation.move_if_no_collision(v, newPosition);

谁能帮我看看哪里出了问题?

在 cgal 项目 github 中打开一个问题后,我被告知移动功能已损坏。 提供了使用 insert 然后 remove 的解决方案。 在此处查看完整详细信息:https://github.com/CGAL/cgal/issues/3239#issuecomment-405868378