凸包问题的分治算法_凸包问题——快速凸包算法

本文介绍了三维空间中的快速凸包算法,基于Beneath Beyond理论,详细阐述了算法的基本思想、步骤和实现。算法从四个点初始化四面体,通过不断选择距离现有面最远的点,构建和更新凸包。平均复杂度为O(n log h),其中n为点的数量,h为凸包的顶点数。同时,文章提供了算法的源码实现和相关参考资料。
摘要由CSDN通过智能技术生成

192f1100783f6bca0115bf640532058d.png

快速凸包算法也可以看成是增量算法的一种变种,与随机增量算法相比,它们的不同就在于每次迭代从面的外部点集中选择的点不同。随机增量算法从外部点集中随机的选择一个点,但是快速凸包算法是选择距离最远的一个点,著名的开源代码Qhull[1]、 CGAL[2]都有快速凸包算法的C++实现。本篇文章介绍三维的快速凸包算法的原理和实现。

基本思想

在介绍快速三维凸包算法前,先介绍算法中会频繁使用到的两个基本的几何操作:

  1. 给定3个三维空间上的点,确定一个平面。

平面可以用方程

equation?tex=%5Cvec%7Bn%7D%5Ccdot+P%2Bd%3D0表示,设3个点分别是
equation?tex=%5C%7B%7B%7Bv%7D_%7B0%7D%7D%2C%7B%7Bv%7D_%7B1%7D%7D%2C%7B%7Bv%7D_%7B2%7D%7D%5C%7D,则有
equation?tex=%5Cvec%7Bn%7D%3D%28%7B%7Bv%7D_%7B1%7D%7D-%7B%7Bv%7D_%7B0%7D%7D%29%5Ctimes+%28%7B%7Bv%7D_%7B2%7D%7D-%7B%7Bv%7D_%7B0%7D%7D%29
equation?tex=d%3D-%5Cvec%7Bn%7D%5Ccdot+%7B%7Bv%7D_%7B0%7D%7D,叉积的顺序影响法向量的方向,若
equation?tex=%5Cvec%7Bn%7D是零向量,说明
equation?tex=%7B%7Bv%7D_%7B0%7D%7D%2C%7B%7Bv%7D_%7B1%7D%7D%2C%7B%7Bv%7D_%7B2%7D%7D三点共线。

2. 计算三维空间上的点到平面的有符号距离。

设三维点为

equation?tex=P,平面为
equation?tex=%5CGamma+%3A%5Cvec%7Bn%7D%5Ccdot+P%2Bd%3D0,那么点
equation?tex=P到平面
equation?tex=%5CGamma+的有符号距离表示为
equation?tex=dist%28P%29%3D%28%5Cvec%7Bn%7D%5Ccdot+P%2Bd%29%2F%5Cleft%5C%7C+%7B%5Cvec%7Bn%7D%7D+%5Cright%5C%7C。若
equation?tex=dist%28P%29%5Csucc+0,称点P在平面上方(Above the Plane);若
equation?tex=dist%28P%29%5Cprec+0,称点P在平面下方(Below the Plane);若
equation?tex=dist%28P%29%5Ctext%7B%3D%7D0,称点P在平面上(On the Plane)。

快速凸包算法是基于Beneath Beyond理论,增量算法也同样基于该理论,该理论如下所示,这里只考虑三维空间下的凸包:

equation?tex=H是一个
equation?tex=%7B%7BR%7D%5E%7B3%7D%7D空间上的凸包,
equation?tex=p
equation?tex=%7B%7BR%7D%5E%7B3%7D%7D-H上的一个点。
equation?tex=F是凸包
equation?tex=conv%28p%5Cbigcup+H%29上的面,当且仅当
  • equation?tex=F是凸包
    equation?tex=H的一个面且点
    equation?tex=p在面
    equation?tex=F的下方;
  • equation?tex=F不是凸包
    equation?tex=H的一个面,
    equation?tex=F是由凸包
    equation?tex=H的边和点
    equation?tex=p构成,点
    equation?tex=p在该边相邻的一个面的上方,在该边相邻的另一个面的下方。

若点

