多边形操作 - 如何对找到的顶点进行排序

时间:2013-01-03 09:55:38

标签: c++ geometry polygon operation

我在输入上有两个凹多边形,表示为两个点向量。我想对它做一些多边形操作 - 联合,交集和差异。我在这些多边形之间找到交叉点,并将它们插入每个多边形的正确位置。然后我给出一个关于它的位置的信息(内部 - 它在另一个多边形内部,外部 - 它在另一个多边形之外,交点 - 点,多边形的两个边相交)到每个顶点。现在我知道哪些点创建了这些多边形(外部和交叉点)等的联合,但我需要知道如何将它们排序到正确的顺序。在交叉操作的情况下,我需要将这些排序的点分成正确的集合数,因为交集的结果可能是多个多边形。

我正在使用C ++,但我不需要代码,我只想要如何对这些最终的多边形点进行排序。而且我不想使用任何库来进行这些操作,因为我已经拥有自己的函数并希望使用它们。

我查看了这个问题How to intersect two polygons?以及其他一些问题,但没有一个问题解决了点的最终排序问题。 我也读过这篇文章http://www.gvu.gatech.edu/~jarek/graphics/papers/04PolygonBooleansMargalit.pdf,但我可能不明白。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您遵循我的评论中的所有建议:

  • 区分交叉点和触点
  • 在两个多边形中交叉点的两个等价物之间保持链接

联盟的解决方案将是:

  1. 仅考虑外部,接触和交叉点
  2. 确保两个多边形中的点按 不同的 方向排序(其中一组是顺时针方向,另一组是逆时针方向)
  3. 从任意两个多边形中的随机点开始。
  4. 对于两个多边形中的任何一个中的每个顶点,如果您已访问它,请保留
  5. 每当遇到一个交叉点时,在相当于交叉点之后,继续从另一个多边形中的下一个跟随点开始遍历。
  6. 如果你回到起点,那么关闭两个多边形连接的一个组件。如果不是遍历所有顶点,则从任何未访问的顶点重复整个顶点。
  7. 最后计算您找到的所有多边形的面积。面积最大的将是真正的联盟。其余的将是工会中的漏洞。
  8. 加入的解决方案是:

    1. 仅考虑内部和交叉点
    2. 确保两个多边形中的点以 相同的 方向排序
    3. 从任意两个多边形中的随机点开始。
    4. 对于两个多边形中的任何一个中的每个顶点,如果您已访问它,请保留
    5. 每当遇到一个交叉点时,在相当于交叉点之后,继续从另一个多边形中的下一个跟随点开始遍历。
    6. 如果你回到起点,那么关闭两个多边形连接的一个组件。如果不是遍历所有顶点,则从任何未访问的顶点重复整个顶点。
    7. 编辑:正如我已经提到的,我有上帝的感觉,我需要修改多边形方向的方法。但是,在网上搜索时,我找到了可能为您完成工作的算法说明:The Vatti clipping algorithm

      EDIT2 One more article描述了这种裁剪算法。