非凸多边形 - 使用凸包算法的预处理

时间:2013-02-20 00:36:57

标签: algorithm geometry convex-hull graph-drawing non-convex

我使用了convexHull算法来查找某些不规则形状的轮廓。虽然不够好......

很可能因为我不能保证我的形状是凸的......

我有一组矩形,我希望能够获得轮廓外部的所有点 - 但不能抛出任何轮廓点。

enter image description here

凸包算法效果很好 - 但它的效果与右边的例子类似,所以我在轮廓上丢失了一些信息。

我想要的东西更接近左边的版本,保留外角,只消除内部的点......

有这样的算法吗?

或者,有没有什么方法可以将像这样的形状(多边形)分解成凸形,所以凸包算法可以正确处理它?<​​/ p>

从链接到链接,我一直在试图弄清楚如何设置某种算法,比如Hertel-Mehlhorn算法 - 但我不知道在这种情况下交叉线会用什么......

感谢您的任何建议。

1 个答案:

答案 0 :(得分:4)

如果你的非凸多边形正如你所示(即一组四边形单元的并集),你所要做的就是找到位于边界上的四边形边。

这可以通过注意这些“外部”边缘仅出现在一个元素中来实现,而“内部”边缘对于两个相邻元素是共同的。这意味着以下简单的算法:

edge_list = {}
for (i = all elements in mesh)
for (j = all edges in element(i))
    edge_list <- push jth edge of ith element
endfor
endfor
edge_list <- sort
edge_list <- remove_duplicates

剩余的唯一边形成多边形的外部轮廓。这个简单的算法在O(N*log(N))时间运行。

您可以通过使用合适的哈希表进行边缘比较来提高复杂性,从而将复杂度降低到O(N)