CGAL的二维分段的Delaunay图

        本章描述了CGAL的二维分段Delaunay图。我们从定义一节中的一些定义开始。2D段Delaunay图形包的软件设计在“软件设计”一节中进行了描述。在“几何特征”一节中,我们讨论了2D段Delaunay图包的几何特征,在“段Delaunay图层次结构”一节,简要描述了适用于快速近邻查询的数据结构——段Delaunay-图层次结构。 

1、定义

一组弱(左)和强(右)相交点的分段Voronoi图。 

        CGAL的二维分段Delaunay图包设计用于计算平面上一组可能相交的分段的Delaunay图形。虽然我们计算Delaunay图,但我们经常会提到它的对偶,即分段Voronoi图,因为它更容易解释和理解。已经实现的算法是增量的。相应的CGAL类称为Segment_Dlaunay_graph_2<SegmentDelaunayGraphTraits_2,SegmentDelanayGraphStructure_2>,并将在后续部分中进行更详细的讨论。

1.1、定义

        在详细描述实现细节之前,我们先简要介绍一下线段Delaunay图和线段Voronoi图的原理。线段Voronoi图是定义在一组非交叠的点上,这些点可以是线段,也可以是点,我们假设这些点是通过它们的端点给出的。线段Voronoi图将平面划分成若干个相互连接的区域,称为单元格,与这些点相关联。线段Voronoi图的双图被称为线段Delaunay图。点ti的单元格是平面上离ti最近的点,比其他任何点tj(j≠i)都要近。平面上的点x到点ti的距离δ(x,ti)被定义为x到ti中各点的欧几里得距离的最小值。因此,如果ti是一个点pi,那么

而如果ti是一段,那么

其中,‖∙‖表示欧几里得范数。很容易看出,这是Voronoi图对点的推广。

        在许多应用中,站点不相交的限制过于严格。通常,我们希望允许在其端点处接触的线段,甚至允许在其内部适当重叠或相交的线段(例如,见图1)。允许这样的配置会带来某些问题。更具体地说,当我们允许线段在其端点处接触时,我们可能会得到平分线是二维的线段对。如果我们允许成对的线段在它们的内部正确相交,它们的Voronoi细胞的内部就不再是简单连接的。在上述两种情况下,得到的Voronoi图不再是抽象Voronoi图的实例,这对相应Voronois图的有效计算具有直接影响。解决这些问题的方法是不将线性段视为一个对象,而是将其视为三个对象,即两个端点和内部。这种选择保证了Voronoi图中的所有平分线都是一维的,并且所有Voronois单元都是简单连接的。此外,我们根据输入数据集包含的相交对的类型,进一步区分两种情况。如果一对站点有一个公共点,并且该公共点不在两个站点中的任何一个的内部,则称为弱相交。如果一对站点相交,并且它们有多个公共点,或者它们的公共点位于两个站点中至少一个站点的内部,则称为强相交。正如稍后将看到的那样,这两种情况具有不同的表示(以及存储)要求,而且它们在如何评估谓词方面需要不同的处理方式。在区分了弱相交点和强相交点之后,并将分段点视为三个对象,我们现在可以精确定义我们计算的Delaunay图了。给定输入位点的集合S,设SA是S的排列a(S)中的点和(开)段的集合。CGAL的2D段Delaunay图包计算与集合SA中位点的欧几里得Voronoi图对偶的(三角化的)Delaunay图形。

        一旦我们有了线段Voronoi图,线段Delaunay图就是唯一确定的。如果所有的点都在一般位置,那么Delaunay图是一个远离点集凸包的具有三角形面的图。为了统一处理Delaunay图的方法,我们在有限点集中添加了一个虚构的无穷远点,我们称之为无穷远点。然后,我们可以将Delaunay图外部面的所有顶点连接到无穷远点上,这样我们得到一个所有面都是三角形的图。然而,Delaunay图并不是一个三角形化图,主要原因有:我们无法总是将它嵌入到平面上,使线段成为三角形化的一部分;此外,我们可能有两个面共享两条边,这在三角形化中是不允许的。

        在完成线段Delaunay图和线段Voronoi图的简要介绍后,我们再来讨论一下一般位置的概念。如果一组点不在任何三个三元组中具有相同的Voronoi圆周切线,那么这组点就处于一般位置。这个表述技术性较强,最好在点的情况下理解。对于点来说,等价的表述是:不存在两组三个点定义了相同的圆周,或者说,没有四个点共圆。上述关于一般位置的表述是关于点(更容易理解)的陈述的直接推广。相反,当点处于退化位置时,Delaunay图的边会形成超过三条边的面。我们可以简单地通过任意方式对相应的面进行三角剖分,从而得到Delaunay图的三角剖分版本。事实上,CGAL中实现的算法具有这样的特性:它始终返回一个有效的三角剖分的线段Delaunay图。有效意味着它包含实际的非三角剖分的Delaunay图,并且在面超过三条边的位置进行三角剖分。三角剖分的方式取决于在图中插入点的顺序。

        关于输入点和输出点的区别还有一点需要注意。输入点集由用户在图中插入的闭合点组成。由于线段被视为三个对象处理,因此我们的算法内部只看到点和开放线段。因此,从算法的角度来看,输入点没有实际意义。真正有意义的是与Voronoi图单元格相对应的点集,这就是输出点集。

