三维的凸包构建

三维的情况比二维的要复杂很多,具体实现的时候也是有很多的困难。今天就简单的介绍一种求解三维凸包的算法。

incremental algorithm:这种算法的特点是简单,容易实现,大家同意接受。算法的大概流程是构造一个由四个顶点组成的初始凸包,然后逐步的添加点形成新的凸包。关键就是如何添加新的点。如果点在凸包内,则放弃这个点;如果在凸包外,就寻找和凸包相切的平面,这个平面由凸包上的边和新加的点构成。和二维的情况不一样的地方是在,二维要求的是相切的线,而在三维情况下求得是相切的平面。上述的描述中有几个问题:1如何判断点在凸包外?2怎样寻找和凸包相切的平面?

1.判断点在凸包的外面或里面,可以使用计算体积的方法。当然这个体积的计算和平常是不一样的,需要考虑到方向。其实也就是进行left-of-triangle测试。

2.从新添加的点p看凸包的上平面,要么是可见的,要么是不可见。可见的意思就好像你的眼睛在p处,凸包是不透明的,在p可以完整看到的。于是找到相切的平面其实就是要找到一条边,和这条边相邻的两个三角形面,一个是可见的,一个是不可见的。这个寻找同样可以使用上面1的方法。

上面的描述就是算法的大概意思,如有不明白的,可以去看书computational geometry in c。

 

还要讲一下这个算法的改进:

上述方法在判断一个点是不是在凸包内的时候,需要对全部外点进行判断。选取切面的时候,同样要判断大部分的曲面。于是一个简单的想法就是可不可以简化呢?一般这种情况下是要牺牲空间的,就是要开辟新的存储来保存部分信息。

Randomized incremental algorithm:这个方法中保存了一个由两部分组成的一个结构,叫conflict graph。一部分是对于凸包的上的面而言,要保存可以看到它的那些点;另一部分是对于每个外面的点而言,要保存它能看到的所有的面。于是选择一个点进行添加,由于对于每个点可见的平面有记录,于是这时寻找边界的边变的容易。和上面不一样的工作就是如何更新conflict graph。1删除不在凸包上的面,这个很简单,只要将p可以看到的面直接删除就行了。2添加新出现的面得信息,这个是难点。存在一个引理,如一个点可以看到新添加的面,于是它一定能看到和这个面有共同边的在原来凸包上的那两个面(或其中的一个)。大家可以想想如何证明?于是对于新添加的面而言,只要先找到那些可以看到原来那两个面的点,然后在这些点中进行判断即可。而能看到那两个面的点在conflict graph中是有记录的。于是这个问题就简化了。具体的算法,大家可以参照paper:Applications of random sampling in computational geometry

 

如果有任何疑问或质疑,请发邮件到:fire_fuxm@hotmail.com

转载于:https://www.cnblogs.com/USTC-fuxm/archive/2011/09/09/2172288.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值