我正在编写一个微分几何库,我想提供的一个小便利是在约束给定的表面上生成一组点。例如,对于一个球体,
现在,如果它是一个包含两个变量的方程,我可以逐步遍历其中一个,然后求解另一个,或者根据一些随机分布选择第一个,然后求解另一个。
不过,在这里,我不确定理想的方法是什么,以及可以做些什么来确保我在表面上有某种“均匀”的采样点,以便稍后进行三角测量。
什么算法最适合这项任务?
我正在编写一个微分几何库,我想提供的一个小便利是在约束给定的表面上生成一组点。例如,对于一个球体,
现在,如果它是一个包含两个变量的方程,我可以逐步遍历其中一个,然后求解另一个,或者根据一些随机分布选择第一个,然后求解另一个。
不过,在这里,我不确定理想的方法是什么,以及可以做些什么来确保我在表面上有某种“均匀”的采样点,以便稍后进行三角测量。
什么算法最适合这项任务?
如果您对表面网格划分感兴趣,Cheng、Dey 和 Shewchuk 的Delaunay Mesh Generation一书非常好。表面网格划分是一个相当复杂的话题,我无法在此进行总结。受约束的 Delaunay 三角剖分和 Voronoi 图尤其重要。
您还提到能够找到表面上的种子点。其中一部分将涉及能够求解非线性方程,您需要使用牛顿法。如果您正在处理代数曲面,Smale 的理论可以为您提供一般不可用的收敛保证。我的老同事做了一个演讲(幻灯片),我认为这是一个很好的介绍。您也可以将定义曲面的所有方程的平方和视为优化问题,但在这种情况下,Smale 的理论也适用。
假设表面上确实有某个点,另一个重要的操作是跟随某个矢量场的流动移动该点。您可能还希望能够计算测地线。这相当于求解一个微分代数系统。Hairer、Lubich 和 Wanner 的Geometric Numerical Integration有很多关于流形上的 ODE 的信息。
对于真正的应用程序,您可以查看deal.II 库中的歧管类。deal.II 使用流形来解决在表面上细化最初粗网格的问题。如果您尝试细化例如环形的网格,那么简单的实现只会在边界段上放置更多点而不调整曲率。使用deal.II,你可以说一个网格的边界的某个部分实际上是一些流形,细化的网格会更好地适应真实的表面。
最后,您可能会发现很多关于边界表示或构造实体几何建模的工程文献很有启发性。听起来是一个很酷的项目,祝你好运!如果您将其中的任何一个开源,请在此处发布链接。
我认为您正在寻找的是一种surface-meshing
算法。有许多不同的方法和算法可用于这些类型的问题 - 我将尝试(简要地)在这里概述一些选项:
参数空间方法:一种方法是在与表面相关的二维参数空间中构建网格。虽然这里的网格划分问题变成了 2D 任务(一个明显的优势!),但构建稳健的参数映射可能很困难。此类方法通常还要求参数化空间网格是各向异性的,以便它们在映射回 3D 表面时“形状良好”。
Delaunay-refinement方法:也可以直接在3D空间构建网格;完全避开参数映射问题。这样做的一种方法是逐步构建曲面的受限Delaunay 三角剖分 - 嵌入在 3D Delaunay 四面体中的三角形面的子集,与曲面形成良好的近似。通常,顶点会根据给定的细化策略一个接一个地插入,直到表面网格“足够好”。(我认为)这些方法的优点之一是它们在网格质量、表面近似误差等方面提供了各种可证明的保证。
变分技术:网格划分也可以作为一个优化问题:找到一组顶点位置和网格拓扑,使给定的网格质量函数最大化。给定顶点的一些初始分布,这些方法本质上是在表面上“滑动”顶点以改善网格的形状;重新计算网格拓扑(通常通过 Delaunay 类型的方法)。流行的变分方法包括 Centroidal Voronoi Tessellation (CVT) 和 Optimal Delaunay Triangulation (ODT)。
有许多高质量的网格包可以处理表面问题。列举几个:CGAL、GMSH、GEOGRAM、NETGEN和(我自己的图书馆)JIGSAW。