1.2、退化维度 

        分段Delaunay图的维数一般为2。此规则的例外情况如下:

        如果分段Delaunay图不包含站点,则维度为−1。

        如果段Delaunay图恰好包含一个(输出)站点,则维度为0。

        维度为1是Delaunay图恰好包含两个(输出)站点的分段

2、软件设计

        2D段Delaunay图类Segment_Delaunay_graph_2<SegmentDelaunayGraphTraits_2,SegmentDelaunayGraphDataStructure_2>遵循CGAL的三角剖分包的的设计。它由两个参数进行说明:

        几何特性类。它提供了涉及算法的基本几何对象,如地点、点等。它还提供了用于计算段Delaunay图的几何谓词,以及一些基本构造,例如,用于可视化图表。段Delaunay图的几何特性将在下一节中详细讨论。

        段Delaunay图数据结构。这基本上与Apollonius图数据结构相同(在2D Apollonius图的软件设计一章中讨论),通过添加一些特定于段Voronoi图的附加操作进行增强。相应的概念是SegmentDelaunayGraphDataStructure_2,它实际上是ApolloniusGraphDataStructure_2概念的改进。类Triangulation_data_structure_2<Vb,Fb>是概念SegmentDelaunayGraphDataStructure_2的一个模型。为相应的模板参数提供默认值,因此用户不需要指定它。

