我有一组凸多边形,可以共享边(每个多边形由其顶点数组表示)。当这些多边形中的一些共享边时,我想从独特的边创建一个新的多边形,而忽略共享边。输出应该是具有唯一边的(合并)多边形数组。我能找到的最接近的算法计算出一个凸包,它接近我想要达到的但并不完全。
答案 0 :(得分:2)
使用共享边计算多边形的凸包不起作用,因为根据定义,结果是凸多边形。在您的情况下,将多个凸多边形与共享边合并的结果可能不再是凸的。
我会提出以下方法(这不是微不足道的,我不知道是否可以用更简单的方式完成):
将多边形的表示更改为顶点索引数组(这简化了后面的一些步骤)
遍历所有多边形并将其所有顶点附加到大型顶点数组。迭代多边形的顶点并将它们附加到大数组时,生成一小组相应的顶点索引(新的多边形表示)。多边形现在是一个顶点索引数组,引用大型顶点数组(由所有多边形使用)。
识别共享顶点
保持从顶点索引到计数器的映射(顶点索引是在1中创建的大型顶点数组中顶点的索引)。这将跟踪顶点属于多少个多边形,并允许识别共享顶点。
遍历所有多边形及其顶点索引以及您拥有的每个顶点索引,将其插入此地图或增加计数器(如果它已在地图中)。
识别共享边(并跟踪它们属于哪些多边形)
保持从(i,j)(i 遍历所有多边形及其边缘(迭代顶点索引列表,而不会忘记关闭循环的最终边缘)。对于每个边缘(i,j),其中i <1。 j,通过在地图中创建条目或更新其计数器和多边形索引来更新地图。
生成新的多边形数组
迭代初始数组中的所有多边形。对于每个多边形,可以生成新的多边形:
在多边形中找到未共享的顶点索引(使用2中的地图)。如果没有这样的顶点索引,则丢弃多边形并移动到下一个未丢弃的多边形。
输出(非共享)顶点索引。从此顶点索引开始,遍历多边形的所有边:
如果边缘未共享,则输出目标顶点索引并移至下一个边缘。
如果共享边缘,则需要找出与其共享的多边形(以继续迭代新多边形的边缘)。使用3.中的边缘图来执行此操作。找到另一个多边形中的边,并继续迭代另一个多边形的边(在相反方向w.r.t.到共享边)。
新多边形边缘上的这种迭代最终应该循环回到起始(非共享)顶点索引,这意味着新多边形将被关闭,并且可以附加到新的多边形数组中。
< / LI> 醇>在迭代不同多边形的边缘以生成最终合并多边形时,应跟踪遍历的多边形,以便可以在外部循环中丢弃它们。
将新多边形的表示形式转换回顶点数组(如果需要)
简单地迭代新的多边形及其顶点索引数组。从1中创建的顶点数组中获取相应的顶点,并为该多边形附加一个新的顶点数组。
答案 1 :(得分:0)
我不知道 - 制作所有顶点的列表并按x和y值排序,然后通过并丢弃重复项?
答案 2 :(得分:0)