简化的凹壳

时间:2010-08-09 20:43:08

标签: algorithm 3d polygon computational-geometry

问题:

给定:n个与3d k侧非凸多边形强相关的点,其中n>> ķ

查找:与点的原始几何形状匹配的最佳拟合凹壳


尝试解决方案:

警告:伪代码

segments = []
for each point in image:
    #segment points into planes via comparing approximate normals
    #actual implementation is more complicated
    findSegment(image,point)
for each segment in image:
    #transform coordinate system to be a 
    #2D-plane perpendicular to the normal of segment
    transform(segment, segment.normal)
    edges = findEdges(segment)
    polygonHull = reconstructPolygon(edges)
    #transform back to original coordinate system
    transform(segment, segment.normal)

示例:

 ___
|   |               |
|    \__    ==>     |   ___
|       |           |__/  /_____
|_______|          /  /   \_
                  /  /_____/
                 /

输入只是一个高密度点云,它是在多边形平面内近似均匀分布的随机点,带有一点噪音。

输出将是3d点中多边形的顶点。


我的问题是,有没有更好的方法来解决这个问题?上述解决方案的问题在于点可能有噪声。此外,将点光栅化为2d然后执行边缘查找非常昂贵。

任何指针都会很棒。提前致谢

3 个答案:

答案 0 :(得分:2)

如果您的凹角不是太尖锐,我可能会尝试在点集上进行3d Delaunay三角剖分。边界上的点的Voronoi区域将倾向于无限或比内部的点长得多。类似地,边界上与多面体的单个面相关联的单元将倾向于在与它们相关联的面几乎垂直的方向上对齐,因为它们将是长而细的并且它们的长轴将是几乎平行并指出多边形。在某种类型中准伪代码

Compute Delaunay triangulation
Collect long thin Voronoi regions
Partition the Voronoi regions into clusters that are nearby and nearly parallel.
Create faces normal to the axes of the Voronoi regions. 

编辑现在我看到你只想要一个多边形。上述方法有效,但最好分两步完成。首先找到多边形所在的平面,对一小部分点进行最小二乘拟合可能就足够了。将点投影到平面上(这几乎就是你一直在做的)然后计算2d Delaunay三角剖分以找到边缘点并继续如上所述。

答案 1 :(得分:0)

听起来你想要计算投射到平面上的3空间中的点集合的凹壳。稍微讨论了2D案例here

答案 2 :(得分:0)

首先,您要为网格选择一种表示法。在2D中,我使用这种表示法实现了一个Python凹壳算法:half-edge data structure

然后,2D中的算法(您应该适应3D)可以接近to alpha shape algorithm, by Edelbrunner.