我正在构建点粒子的仿真,并使用CGAL Delaunay三角剖分来确定粒子邻居。在我的实现中,每个顶点都有对应于(无符号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函数时,它返回一个不同的顶点句柄,该句柄应指示新位置与现有顶点重叠。但是事实并非如此。 {例如,我在应用移动(使用新位置作为输入)之前通过使用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);
谁能帮我找出问题所在?
答案 0 :(得分:0)
在cgal项目github中打开一个问题后,我被告知move函数已损坏。
提供了使用insert
然后使用remove
的解决方案。
在此处查看完整的详细信息:https://github.com/CGAL/cgal/issues/3239#issuecomment-405868378