旋转卡壳——螺旋三角剖分

来源:互联网 发布:手机淘宝怎么退货申请 编辑:程序博客网 时间:2024/04/28 12:53

螺旋三角剖分

点集的螺旋三角剖分是基于集合螺旋凸包的三角剖分图。
凸螺旋线可以通过如下方法构造:

  1. 从一个特定的端点开始(比如给定方向上的最小点), 这里取有最小 x 坐标的点。
  2. 通过那个点构造一条铅垂线。
  3. 按照一个给定的方向旋转线(总保持顺时针或者是逆时针方向), 直到线“击” 出另一个顶点。
  4. 将两个点用一条线段连接。
  5. 重复步骤3和步骤4, 但是总忽略已经击出的点。

大体上, 这个过程类似于计算凸包的卷包裹算法, 但是不同在于其循环永远不会停止。 对于一个凸包上有 h 个点的点集, 存在 2h 个凸螺旋线: 对于每个起点有顺时针和逆时针螺旋线两种。 
 

一个点集(左边), 及其顺时针凸螺旋线, 以最小的 x 坐标点作为初始点。


有趣的是, 一个点集的凸螺旋线和洋葱皮可以在线性时间内相互转换。 进一步的, 类似于洋葱三角剖分, 我们可以定义一个点集的子图为凸螺旋线的螺旋三角剖分。

构造螺旋三角剖分的算法, 虽然是基于环面三角剖分的, 但是却更为复杂, 因为螺旋线必须被分割为合适的凸包链。 假设输入是一个点集的顺时针凸螺旋线 C , 且有 C = { p1 , ... , pn } 。

  1. 将凸螺旋线的边作为三角剖分的边插入。
  2. p1 开始, 寻找点集凸螺旋线上的最后一个点 ph
  3. 延长凸螺旋线上的最后一条边 [p(n-1),pn] 直到其与凸螺旋线相交。 标记交点为 q'
  4. 构造与 C 切于点 q' 的切线。 逆时针旋转那条线直到他与 C 相交于一点 q 并且平行于 [p(n-1),pn] 。
  5. 将 [p(n-1),q] 插入三角剖分中。
  6. 此操作后将凸螺旋链分割称了两个部分: 链外的部分和链内的多边形区域。 设 Co = { p1 , ... , q } 且 Ci = { ph , ... , q , ... , pn } 。 这个构造过程如下图所示:
     

    左上角: 构造过程。 右上角: 螺旋外和内部的多边形区域。 底部: 外部和内部的凸链 CoCi


  7. 外部螺旋区域可以如环面一样进行三角剖分。 CoCi 此时可以被看成一个嵌套凸包。
  8. 内部的多边形区域可以很容易的在 pn 处星型划分形成三角剖分。
  9. 这两个三角剖分的组合构成了整个螺旋三角剖分的结构。

一个螺旋凸包的例子和其三角剖分如下所示:

 

上述的算法是线性时间复杂度的, 算法的时间依赖于环面剖分的运行时间。

 

 

原文地址:http://cgm.cs.mcgill.ca/~orm/sptri.html

 

转载请注明出处,谢谢!

原创粉丝点击