【发布时间】:2015-06-06 10:13:45
【问题描述】:
我正在寻找一种算法,它可以提供我所说的 3D 中“缩小的凸包”(与“缩小的凸包”不同)。我将缩小的外壳 H' 定义为与某个原始凸包 H 的距离不小于 D 的空间体积。
从分析上讲,这可以通过将 H 的每个平面沿其法线向内移动 D 来形成,然后计算结果平面的凸包(如果存在)。棘手的一点是一些平面可能会被修剪或丢弃,其他平面可能会移过其他平面,并且由于正常反转(如果 D 足够大)而被完全“剪断”。我对如何进行算法有点模糊,但在下面有一些经过深思熟虑的想法。
我这样做是为了识别数据集中的点子集,这些点保证与原始点集表面的距离不小于给定距离(假设为凸点,我有这个)。这是为了消除在我们正在进行的某些计算中干扰信号的表面效应。
我真的在寻找一个名字,或者任何这样做的人的例子,或者其他计算这个的方法。理想情况下,一些旧的开放代码会很棒,但我认为我的问题太小众了。
我发现减少了凸包,但这似乎是一个不同的想法。目前我能找到的最接近的东西是“Hausdorff Cores”——但这似乎是非凸多边形的更复杂的情况,而且非常密集。
除非你真的很想,否则不要在这里阅读。
当前的、不完整/经过深思熟虑的算法
识别缩减点集的慢速方法(即当前方法)是计算所有点的有符号距离,并拒绝那些小于给定距离的点。但是,这非常慢,因为点数可能高达 100M。我认为在原始船体上进行操作以生成缩小的船体,并计算其 AABB 和球形 BB,然后仅保留缩小的船体内部的那些可能会快得多(我希望 - 愿意接受 cmets 说这是愚蠢的)。
我认为这应该是可能的,因为我并不严格需要每个点的完整距离信息,只需要 D_point > D。所以一旦我知道这一点,我应该能够停下来。
我可以看到如何在 2D 中完成缩小的船体,您可以在其中查看每个顶点,然后使用等速 Eikonal 的解析解,然后沿着从每个角派生的向量移动顶点。
但是,3D 版本 afaics 的情况更为复杂,因为每个顶点都有多个面 (>2)。我目前的计划是单独查看每个边缘对,然后从那里开始工作(不知何故 - 创建半空间并将它们合并?)来构建这个船体。
【问题讨论】:
-
只是为了澄清要求:输入是如何表示的?它只是一组点吗?输出的期望表示形式是什么?它是这些点的子集(生成输入的凸包),还是定义面的多边形列表?
-
输入是从 qhull 获得的凸包和 3D 点数组。点数组包含在原始外壳中,并且是原始外壳点的超集。 Qhull 提供面遍历和顶点遍历。我可以根据需要构建顶点-边或顶点->面图
标签: algorithm 3d computational-geometry convex-hull