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

螺旋三角剖分

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

  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

 

转载请注明出处,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值