我使用了convexHull算法来查找某些不规则形状的轮廓。虽然不够好......
很可能因为我不能保证我的形状是凸的......
我有一组矩形,我希望能够获得轮廓外部的所有点 - 但不能抛出任何轮廓点。
凸包算法效果很好 - 但它的效果与右边的例子类似,所以我在轮廓上丢失了一些信息。
我想要的东西更接近左边的版本,保留外角,只消除内部的点......
有这样的算法吗?
或者,有没有什么方法可以将像这样的形状(多边形)分解成凸形,所以凸包算法可以正确处理它?</ p>
从链接到链接,我一直在试图弄清楚如何设置某种算法,比如Hertel-Mehlhorn算法 - 但我不知道在这种情况下交叉线会用什么......
感谢您的任何建议。
答案 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)
。