【问题标题】:Implementing winding number algorithm to compute interior and exterior regions (OpenGL, c++)实现绕组数算法来计算内部和外部区域(OpenGL,C++)
【发布时间】:2015-06-19 06:14:27
【问题描述】:

我需要实现绕组数算法来确定(不一定是简单的)多边形的内部和外部区域。

我的想法是将多边形分解为简单的区域(这样任何区域都不能分解为 2 个区域),然后对每个区域中的 1 个点使用缠绕数算法,从而确定整个区域的性质. 但是,我无法想出一种算法来计算所述区域,然后我需要在每个区域内获取一个点(从那里,实现缠绕数算法非常简单)。

有没有一种简单有效的算法可以将复杂的多边形分割成这样的区域?

【问题讨论】:

  • 如果我理解正确,您正在搜索“tesselation”/“triangulation”。谷歌会有结果。
  • 如何表示多边形?
  • @deviantfan 不完全是,我需要知道多边形内部的哪些部分。例如,here 内部区域是彩色的。
  • @Beta 多边形用顶点数组表示
  • 顶点是否有任何唯一标识符?也就是说,如果我怀疑数组中的两个元素代表同一个顶点,我可以进行离散检查还是必须比较它们的坐标?

标签: c++ algorithm opengl graphics


【解决方案1】:

points in polygons 上的维基百科文章的参考资料中,您可以找到一个非常有用的article,它介绍了绕组数算法的有效实现。文章很清楚,写的很好!它包括几个示例、伪代码和(幸运的是)C++ 中算法的完整实现。要理解该算法,您可以跳过绕组数的数学背景(文章简要解释了如何将它们解释为单位球体的同伦类),只需阅读如何以及为什么可以更轻松地表达绕组数案例。

顺便说一句,绕组数算法在非简单多边形上工作得很好。为什么要先将它们分成简单的区域?上面链接的文章还解释了如何使用交叉数来确定一个点是否位于一个简单的(!)多边形内。所以我希望这能给你足够的信息来决定你是否真的想先分割你的多边形。

【讨论】:

  • 但我需要知道要检查哪些点,因为我需要确定哪些区域在多边形内部,哪些在外部。例如,this polygon 是算法应该做的。只有彩色区域是内部的。
  • 这正是绕组数算法所做的,因为在您的示例中,非彩色区域的绕组数为 0 :) 就是这种情况,因为多边形的方向(或者更确切地说是边缘)与此算法相关 - 在您的示例中,绕组数为 0,因为多边形在非彩色区域顺时针运行一次,逆时针运行一次,导致绕组数为 1-1=0
  • @H W 我认为你没有理解我的意图。我知道算法是如何工作的,但我需要知道要检查的 哪些 点才能确定内部区域。如何从多边形中获取区域列表?我需要知道区域(内部和外部),然后检查每个区域(使用该区域内的一个点)是否是内部。还是有别的办法?
  • 在这种情况下,我确实误解了你的问题。您能否解释一下您需要这些区域的内容,以便我们可以考虑其他方式来表示它们?到目前为止,我唯一能想到的确定所有区域的方法是检查多边形内的交叉点,并从那里尝试递归地找到小于前一个多边形的子多边形(该算法在没有更多交叉点之前不会停止)。
  • 这就是问题所在。原句是:“编写一个算法,使用缠绕数规则确定多边形的内部区域。输入是多边形的顶点。在 OpenGL 中实现该算法”
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多