2.1、强相交点及其表示

        如上所述,CGAL的分段Delaunay图包被设计为即使当输入分段位置相交时也支持分段Voronoi图的计算。这种选择对软件包的设计提出了某些问题。主要关注的是出现在这些位置排列中的子段的表示,因为排列中的位置是实际定义图表的位置。选择表示的一个直接结果是段Delaunay图计算中涉及的谓词的代数度,以及排列中子段和交叉点的存储要求。

        对于弱相交的点,不需要特殊处理。我们只需通过其坐标表示点,通过其端点表示线段。对于强相交的点,使用上述表示法的明显选择具有严重的缺点。考虑两个强相交的线段ti和tj,其端点具有大小为b的齐次坐标。它们的交点将具有大小为6b+O(1)的齐次坐标。这种效应可以级联,这意味着在插入k个(输入)线段后,我们可以得到交点,其位大小是指数于k的,即它们的齐次坐标将具有大小为Ω(2kb)的位大小。不仅交点,而且相邻的子线段也将由任意高位的数量表示,因此我们无法给出交点坐标位大小的界限。因此,我们无法给出存储这些坐标所需的内存的界限。同样重要的是,我们也不能给出用于评估谓词的代数表达式的代数度的界限。

        这种行为显然是不可取的。为了稳健性、效率和可扩展性,谓词中的代数表达式的位大小不应依赖于输入大小。因此,以及下面将要讨论的其他原因,我们决定以隐式方式表示点,这种方式以某种方式编码了它们的构造历史。特别是,我们利用了这样一个事实:交点始终位于两个输入线段上,而那些不是输入部分的线段始终由输入线段支撑。

        例如,让我们考虑图2中的配置。我们假设线段ti=piqi,i=1,2,3,按顺序插入。在插入t2后,我们的算法将把线段t1分割成子线段p1s1和s1q1,然后添加s1,最后插入子线段p2s1和s1q2。我们如何表示这五个新点?s1将由其两个定义线段t1和t2表示。线段p1s1将由两个线段、一个点和布尔值表示。第一个线段是t1,它始终是与新创建的线段具有相同支撑的线段。第二个线段是t2,点是p1。布尔值指示p1s1的第一个端点是否为输入点;在这种情况下,布尔值等于true。线段s1q1也将由两个线段、一个点和布尔值表示,即t1(s1q1的支撑线段)、t2和false(它是s1q1的第二个端点,输入点)。子线段p2s1和s1q2的表示方式相同。现在考虑插入t3时的情况。点s2将再次由两个线段表示,但不是s1q1和t3。事实上,它将由t1(s1q1的支撑线段)和t3表示。s2q1将由两个线段、一个点和布尔值(t1、t3、q1和false)表示,p3s2和s2q3的表示方式也相同。另一方面,s1s2的两个端点都是非输入点。在这种情况下,我们用三条输入线段来表示该线段。更准确地说,s1s2由线段t1(s1q1的支撑线段)、t2(与t1一起定义s1)和t3(与t1一起定义s2)表示。

点s1由四个点p1、q1、p2和q2表示。线段p1s1由点p1、q1、p2、q2和一个布尔值表示,该布尔值设置为true以指示第一个端点不是交点。线段s1s2由六个点:p1、q1、p2、q2、p3和q3表示。图中其余非输入的点和线段以类似的方式表示。 

         这五种不同的表示方法(两种表示点:坐标;两个输入线段)和三种表示线段的方法(两个输入点;两个输入线段、一个输入点和布尔值;三条输入线段)形成了一个封闭的表示集,因此可以表示任何交点或子线段,而无论输入线段的数量如何。此外,每个点(输入或交点)都具有位数为3b+O(1)的同位坐标。线段的支撑线(它们在某些谓词中是必需的)的系数始终为2b+O(1)。因此,谓词中涉及的表达式的大小始终为O(b),与输入的大小无关。SegmentDelaunayGraphSite_2概念封装了上述思想。在该概念中,一个站点由最多四个点和布尔值表示,或最多六个点表示,具体取决于其类型。类Segment_Delaunay_graph_site_2<K>实现了这一概念。

        然而,这种表示方法仍然存在一定程度的冗余。一个线段的端点同时出现在开放线段站点的表示以及点站点的表示中。在强交叉站点存在的情况下,情况会变得更糟:一个点可能出现在多个子线段和/或交点的表示中。为了避免这种冗余,输入点被存储在容器中,而各种类型的站点(输入点和线段、交点、以一个或两个交点作为端点的子线段)仅存储对容器中点的句柄。这是通过Segment_Delaunay_graph_storage_site_2<Gt>类实现的,该类是相应概念的模型:SegmentDelaunayGraphStorageSite_2。这个概念强制一个站点最多由6个句柄(相对较轻的对象)而不是6个点来表示,这些点与句柄相比显然是非常重的对象。

2.2、优化内存分配

        在某些应用中,我们事先知道输入只包含弱相交的站点。在这些情况下,上述站点表示在我们的实现中带来了巨大的内存开销:我们要求站点存储六个点(分别存储六个手柄),而不是用最多两个点(或最终用两个手柄)来表示站点。为了避免这种开销,我们引入了两个系列的特征类:

        一个支持完整站点,并且适合输入由强相交站点组成的情况。该系列由Segment_Delaunay_graph_traits_2<K,MTag> 和 Segment_Delaunay_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM> 类组成。

        一个为仅包含弱相交点的输入定制的类。该系列由 Segment_Delaunay_graph_traits_without_intersections_2<K,MTag> 和 Segment_Delaunay_graph_filtered_traits_without_intersections_2<CK,CM,EK,EM,FK,FM> 类组成。

        具有不同特征类的优点如下:      

        当用户选择使用第二个系列中的特征类之一时,我们每个站点只存储两个句柄。这意味着与第一个系列特征类相比,每个站点分配的内存减少了三倍。

        在第一系列特征类的情况下,我们可以更好地利用具有强相交位点的知识,以便在谓词评估期间进一步应用几何过滤器(见下文)。相反,如果使用第二系列特征类,我们可以避免仅在强相交位点的情况下才有意义的几何过滤测试。

