如何区分多边形的入站边缘和出站边缘?

时间:2015-07-31 09:39:50

标签: c++ algorithm

Weiler-Atherton Polygon Clipping算法的基础是:

  1. 从剪切区域内的第一条边开始。
  2. 当候选/主题多边形的边缘进入剪切区域时,保存交叉点。
  3. 当候选/主题多边形的边缘退出剪切区域时,保存交叉点并遵循剪裁多边形。
  4. 如何区分多边形的入站和出站边缘?

    似乎发现入站边缘会侵入另一个巨大的算法,从而影响算法的效率。

    另一个问题是,我如何才能找到第一个入境路口?

    This answer seems to be shedding some light on the problem。但是,遗憾的是它没有用。

    例如,如果我反转向量的方向,则角度不会被否定。

    https://www.wolframalpha.com/input/?i=angle+between+vector+%7B0%2C180%7D+%7B180%2C0%7D

    https://www.wolframalpha.com/input/?i=angle+between+vector+%7B0%2C180%7D+%7B-180%2C0%7D

3 个答案:

答案 0 :(得分:6)

首先,提醒一下Weiler-Atherton算法使用顺序定义的顶点按特定顺序定义的多边形。 简而言之,您可以通过顺时针方向遍历多边形来测试进出的边缘。进入的第一条边(因此是第一个入境交叉点)就是您在剪切区域外开始遍历的第一条边(见下文)。

此外,该算法通常分两个阶段运行。首先找到所有交点,将它们添加到多边形的顶点列表中,插入到正确的位置。在此阶段,您通常会标记每个顶点是否在另一个多边形内。对于第二阶段,遍历顶点以确定剪切多边形。

让我们尝试一些例子。取一个由顶点A,B,C和一个矩形w,x,y,z定义的三角形。三角形将是剪切区域,矩形是主题。

enter image description here

我们为主题生成的点列表因此是w,x,R,Q,y,z。三角形列表现在是A,B,Q,C,R。

从w开始,R是第一个交叉点,它是入站的,因为前一个点(x)在外面。该区域的遍历将是R,Q,C,并返回R(完成)。

enter image description here

这里的交叉点没有标记,但它们仍然是R和Q.因此,我们为主题生成的点列表是w,x,R,y,Q,z。三角形列表现在是A,B,C,Q,R。

剪辑遍历是R,y,Q和R(完成)

答案 1 :(得分:1)

PQ成为两个多边形。可以选择v的任何顶点P,以便通过ray casting algorithm确定v相对于Q(即内部或外部)的位置(或任何其他适合问题所有要求的算法)。

您只需要以这种方式确定v相对于P的一个此类顶点Q的位置,因为P的其他顶点的位置可以通过迭代P的有序顶点和交点的集合来推断。

让我们说vQ之外。然后,通过迭代有序的顶点集和P的交叉点,找到的第一个交叉点位于进入边缘。如果v位于Q内,则找到的第一个交叉点位于出口边缘。请记住,一条边可以进入和退出,具体取决于放置在它上面的交叉点的数量。

光线投射算法背后的想法很简单,但如果v P|V(P)|>=|V(Q)| v,则应选择Q的顶点{{1}}为了降低光线投射算法对整体性能的影响,尽管不是很明显)。

答案 2 :(得分:1)

你不一定需要从第一个入境路口开始,当你在一张纸上画出多边形并且可以将你的笔放在任何你想要的地方时,这很好,但正如你所指出的那样需要更多努力在编码时找到。

您只需要确保计算两个多边形的所有交点,首先在源多边形线段周围走动,检查与剪切多边形线段的交点。此时无论是在内部还是外部都无关紧要。

一旦你有了所有的交叉点和你的两个多边形点(我想我有两个可以相互链接的列表),你可以逐点遍历源多边形。如果第一个源多边形点位于剪切多边形内部,该剪切多边形是解决方案多边形的第一个点,如果不是,则求解多边形的第一个点是与剪切多边形的第一个交点。

获得第一个解决方案点后,每个点都有下一个解决方案点。当您点击十字路口时,切换到另一个多边形并继续,直到您返回到第一个解决方案点。

我编码了这段时间已经有一段时间了,但是如果我没记错的话可以抓住你的点是多边形完全在彼此内部(在这种情况下包含的是你的解决方案)并确保你做好准备如果您有一些奇怪的多边形形状,可以使用多个解决方案多边形。