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

时间:2018-07-15 16:15:34

标签: cgal triangulation

我正在构建点粒子的仿真,并使用CGAL Delaunay三角剖分来确定粒子邻居。在我的实现中,每个顶点都有对应于(无符号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函数时,它返回一个不同的顶点句柄,该句柄应指示新位置与现有顶点重叠。但是事实并非如此。 {例如,我在应用移动(使用新位置作为输入)之前通过使用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);

谁能帮我找出问题所在?

1 个答案:

答案 0 :(得分:0)

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