3、几何特征

        计算分段沃罗诺伊图所需的谓词相当复杂。本文的目的不是详细讨论它们。感兴趣的读者可以参考Burnikel的论文,其中表明,在位大小为b的齐次坐标表示的弱相交站点的情况下,谓词中涉及的代数表达式的最大位大小为40b+O(1)。根据我们上面给出的站点表示,我们可以保证,即使在强相交站点的情况下,谓词的代数次数仍为O(b),与输入的大小无关。我们想在本节剩下的部分中重点介绍我们在实现中采用的不同类型的过滤技术。

3.1、几何滤波

        我们对于站点的表示非常自然地与我们所称的几何过滤相结合。该技术相当于利用我们的数据表示以及我们问题中固有的几何结构来执行简单的几何测试,以评估看似退化的配置中的谓词。几何过滤可以被看作是执行算术过滤之前的预处理步骤。粗略地说,通过算术过滤,我们意味着我们首先尝试使用固定精度浮点数类型(如double)来评估谓词,同时保持我们执行的计算的数值误差的误差界限。如果数值误差太大,不允许我们评估谓词,我们切换到精确数字类型,并重复谓词的评估。几何过滤可以通过消除算术过滤失败的情况来帮助我们,从而减少我们使用精确算术评估谓词的次数。

        为了说明这种方法的应用和有效性,让我们考虑一个非常简单的示例用法。假设我们想要确定两个非输入点是否相同(我们在这里假设输入点由双精度表示)。为了做到这一点,我们需要计算它们的坐标并进行比较。如果这两个点是相同的,那么使用双精度算法来回答我们的问题可能是错误的(由于数值错误),在这种情况下,我们将不得不进行更昂贵的精确计算。相反,在测试坐标是否相等之前,我们可以使用点的表示来潜在地回答这个问题。更具体地说,这是计算的几何滤波部分,我们可以首先测试两个点的定义段是否相同。如果不是,那么我们继续像往常一样比较它们的坐标。测试定义段的相等性不涉及对输入的任何算术运算,而只涉及对双精度的比较。通过执行这个非常简单的测试,我们避免了在计算Delaunay图时可能需要进行数千次数值困难的计算。

        我们在SegmentDelaunayGraphTraits_2概念的所有模型中都实现了几何过滤。这些模型是类:Segment_Delaunay_graph_traits_2<K,MTag>, Segment_Delaunay_graph_traits_without_intersections_2<K,MTag>, Segment_Delaunay_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>和Segment_Delaunay_graph_filtered_traits_without_intersections_2<CK,CM,EK,EM,FK,FM>