equation?tex=p
equation?tex=H内,则
equation?tex=conv%28p%5Cbigcup+H%29
equation?tex=H重合,显然,结论成立;若点
equation?tex=p
equation?tex=H外,分为两种情况,以图1所示为例,
equation?tex=H是由极点
equation?tex=%5C%7B%7B%7Bp%7D_%7B0%7D%7D%2C%7B%7Bp%7D_%7B1%7D%7D%2C%7B%7Bp%7D_%7B2%7D%7D%2C%7B%7Bp%7D_%7B3%7D%7D%2C%7B%7Bp%7D_%7B4%7D%7D%2C%7B%7Bp%7D_%7B5%7D%7D%5C%7D构成的凸包,
equation?tex=conv%28p%5Cbigcup+H%29是由极点
equation?tex=%5C%7Bp%2C%7B%7Bp%7D_%7B0%7D%7D%2C%7B%7Bp%7D_%7B1%7D%7D%2C%7B%7Bp%7D_%7B2%7D%7D%2C%7B%7Bp%7D_%7B4%7D%7D%2C%7B%7Bp%7D_%7B5%7D%7D%5C%7D构成的凸包。对于凸包
equation?tex=H来说,点
equation?tex=p在三角形面片
equation?tex=%5CDelta+%7B%7Bp%7D_%7B0%7D%7D%7B%7Bp%7D_%7B4%7D%7D%7B%7Bp%7D_%7B3%7D%7D,
equation?tex=%5CDelta+%7B%7Bp%7D_%7B0%7D%7D%7B%7Bp%7D_%7B3%7D%7D%7B%7Bp%7D_%7B5%7D%7D,
equation?tex=%5CDelta+%7B%7Bp%7D_%7B2%7D%7D%7B%7Bp%7D_%7B3%7D%7D%7B%7Bp%7D_%7B4%7D%7D,
equation?tex=%5CDelta+%7B%7Bp%7D_%7B2%7D%7D%7B%7Bp%7D_%7B5%7D%7D%7B%7Bp%7D_%7B3%7D%7D的上方,点
equation?tex=p在三角形面片
equation?tex=%5CDelta+%7B%7Bp%7D_%7B0%7D%7D%7B%7Bp%7D_%7B1%7D%7D%7B%7Bp%7D_%7B4%7D%7D,
equation?tex=%5CDelta+%7B%7Bp%7D_%7B0%7D%7D%7B%7Bp%7D_%7B5%7D%7D%7B%7Bp%7D_%7B1%7D%7D,
equation?tex=%5CDelta+%7B%7Bp%7D_%7B2%7D%7D%7B%7Bp%7D_%7B4%7D%7D%7B%7Bp%7D_%7B1%7D%7D,
equation?tex=%5CDelta+%7B%7Bp%7D_%7B2%7D%7D%7B%7Bp%7D_%7B1%7D%7D%7B%7Bp%7D_%7B5%7D%7D的下方,因此在边
equation?tex=%5Coverline%7B%7B%7Bp%7D_%7B2%7D%7D%7B%7Bp%7D_%7B4%7D%7D%7D,
equation?tex=%5Coverline%7B%7B%7Bp%7D_%7B4%7D%7D%7B%7Bp%7D_%7B0%7D%7D%7D,
equation?tex=%5Coverline%7B%7B%7Bp%7D_%7B0%7D%7D%7B%7Bp%7D_%7B5%7D%7D%7D,
equation?tex=%5Coverline%7B%7B%7Bp%7D_%7B5%7D%7D%7B%7Bp%7D_%7B2%7D%7D%7D一侧的面片是在点
equation?tex=p的上方,另一侧的面片在点
equation?tex=p的下方,我们称这样的边为临界边。当一个面
equation?tex=F
equation?tex=conv%28p%5Cbigcup+H%29上时,若点
equation?tex=p在面
equation?tex=F的下方,则
equation?tex=F
equation?tex=H的一个面,否则,它是由点
equation?tex=p与临界边构成的面片。

ff9d491ff5ef620625369adbf0ab9c14.png
图1. 计算点P与H构成的凸包

快速凸包算法的伪码如下所示

用快速凸包算法求三维空间上的点集

equation?tex=S%3D%5C%7B%7B%7Bp%7D_%7B0%7D%7D%2C%7B%7Bp%7D_%7B1%7D%7D%2C...%2C%7B%7Bp%7D_%7Bn-1%7D%7D%5C%7D的凸包
  1. 初始化一个由四个点构成的四面体;
  2. for 四面体的每个面
    equation?tex=F
  3.     for 点集中的每个未被分配的点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值