如何使用 CGAL 对一组在球体上移动的点进行建模?

How to use CGAL to model a set of points moving on a sphere?

我正在尝试学习使用 CGAL。我对使用哪些数据结构和三角剖分方案有疑问。

问题描述:

我有少量 ( < 1000) 个粒子在球体上移动。我需要用这个点云制作一个三角形 Delaunay 网格。在每个时间步,我需要:

  1. 仅在需要时重新网格化点云,以便 Delaunay 准则仍然成立。独立于点坐标存储网格连接。
  2. 保持拓扑固定,使用迭代求解器进行一些优化以计算新的粒子位置。具有相同连通性的求解器迭代次数可以达到 100 次或更多。在每次迭代中,计算需要每个三角形的面积和一些由边连接的顶点的计算(即每个顶点与最近邻居的第一个环相互作用)。

问题:

  1. 如何在不使三角剖分的迭代器或循环器无效的情况下更改与网格(三角剖分数据结构、表面网格、多面体等)顶点关联的点的坐标?
  2. 如何检查何时需要重新划分网格?
  3. 哪种数据结构可以最快地访问整个网格中的所有边和面?每条边由两个三角形共享。边缘的计算是最昂贵的。因此,我只想为每条边计算一次。遍历所有面并分别遍历所有边可能效率较低。

如果需要更多信息,请告诉我。

对您的问题给出部分答案:

3/ 您可以使用 openmesh 库对您的点进行网格划分。正如 here 所解释的那样,它允许一个人非常快地到达邻居的第一个环,以及所有的边和面。我不确定是否是可以最快访问这些信息的数据结构。为了给你一个预期速度的提示,在我的工作中我使用 openmesh :运行 30 'for' 循环,每个循环遍历我网格的 500 000 个顶点的第一个环邻居并计算一些算术(通常是重心),总共花费不到 100 毫秒。

1/ 使用 openmesh,您可以随时重置点位置而不更改其连接性(它不会删除已经定义的边和面)。

2/ 要检查是否需要重新划分网格,您必须检查网格的每个点是否仍然满足 Delaunay 条件。如果不是,则重新划分整个网格或交换合适的边。

希望对您有所帮助!