3.2、算数滤波

        如上所述,使用精确算法进行计算的成本可能非常高。因此,我们投入了大量精力,通过特殊的特征类 Segment_Delaunay_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM> 和 Segment_Delaunay_graph_filtered_traits_without_intersections_2<CK,CM,EK,EM,FK,FM> 实现了算术滤波机制。这两个特征类采用 Filtered_predicate<EP,FP> 机制,用户最多可以定义三个不同的内核 CK、FK 和 EK(大多数参数都提供了默认值):第一个内核 CK 仅用于构造。第二个内核 FK 是滤波内核:特征类将尝试使用此内核计算谓词。如果滤波内核无法成功计算谓词,将使用精确内核 EK。

        让我们再次考虑类 Segment_Delaunay_graph_traits_2<K,MTag>。模板参数 MTag 为用户提供了另一个自由度,用户可以指示在谓词求值中使用的算术运算类型。更具体地说,MTag 可以是 Field_with_sqrt_tag,在这种情况下,谓词将使用所有四种基本算术运算加上平方根进行求值;当然,这要求内核 K 中使用的数字类型完全支持这些运算。或者,MTag 可以是 Field_tag,这表明我们希望谓词仅使用四种基本算术运算进行计算。同样,为了正确计算谓词,内核 K 中使用的数字类型必须完全支持相应的运算。

        Segment_Delaunay_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>和Segment_Delaunay_graph_filtered_traits_without_intersections_2<CK,CM,EK,EM,FK,FM>类中模板参数CM、FM和EM的语义是相似的。通过这些模板参数,我们可以控制将在涉及每个相应内核CK、FK和EK的计算中使用的算术运算类型。当使用Segment_Delaunay_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>时,CM、FM和EM的可能值是Field_with_sqrt_tag和Field_tag,而如果使用Segment_Delaunay_graph_filtered_traits_without_intersections_2<CK,CM,EK,EM,FK,FM>类,则可能值为Field_with_sqrt_tag和Euclidean_ring_tag。

4、分段Delaunay图层次

        类Segment_Delaunay_graph_hierarchy_2<SegmentDelaunayGraphTraits_2, SegmentDelaunayGraphStorageTraits_2, SSTag, SegmentDelaunayGraphDataStructure_2>是Triangulation_hierarchy_2或Apollonius_graph_hierarchy_2类的类似物,应用于段Delaunay图。它由以类似于Delaunay层次的方式构建的段Delaunay图的层次结构组成。与三角剖分层次或Apollonius图层次不同,这里的情况更复杂,

        原因有两个因素:首先,段被视为三个对象而不是一个(段的两个端点和内部的段),其次,强相交点的存在大大复杂化了层次的构建方式。感兴趣的读者可以参考Karavelas[4]的论文了解层次构建的细节。

        另一种选择是具有由段Delaunay图构成的最底层和所有其他级别的点Voronoi图构成的混合层次。这种选择在实践中似乎效果很好,主要是因为它避免了在层次的上层维护段Delaunay图的开销。

        然而,与所有级别的段Delaunay图(参见[4])相比,似乎不太可能为其性能提供任何理论保证。用户可以通过模板参数SSTag选择两种类型的层次结构中的任何一种。如果SSTag被设置为false(这也是默认值),则层次的上层由点Delaunay图组成。如果SSTag被设置为true,则在层次的各个级别都有段Delaunay图。

        类Segment_Delaunay_graph_hierarchy_2<SegmentDelaunayGraph Traits_2, SegmentDelaunayGraphStorage Traits_2, SSTag, SegmentDelaunayGraphDataStructure_2>具有与Segment_Delaunay_graph_2<SegmentDelaunayGraph Traits_2,SegmentDelaunayGraphStorage Traits_2,SegmentDelaunayGraphDataStructure_2>类完全相同的接口和功能。使用分片Delaunay图层次结构在保持层次结构方面需要额外的空间和时间成本。我们的实验表明,使用层次结构输入超过约1000个站点通常是有益的。

