凸壳程序

总结

船体是一个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三角剖分,否则返回凸壳;