计算3D减少凸包

时间:2015-04-01 16:43:54

标签: algorithm 3d computational-geometry convex-hull

我正在寻找一种能够提供我称之为"缩小的凸包的算法" (与三维中的#34;减少的凸包[34]不同)。我将萎缩的船体定义为H',作为与一些原始凸壳H不小于D距离的空间体积。

分析地说,这可以通过将H的每个平面沿其法线向内移动D来形成,然后计算合成平面的凸包(如果存在)。棘手的一点是某些飞机可能被修剪或掉落,其他飞机可能会越过其他飞机,并完全被“剪断”#34;因正常逆转而退出(如果D足够大)。我对如何做算法有点模糊,但下面有一些经过深思熟虑的想法。

我这样做是为了识别数据集中的点子集,这些点子集保证不小于距离原始点集合的表面的给定距离(假设它是凸的,我有这个)。这是为了消除在我们正在进行的一些计算中破坏我们信号的表面效应。

我真的在寻找一个名字,或任何人这样做的例子,或者其他计算方法。理想情况下,一些古老的开放代码会很棒,但我认为我的问题太过分了。

我发现凸壳减少了,但这似乎是一个不同的想法。我能找到的当前最接近的东西是"豪斯多夫核心" - 然而,这似乎是非凸多边形的更复杂的情况,而且非常致密。


除非你真的想要,否则不要在这里阅读。

当前,不完整/经过深思熟虑的算法

识别缩小点集的缓慢方式(即当前方式)是计算所有点的有符号距离,并拒绝那些小于给定距离的距离。然而,由于点数可达100M,因此非常缓慢。我认为在原始船体上操作以产生萎缩的船体,并计算其AABB和球形BB,然后仅保留在缩小的船体内部的那些可能要快得多(我希望 - 愿意接受评论说这是愚蠢的)。

我认为应该是可能的,因为我并不严格需要每个点的全距离信息,只需要D_point> D.所以,一旦我知道这一点,我就应该停下来。

我可以看到缩小的船体如何在2D中完成,在那里你看每个顶点,然后使用解析解到恒定速度Eikonal,然后沿着从每个角落导出的矢量移动顶点。

然而,对于3D版本,情况更复杂,因为每个顶点有多个面(> 2)。我目前的计划是单独查看每个边对,然后从那里工作(以某种方式 - 创建半空间并将它们联合起来?)来构建这个外壳。

2 个答案:

答案 0 :(得分:0)

你想到的是降低3D凸包的尺寸,它就像缩小2D图像一样,除了角度如何

算法大纲(2D)看起来像这样:

1. Compute the convex hull.
2. For each point, P, in the convex hull:
3.     Find the hull points before and after, P
4.     Bisect the angle formed to obtain the angle, A, required.
5.     Create a new point, P', along the angle A at a distance, D, from `P`.
7.     Add P' to the scaled-down (shrunken) convex hull.

3D的唯一区别发生在第3和第4行。在3D中,第3步获得3个点。在步骤4中,使用3D角度。因此,在图形/几何库中使用3D变换会有一些好处,因为数学可能很棘手。

答案 1 :(得分:0)

如果您的目标是移除表面效果,并且凸包的每个表面都移动相同的距离并不重要,您可以改为

  1. 识别已知在船体内部的点(例如点云或船体的质心)
  2. 将船体向内缩放至该点
  3. 除非你无限扩展(将所有东西都折叠到一个点),否则这个操作应该给出一个具有相同连通性的向内移位的船体 - 没有添加或移除点。