5、其他

        Voronoi图:也被称为泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。在一个平面上的N个有区别的点,按照最邻近原则划分平面,每个点与它的最近邻区域相关联。Voronoi图的边是点集中某对点的中垂线的一个线段或者射线。

        Delaunay三角剖分:Delaunay三角剖分是由与相邻Voronoi多边形共享一条边的相关点连接而成的三角形。Delaunay三角剖分的特征包括:三角网的外边界构成了点集P的凸多边形“外壳”;没有任何点在三角形的外接圆内部,反之,如果一个三角网满足此条件,那么它就是Delaunay三角网;将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大,从这个意义上讲,Delaunay三角网是“最接近于规则化的”的三角网。

        Delaunay图和Voronoi图的对偶关系:Voronoi图的一个顶点同时属于三个Voronoi多边形,每个Voronoi多边形内有且仅有一个节点(种子点)。连接三个共点的Voronoi多边形分别对应的三个节点则形成一个Delaunay三角形,所有这样的三角形的集合就是著名的Delaunay三角剖分。

        对偶在数学和计算机科学中是一个重要的概念,尤其在计算几何和图算法中。对偶图或对偶表示是原图的一种等价表示形式,其中图的边的角色和顶点的角色互换。在图形理论和对偶理论中,如果一个图形或问题的特性可以从一个表示形式转到另一个表示形式仍然保持不变,则称之为对偶。

        在Delaunay三角剖分和Voronoi图的上下文中,Delaunay三角剖分和Voronoi图是互为对偶的。Voronoi图是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成,而Delaunay三角剖分是由与相邻Voronoi多边形共享一条边的相关点连接而成的三角形。因此,Voronoi图的每条边对应于Delaunay三角剖分中的一个三角形,而Delaunay三角剖分中的每个三角形对应于Voronoi图中的一个多边形。这种对偶关系使得在处理这两种图形时可以相互转换思路和方法,从而简化问题并提高算法的效率。

        Voronoi图的强相交和弱相交是两种不同的相交状态。

        在Voronoi图中,两个Voronoi边如果共享一个顶点,那么它们就处于强相交状态。在这个状态下,两个Voronoi边的交点是它们各自的Voronoi顶点,且交点处两边的斜率互为负倒数。

        而弱相交则发生在两个Voronoi边之间没有公共顶点,但它们在延长后会在无穷远处相交。在这种情况下,两个Voronoi边的交点是它们的延长线在无穷远处的交点,这个交点被称为Voronoi图的无穷远Voronoi顶点。

        分段Delaunay图是一种特殊的Delaunay三角剖分,它允许在某些条件下对Delaunay三角形的边进行修改,以满足特定的需求。

        在Delaunay三角剖分中,每个三角形都满足空圆性质,即三角形的外接圆不包含其他点。然而,在一些应用中,可能需要修改某些三角形以满足特定的条件或约束。分段Delaunay图允许对Delaunay三角形的边进行修改,以满足这些条件或约束。

        分段Delaunay图的应用非常广泛,例如在地理信息系统、计算机图形学、机器人学等领域中都有应用。它可以用于生成更加符合特定需求的三角形网格,例如在地图制作中生成更加准确的地图网格,或者在机器人路径规划中生成更加平滑的路径。

        总之,分段Delaunay图是一种特殊的Delaunay三角剖分,它允许对Delaunay三角形的边进行修改以满足特定的条件或约束。这种三角形网格在许多领域中都有广泛的应用。

        线段Voronoi和Voronoi图在几何学中都是重要的概念,但它们有一些关键的区别。

        定义线段Voronoi:这是一种特殊类型的Voronoi图,其中生成元(seed points)是线段而非点。在这种情况下,Voronoi区域是围绕线段而非点形成的。Voronoi图:也被称为Dirichlet图或泰森多边形,它是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。在Voronoi图中,每个多边形代表一个生成元(可以是点、线段等),并且每个多边形的区域只包含该生成元。

        性质线段Voronoi:由于其生成元是线段,线段Voronoi具有一些独特的性质。例如,两个相邻的线段Voronoi区域在边界处共享一条线段,而不是一个点。Voronoi图:这是一个更通用的概念,可以应用于任何类型的生成元。它的一些主要性质包括每个区域只包含一个生成元,以及每个点到最近的生成元的距离最短。

        应用线段Voronoi:在一些特定的应用中,如障碍物回避或路径规划,线段Voronoi可以提供有用的信息。例如,在机器人路径规划中,如果已知一系列障碍物由线段表示,那么使用线段Voronoi可以帮助确定安全路径。Voronoi图:由于其通用性和灵活性,Voronoi图在许多领域都有广泛应用,如地理信息系统、计算机图形学、材料科学和化学等。

        构建过程线段Voronoi:构建线段Voronoi需要一些特殊的算法和技术,因为其生成元是线段而不是点。构建过程可能涉及对线段的特殊处理和操作。Voronoi图:构建过程通常包括确定输入的生成元集合,然后通过连接生成元来形成多边形。构建Voronoi图的核心是找到每个生成元与其相邻生成元之间的关系。

        总之,线段Voronoi和Voronoi图在定义、性质、应用和构建过程方面存在差异。线段Voronoi是一个特殊类型的Voronoi图,其生成元是线段,而Voronoi图是一个更通用的概念,可以应用于各种类型的生成元。

        线段Delaunay和Delaunay图在几何学中是两个相关的概念,但它们有一些重要的区别。

        定义线段Delaunay:这是二维空间中一组线段的集合,这些线段满足Delaunay三角剖分的空圆特性,即每个线段都不能与其它线段相交,并且每个线段的外部圆都不包含其他线段的端点。Delaunay图:这是基于给定点集的Delaunay三角剖分所形成的图。换句话说,它是一个平面图,其中每个三角形都满足Delaunay三角剖分的空圆特性。

        性质线段Delaunay:由于线段Delaunay仅关注线段,所以它特别关注线段之间的关系,如相交或非相交。Delaunay图:这是一个更广泛的几何结构,不仅限于线段,而是涵盖了更广泛的几何对象。它关注的是在给定点集上形成三角形,并确保这些三角形满足空圆特性。

        应用线段Delaunay:在几何和计算几何中,线段Delaunay经常用于解决与线段集合相关的问题,例如计算交点、查找最近的线段等。Delaunay图:由于其广泛的应用范围和灵活性,Delaunay图在许多领域都有应用,如计算机图形学、地理信息系统、计算生物学等。

        实现线段Delaunay:在实现时,可能需要考虑如何处理线段的相交和不相交情况。Delaunay图:构建Delaunay图通常涉及一系列算法,如分治法、三角测量等。

        简而言之,线段Delaunay更关注线段之间的关系,而Delaunay图是一个更广泛的几何结构,可以包含各种类型的对象。

