查找并丢弃多边形之间的共享边

时间:2014-01-19 13:14:38

标签: java geometry

我有一组凸多边形,可以共享边(每个多边形由其顶点数组表示)。当这些多边形中的一些共享边时,我想从独特的边创建一个新的多边形,而忽略共享边。输出应该是具有唯一边的(合并)多边形数组。我能找到的最接近的算法计算出一个凸包,它接近我想要达到的但并不完全。

Examples

3 个答案:

答案 0 :(得分:2)

使用共享边计算多边形的凸包不起作用,因为根据定义,结果是凸多边形。在您的情况下,将多个凸多边形与共享边合并的结果可能不再是凸的。

我会提出以下方法(这不是微不足道的,我不知道是否可以用更简单的方式完成):

  1. 将多边形的表示更改为顶点索引数组(这简化了后面的一些步骤)

    遍历所有多边形并将其所有顶点附加到大型顶点数组。迭代多边形的顶点并将它们附加到大数组时,生成一小组相应的顶点索引(新的多边形表示)。多边形现在是一个顶点索引数组,引用大型顶点数组(由所有多边形使用)。

  2. 识别共享顶点

    保持从顶点索引到计数器的映射(顶点索引是在1中创建的大型顶点数组中顶点的索引)。这将跟踪顶点属于多少个多边形,并允许识别共享顶点。

    遍历所有多边形及其顶点索引以及您拥有的每个顶点索引,将其插入此地图或增加计数器(如果它已在地图中)。

  3. 识别共享边(并跟踪它们属于哪些多边形)

    保持从(i,j)(i

    • 约束i< j确保不同方向的边不计算两次(这也意味着在查询地图时你必须确保i< j在你的查询对中)。
    • 计数器计算边缘所属的多边形数。问题在于2D,我假设数据是干净的(多边形彼此不重叠),因此该计数器的值应为1或2。
    • 多边形index1和多边形index2指的是多边形数组中边可能属于多边形的索引(这些索引可以初始化为-1)。

    遍历所有多边形及其边缘(迭代顶点索引列表,而不会忘记关闭循环的最终边缘)。对于每个边缘(i,j),其中i <1。 j,通过在地图中创建条目或更新其计数器和多边形索引来更新地图。

  4. 生成新的多边形数组

    迭代初始数组中的所有多边形。对于每个多边形,可以生成新的多边形:

    1. 在多边形中找到未共享的顶点索引(使用2中的地图)。如果没有这样的顶点索引,则丢弃多边形并移动到下一个未丢弃的多边形。

    2. 输出(非共享)顶点索引。从此顶点索引开始,遍历多边形的所有边:

      1. 如果边缘未共享,则输出目标顶点索引并移至下一个边缘。

      2. 如果共享边缘,则需要找出与其共享的多边形(以继续迭代新多边形的边缘)。使用3.中的边缘图来执行此操作。找到另一个多边形中的边,并继续迭代另一个多边形的边(在相反方向w.r.t.到共享边)。

      3. 新多边形边缘上的这种迭代最终应该循环回到起始(非共享)顶点索引,这意味着新多边形将被关闭,并且可以附加到新的多边形数组中。

        < / LI>

        在迭代不同多边形的边缘以生成最终合并多边形时,应跟踪遍历的多边形,以便可以在外部循环中丢弃它们。

      4. 将新多边形的表示形式转换回顶点数组(如果需要)

        简单地迭代新的多边形及其顶点索引数组。从1中创建的顶点数组中获取相应的顶点,并为该多边形附加一个新的顶点数组。

答案 1 :(得分:0)

我不知道 - 制作所有顶点的列表并按x和y值排序,然后通过并丢弃重复项?

答案 2 :(得分:0)

也许GPC - General Polygon Clipper库可以提供帮助。它有很多功能和算法。 Daniel Bridenbecker有一个Java端口。我用它来计算多边形交叉点和联合......