CGAL中球体上的二维三角剖分-LMLPHP

        描述了球体上的二维三角形。其组织如下: 

 1、定义

        设S(c,r)为欧几里得空间R3中嵌入的二维球体,其中心为c,半径为r,即S(c,r)={x∈R3:∣∣x−c∣∣=r}。当参数c和r不重要时,将省略它们,并直接使用S。给定S(c,r)上的一组点P,P的二维三角剖分可以描述为一个二维单纯复形,它是纯的、连通的、没有奇异性的,其顶点正好是P中的点(参见2D三角剖分软件包中的完整定义)。

        在R2中,Delaunay三角剖分是一个二维三角剖分,它满足空圆性质(也称为Delaunay性质):任何三角剖分的面的外接圆在其内部不包含任何点。这个定义自然扩展到二维球体,如图所示。

CGAL中球体上的二维三角剖分-LMLPHP

        S上Delaunay三角剖分的特殊性在于,Delaunay属性测试可以简化为三维空间中的简单方向测试:事实上,Delaunay面的外接圆是穿过该面三个顶点的平面与S的交集,确定第四个点q是否在外接圆内等价于检查q是否在所述支撑平面上方或下方。 

      俗地说,如果一个网格模型中存在多个(3个或以上)面共一条边,那么它就是非流形的(non-manifold),因为这个局部区域由于自相交而无法摊开展平为一个平面了。

   Projection_on_sphere_traits_3是一个用于在三维空间中定义点和球面上的投影的traits类。它将一个点投影到球面上,并提供了用于比较球面上点和进行其他操作的相关函数。这个traits类适用于需要在球面上进行三角剖分的情况,它通过直接处理点的投影来避免创建新的几何点。

        另一方面,Delaunay_triangulation_on_sphere_traits_2是一个用于在球面上定义Delaunay三角剖分的traits类。它基于Delaunay三角剖分的概念,将一组点分布在球面上,并确保相邻三角形之间的角度尽可能地大。这个traits类适用于需要将点集划分为三角形的情况,以进行进一步的分析或可视化。

        总结来说,Projection_on_sphere_traits_3Delaunay_triangulation_on_sphere_traits_2都是用于处理球面上点的三角剖分的特征类,但它们的应用场景和目标略有不同。Projection_on_sphere_traits_3主要用于处理三维空间中的点和球面上的投影,而Delaunay_triangulation_on_sphere_traits_2则用于将球面上的点集划分为Delaunay三角形。

1.1、球体上点的表示

         前一节关于Delaunay三角剖分的理论定义假设P中的点恰好位于球面上。然而,在现实世界中,人们通常不会操作恰好位于球面上的点,因为所选的数值类型不能精确表示平方根,例如浮点型或双精度型。一些特定的数值类型能够精确表示球面上所有的点,例如CORE::Expr类,但这样做会导致计算成本大幅增加。

        如果点不位于凸位置,那么Delaunay属性作为方向测试的解释就不成立,因此点的精确表示显然是一个问题。

        理论设置和实践设置之间的这一差距是由Caroli等人解决的:解决的办法是使用正则三角剖分,这是Delaunay三角剖分到加权点集的推广。 R2中的加权点(p,w)可以自然地看作是一个以p为中心、半径r的圆,其中r²=w,同样,正则三角剖分和Delaunay三角剖分可以自然地扩展到球面上的圆。给定一组存在于R3中的点P3,Caroli等人计算了加权点集Pw的正则三角剖分,其中Pw的加权点是P3的点到S的投影,其权重基于投影距离。此外,他们还证明,如果Pw中加权点之间的欧几里得距离足够大,且加权点足够接近球面,则P3的Delaunay三角剖分的Delaunay三角剖分正好是Pw的正则三角剖分。因此,可以操作不在球面上的3D点,只要点彼此之间足够远,就可以构建Delaunay三角剖分而不考虑权重。

        Caroli等人提供了双精度类型下分离准则的界限:两个点必须至少相距2^-25r。这是一个通常对大多数输入都满足的条件:如果r是例如地球半径,大约为6300公里,那么点的分离要求将是一米左右。

