在 CGAL 2D 周期性 Delaunay 三角剖分中移动顶点的问题
Issue with moving a vertex in CGAL 2D periodic Delaunay triangulation
我正在构建点粒子的模拟并使用 CGAL Delaunay 三角剖分来确定粒子邻居。在我的实现中,每个顶点都有对应于 (unsigned int) 粒子索引的额外信息。
当不使用周期性边界时它可以工作。
当我然后尝试切换到周期性边界时,我遇到了问题。
最初的 Delaunay 三角剖分没问题,但是当我尝试使用 move_if_no_collision
或 move_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
我正在构建点粒子的模拟并使用 CGAL Delaunay 三角剖分来确定粒子邻居。在我的实现中,每个顶点都有对应于 (unsigned int) 粒子索引的额外信息。
当不使用周期性边界时它可以工作。
当我然后尝试切换到周期性边界时,我遇到了问题。
最初的 Delaunay 三角剖分没问题,但是当我尝试使用 move_if_no_collision
或 move_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