如何确定对角线是否在凹多边形内?

时间:2009-03-29 00:09:53

标签: geometry polygon

凹面(非凸面)多边形的对角线(对角线是连接不相邻顶点的线段)可以完全在多边形之内或之外(或者可以与多边形的边相交)。如何确定它是否完全在多边形中?(没有多边形点测试的方法)。

6 个答案:

答案 0 :(得分:5)

如果对角线与边缘至少有一个交点,则它部分位于多边形内并且部分位于多边形之外,但是,如果对角线与它们没有交叉,则只有两种状态:它完全在或完全在外多边形。

确定它是否在多边形之内或之外:

假设多边形的顶点逆时针排序。考虑位于名为P [i]的顶点上的对角线的一个端点(另一个端点是p [j])。然后,制作三个向量,其第一个点是p [i]:

V1:p [i + 1] - p [i]

V2:p [i-1] - p [i]

V3:p [j] - p [i]

当我们逆时针从V1移动到V2时,当且仅当V3在V1和V2之间时,对角线完全在多边形中。

alt text

当我们逆时针从V1到V2时,如何确定V3是否介于V1和V2之间?转到here

我使用这种方法编写了一个程序,它可以有效地工作。

答案 1 :(得分:4)

  

如何确定它是否完全在多边形中?

如果要确定对角线是否永远不会离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何线相交。

  • 如果是,则它部分位于多边形中并且部分位于多边形外。

  • 如果没有,它要么完全在多边形中,要么完全在多边形之外。从那里,最简单的方法是在对角线上的任何点上使用多边形点,但如果您不想这样做,请使用 winding algorithm

答案 2 :(得分:3)

我相信约翰的回答错过了一个重要的案例:当对角线完全位于多边形之外时。想象一下,将对角线“桥”设为他的“u”形多边形的两座塔。

Connecting the two towers creates a diagonal that does not intersect any edges, but is still outside the polygon.

几年前我不得不解决这个问题,所以请原谅我的回忆有点不稳定。

我解决这个问题的方法是对角线与多边形中的每个边缘进行线交叉测试。然后你有两种可能的情况:你要么至少有一个交叉点,要么你没有交叉点。如果得到任何交点,则对角线不在多边形内。

如果没有任何交叉点,则需要确定对角线是完全位于多边形内部还是完全位于多边形外部。假设对角线正在将p [i]连接到p [j],i< j,你有一个顺时针缠绕的多边形。如果对角线在多边形之外,可以通过查看连接p [i]到p [i + 1]的边来计算出来。计算出该边缘的2D角度(例如,使用x轴作为基线。)旋转对角线,使p [i] -p [i + 1]边缘为其基线并计算其2D角度。 / p>

An image showing the above process in a slightly less wordy manner.

完成此操作后,如果对角线在多边形之外,对角线的2D角度将为正,如果在多边形内,则为负角度。

答案 3 :(得分:1)

关于检查线段之间的交叉点(这是您可能需要做的第一步),我发现SoftSurfer上的解释是有帮助的。您必须检查对角线与多边形的任何边缘之间的交点。如果您正在使用MATLAB,您应该能够找到一种有效的方法来同时使用矩阵和向量运算来检查所有边的交点(我已经用这种方式计算交叉点ray-triangle intersections)。

答案 4 :(得分:0)

约翰的回答是:

  

如果要确定对角线是否永远不会离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何线相交。如果是这样,它就会离开多边形。

执行此检查的有效方法是对数据运行Bentley-Ottman扫描线算法。它易于实现,但很难使数值稳定。如果你的多边形中有少于......比如... 20个边缘,那么强力搜索很可能会更快。

答案 5 :(得分:0)

我知道这个问题已经在很多年前回答了,但是我有一个易于实现的新方法。

如先前答案中所建议,如果多边形的所有边缘中的任何一条与对角线线段相交,则应首先计算它们。 here说明了用于计算相交并确定一个偶数是否存在的代码。

如果所有边缘(除了那些共享具有对角线的顶点的边缘)都没有与对角线的交点,那么您就知道对角线在完全在内部或完全在外部多边形意味着对角线的中点分别也是完全在内部完全在外部。中点是对角线两个端点的平均值。

我们现在已经将问题转换为计算对角线在多边形内部还是外部,而对中点是在多边形内部还是外部。单点处理比直线处理容易。

here描述了确定点是否在多边形内的方法,该方法可以通过计算从该点开始的水平射线的相交量并查看该射线相交多少个多边形边缘来概括。如果光线相交的次数是奇数次,则该点位于多边形内部,否则位于多边形外部。

此实现易于实现的原因是,当您遍历所有边缘以检查与对角线的相交时,现在还可以计算对角线的中点射线与正在处理的当前边缘是否相交。如果您的for循环返回时对角线和边缘之间没有相交,则可以查看偶数/奇数计数以确定对角线是在内部还是外部。