2、实施

        这个包的主要类是CGAL::Delaunay_triangulation_on_sphere_2 类;它表示球面上的 Delaunay 三角剖分,并提供插入和删除顶点,以及绘制三角剖分及其对偶 Voronoi 图工具。 CGLA::Delaunay_triangulation_on_sphere_2 的基础是 CGAL::Triangulation_on_sphere_2 类。它表示球面上的三角剖分,但不支持插入或删除顶点。这两个类都建立在称为三角剖分数据结构的数据结构之上。三角剖分数据结构可以被认为是一个用于三角剖分的面和顶点的容器。这个数据结构还负责三角剖分的所有组合方面。

        这些三角剖分类有意与CGAL中的CGAL::Delaunay_triangulation_2和CGA::Triangulation_2非常相似,因为这两个类都表示无边界的2-流形域的三角剖分。因此,这里不重复关于实现的许多细节,补充信息可以在软件包2D三角剖分的表示、软件设计和基本三角剖分部分中找到。

        然而,与欧几里德二维三角剖分的重要区别在于:由于三角剖分数据结构表示一个没有边界的二维流形,因此二维三角剖分需要引入所谓的无限面来完成“真实”的三角剖分(参见面集)。在球面上,这种技巧是不必要的,因为三角剖分本身已经是一个没有边界的二维流形。

2.1、Ghost 面

        上述说法有一个例外:在所有点都位于同一半球上的退化配置中,球面上的Delaunay三角剖分在理论上有一个边界。然而,在内部,三角剖分数据结构必须始终保持为2-流形。为了确保这一特性,添加了被称为Ghost 面的虚拟面。这些面的特征是球体的中心(严格地)不位于面的支撑平面的正侧。相反,不是鬼面的面称为实体面,这样的面的边称为实体边。

CGAL中球体上的二维三角剖分-LMLPHP

2.2、特征类与核的选择

        此软件包提供了两个特征类,作为概念DelaunayTriangulationOnSphereTraits_2的模型:

        CGAL::Delaunay_triangulation_on_sphere_traits_2:这是最简单的特征,它直接将球面上的点表示为三维点。如果它的内核模板参数不能精确表示球面上的所有点,则它采用“球面上点的表示”一节中描述的解决方案来确定一个点是否应被视为球面上的点,或者是否太接近现有的顶点。

        CGAL::Projection_on_sphere_traits_3:这个traits类利用自定义的内部点类型来表示球面上的点:给定一个3D空间中的点p,这个traits类直接操纵它在球面上的投影(即球面与端点p和球心之间的线段的交点)。因此,所有要插入的点都在球面上。这个traits类允许操纵不在球面上的点,但其在球面上的三角剖分仍然是有意义的,例如具有海拔的地理坐标。

        这两个类都由内核模板化。选择这个内核对于确保正确结果非常重要:为了安全地构建三角剖分,内核应该提供精确的谓词(例如,CGAL标准库中的Exact_predicates_inexact_constructions_kernel)。此外,一些辅助函数,如用于构造Voronoi图的函数,需要创建新的几何点;因此,如果想要避免不可避免的数值近似,应该使用提供球面上点的精确表示和精确构造的内核(例如,CGAL标准库中的Exact_predicates_exact_constructions_kernel_with_sqrt)。

2.3、球面上三角剖分的维数

        通常与其他三角剖分一样,球面三角剖分的维数定义如下:-2,如果三角测量为空;-1,如果三角测量包含单个顶点;

        如果三角剖分恰好包含两个顶点,则为 0;

        1:如果三角剖分包含至少三个共面顶点(不一定位于大圆上);

        2:如果三角剖分包含至少四个非共面顶点。

        请注意,维数为 1 的三角剖分只是画在圆上的多边形。多边形本身不是三角剖分。因此,维数为 1 的三角剖分由平面多边形组成,没有面。

2.4、几何嵌入

        到目前为止,对S上的Delaunay(和规则)三角剖分的描述大多是组合的。三角剖分的单形的几何嵌入问题也很有趣。在S上的一组点的三角剖分的边和面的两个自然嵌入是使用直单形,即使用三维线段和三角形作为三角剖分的边和面,或使用弯曲的嵌入,其中边是S上大圆的弧线段。在后一种选择中,面的几何嵌入由它的三条边隐式定义。

        用户可以选择使用 Triangulation_on_sphere_2::segment() 或 Triangulation_on_sphere_2::segment_on_sphere()。在构造对偶图 Voronoi 图时,也有类似的选择。

CGAL中球体上的二维三角剖分-LMLPHP

CGAL 5.6 - 2D Triangulations on the Sphere: User Manual

12-05 11:48