CGAL 5.6 - 2D Segment Delaunay Graphs: User Manual

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/372157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Shell的运行原理以及Linux当中的权限问题】

Shell的运行原理以及Linux当中的权限问题 Shell的运行原理Linux当中的权限问题Linux权限的概念如何实现用户账号之间的切换如何仅提升当前指令的权限如何将普通用户添加到信任列表 Linux权限管理文件访问者的分类 (人)文件类型和访问权限 (事物属性)文件权限值的表示方法文件访…

MacOS系统电脑远程桌面控制windows系统电脑【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1…

自动化测试的ROI

ROI模型树 提升ROI的基础出发点&#xff1a;增加运行次数 手段&#xff1a;测试左移、测试右移 测试左移&#xff08;测试阶段&#xff09; 原始测试流程&#xff1a; 软件生命周期&#xff1a;软件需求分析、软件设计、软件开发、单元测试、集成测试、系统测试开发阶段&…

ideaIU-2023.2.1安装教程

ideaIU-2023.2.1安装教程 一、ideaIU-2023.2.1安装1.1 下载IdeaIU-2023.2.1安装包1.2 安装ideaIU-2023.2.1 二、ideaIU-2023.2.1激活 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、ideaIU-2023.2.1安装 1.1 下载IdeaIU-2023.2.1安装包…

import blind_watermark ModuleNotFoundError: No module named ‘blind_watermark‘

Traceback (most recent call last): File "d:\python\PYTHON_VSCOD\demo.py", line 1, in <module> import blind_watermark ModuleNotFoundError: No module named blind_watermark 如何选择正确的解释器 在 Visual Studio Code (VS Code) 中更改 Python 解释…

5.0 HDFS 集群服务建立教程

HDFS 集群是建立在 Hadoop 集群之上的&#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程&#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群、不同的计…

YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv5网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cate…

多线程生命周期与通信(二)通信

线程自启动时&#xff0c;就拥有了自己的栈空间。然后会一直运行直到结束。多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度&#xff0c;如果线程仅仅是孤零零的执行&#xff0c;不同的逻辑业务就不能最终汇聚成一个完整的业务那么多线程也就失去了意…

Windows10安装PCL1.14.0及点云配准

一、下载visual studio2022 下载网址&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择"使用C的桌面开发“&#xff0c;同时可以修改文件路径&#xff0c;可以放在D盘。修改文件路径的时候&#xff0c;共享组件、…

