凸壳程序
总结
船体是一个ANSI C程序,用于计算点集的凸包一般(但很小!)维。输入是点列表,输出是点的凸壳的面列表,每个面的顶点列表。(假设面是简单的,例如3d中的三角形;这是通过tiebreaking来实现的,它提供了一个方面的三角剖分通过“放置”。)该程序还可以计算Delaunay三角剖分和alpha形状,沃罗诺伊地区的数量。该程序使用精确算法如果可能的话,处以中速罚款。(通常为2或3倍对于Delaunay三角剖分,凸面壳更少)。支持geomview的postscript和OFF格式输出。此文档是手册页的html版本,带有指向描述算法的论文。
最后,我让代码变得更加可移植:它在gcc下编译通过提供的makefile,我已经包含了Visual Studio 7解决方案和项目文件以在Windows上构建它(作为控制台应用程序)。我听说它在Solaris下也可以编译和运行。克拉克森@research.bell-labs.com.
源代码
使用示例
简介
船体-d日-(f)<格式>-A类-aa公司<阿尔法>-自动对焦<格式>-北欧-ov型-秒<种子>-第页-米<乘数>-X<调试文件>-我<输入文件>-自由现金流<输出文件>
描述
这个输入文件(默认stdin)是一个序列个点(也称为站点),以分隔;一d日-维度的点已指定作为一组d日由空白分隔的浮点数(不包括\n)。这个输出文件(默认标准输出)给予d日-输入点的元组,其中点以整数形式给出我如果是我'第中的点输入文件.如果凸包位于平面(仿射子空间)中尺寸的d’,输出将包含以下列表d’-元组,凸包相对于该平面的顶点。
输出元组表示凸包的面输入集的。输出不是单纯形的面隐式地作为其三角剖分的简单集合。
Delaunay三角剖分的输出包括“无穷远点”,编号-1;包含它的刻面对应于凸包的刻面的网站。
会出现一些闲聊调试文件(默认stderr)。
输入点的坐标四舍五入为整数。带-m<乘数>,坐标乘以乘法器之前这个圆。
该程序试图使用一种能给出准确答案的方法数值试验;在某些情况下,这可能会失败,在出现一些警告后,程序继续使用近似值算术。
有关选项的更多详细信息:
- -d日
- 计算输入集的Delaunay三角剖分。
- -(f)<格式>
- 给出主要输出(凸包或Delaunay三角剖分)在输出中<格式>,默认情况下为顶点编号列表如上所述,或聚苯乙烯,用于平面点的后置脚本输出,或关闭,用于3d点的OFF输出。
- -aa公司<阿尔法>
- 使用参数计算alpha形状<阿尔法>:输出为全套d日-位置元组,以便有一个半径球<阿尔法>在其边界球体上包含这些场地,而不包含其他场地。此选项和-A隐含了Delaunay三角剖分计算。
- -自动对焦<格式>
- 以格式输出alpha形状<格式>,如选项-f所示。
- -A类
- 计算输入的α形状,找到最小的α这样站点都包含在alpha-shape中。
- -第页
- 随机洗牌输入点;这可能会加快程序的速度。
- -秒<种子>
- 随机洗牌使用<种子>用于随机数生成器。
- -北欧
- 不产生主要输出(凸包或Delaunay三角测量)。如果只需要alpha形状,则需要此选项来关闭Delaunay输出。
- -ov型
- 给出输入站点的Voronoi区域体积,通常d’-的卷d’-三维Voronoi细胞。表示-d。
错误/便携性
如果凸包是一个单点,算法将无法报告它。应处理所有其他退化。断开连接,以便所有报告的方面简单。如果输入点退化,则某些外壳面可能退化;例如,一些Delaunay单纯形可能具有零体积。确定非简单面或删除零体积Delaunay simplices可以在后处理中完成(未实施)。文件rand.c包括对伪随机数生成器的调用;
不删除任何单纯形;释放存储空间的唯一方法就是使用freehullstorage将其全部释放。
作者
肯·克拉克森,
(克拉克森@research.bell-labs.com),
使用的是苏珊·多沃德(Susan Dorward)的早期版本,她不应受到指责。
算法
组合的
该程序实现了一个增量算法,可以随机化如果需要;算法大致如第3节所述(第7页),共页K.L.Clarkson、K.Mehlhorn和R.Seidel。随机的四个结果增量构造.公司。地理位置:理论与应用,第185-1211993页。中的初步版本程序。交响乐团。西奥。公司方面。科学。,1992
该代码是“所有可见性”的实现搜索过程。该讨论的“反原点”点表示为NULL点在代码中,使simplex s表示一个方面iff s->peak.vert为NULL。
数字的
用于计算面法线等的数字代码是实施K.L.克拉克森。安全有效行列式评估.在程序。第31届IEEE计算机科学基础研讨会,第387-395页,宾夕法尼亚州匹兹堡,1992年10月。
使用该纸张的调节程序,并应用于找到凸壳的一个面上的法向量。可见性测试是一个点积。向量a_1、a_2。。。从点p0、p1…获得,。。。通过翻译p_0到原点:a_i=p_i-p_0,对于i=1..cdim。
函数调用
要调用的主要函数是
simplex*build_covex_hull(gsitef*gets,site_n*site_numm,短dim,短vdd)
返回指向凸壳(或Delaunay)三角剖分的根单纯形的指针如果vdd==1),则进行三角剖分。有关gsitef typedef等,请参见hull.h。
- 获得
- 每次调用都返回下一个站点;返回NULL时船体建造停止;
- 站点编号
- 返回给定站点时的站点编号;
- 昏暗的
- 点集维数;
- 视频数据显示
- 如果(vdd),则返回Delaunay三角剖分,否则返回凸壳;