Web APIs 2 事件

Web APIs 2 事件 事件监听案例&#xff1a;广告关闭案例&#xff1a;随机问答 事件监听版本事件类型案例&#xff1a;轮播图完整焦点事件键盘事件输入事件案例&#xff1a;评论字数统计 事件对象获取事件对象事件对象常用属性案例&#xff1a;评论回车发布 环境对象this回调函数…

电脑怎么扫描纸质文件?6步轻松完成扫描!

“由于工作的需要&#xff0c;我要将部分纸质文件扫描到电脑上&#xff0c;不知道应该怎么操作会更方便呢&#xff1f;希望大家给我出出主意。” 随着科技的进步&#xff0c;电脑已经成为了我们日常生活和工作中不可或缺的工具。除了传统的文字处理和数据处理&#xff0c;电脑还…

【漏洞库】O2OA系统

O2OA invoke 后台远程命令执行漏洞 CNVD-2020-18740 漏洞描述 O2OA是一款开源免费的企业及团队办公平台,提供门户管理、流程管理、信息管理、数据管理四大平台,集工作汇报、项目协作、移动OA、文档分享、流程审批、数据协作等众多功能,满足企业各类管理和协作需求。 O2OA系…

拍摄的视频怎么做二维码?视频在线转二维码的技巧

现在学校经常会将学生日常的拍摄的短片做成二维码之后展示给其他人&#xff0c;其他人可以通过扫描二维码来查看个人表现的视频&#xff0c;有些活动视频也会用视频二维码的方式来传播。那么视频二维码制作的方法及步骤是什么样的呢&#xff1f;下面就让小编通过本文来给大家介…

力扣 121. 买卖股票的最佳时机

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了&#xff0c;啥啥都忘了 C题解1&#xff1a;贪心算法。&#xff08;来源代码随想录&#xff09; 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取…

读写锁ReentrantReadWriteLockStampLock详解

传送门&#xff1a;深入理解AQS独占锁之ReentrantLock源码分析 目录 读写锁介绍 ReentrantReadWriteLock介绍 ReentrantReadWriteLock的使用 应用场景 锁降级 读写锁设计思路 StampedLock介绍 StampedLock的使用 演示乐观读 在缓存中的应用 使用场景和注意事…

033-安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

033-安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访问控制 #知识点&#xff1a; 1、JavaEE-JDBC-SQL预编译 2、JavaEE-HTTP-Filter过滤器 3、JavaEE-对象域-Listen监听器 演示案例&#xff1a; ➢JavaEE-预编译-SQL ➢JavaEE-过滤器-Filter ➢…

python Cloudflare 批量关闭IPv6兼容性脚本

Cloudflare免费版控制台不给关IPv6&#xff0c;需要使用API关闭&#xff0c;先从我的个人资料里面申请API令牌&#xff0c;再执行脚本 import requests import jsonheaders {X-Auth-Email:cloudflare登入账户, #输入登入账户的邮箱X-Auth-Key: Global API Key, #输入上图申请…

计算机自顶向下 Wireshark labs——DNS

如本文第2.4节所述&#xff0c;域名系统(DNS)将主机名转换为IP地址&#xff0c;在互联网基础设施中发挥着关键作用。在本实验中&#xff0c;我们将仔细研究DNS的客户端。回想一下&#xff0c;客户端在DNS中的角色相对简单—客户端向其本地DNS服务器发送查询&#xff0c;并收到响…

探索设计模式的魅力:从单一继承到组合模式-软件设计的演变与未来

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时&#xff0c;我们如何优雅地处理单个对象与组合对象的一致性问题&#xff1f;组合模式&#xff08;Composite Pattern&#xff09;为此提供了一种简洁高效的解决方案。通过本…

使用 PyTorch 构建 NLP 聊天机器人

一、说明 聊天机器人提供自动对话&#xff0c;可以帮助用户完成任务或寻求信息。随着深度学习的最新进展&#xff0c;聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人&#xff0c;涵盖模型架构、数据准备、训练循环…
最新文章