给出一个圆心为(X c ,Y c )且半径为 r 的圆 以及在数组内部具有顶点的多边形 vertices [] = {(X v1 ,Y v1 ),...,(X vn ,Y vn )},其中n是顶点数。
我想知道圆是否在多边形内。我假设(并且可以假设)多边形中没有孔。
我要检查的唯一多边形将是三角形和五边形。
到目前为止,我所做的就是计算圆的中心是否在多边形内部。此功能称为isInside()
。
如何检查圆是否完全在要检查的多边形内?可以的。
更具体地说,我在解决圆与多边形之间关系的数学上遇到麻烦,这对于解决此问题至关重要。我知道如何查找圆的中心是否在多边形内,但是不知道完整的圆是否包含在多边形中。
任何帮助:)
答案 0 :(得分:0)
您已经实现了一种用于检查点是否在多边形内的算法。那么,为什么不仅仅将一个圆近似为等边多边形呢?您只需要检查圆的16或64或256点即可。
答案 1 :(得分:0)
以下内容假设您已经知道the center of the circle is inside the polygon。您需要检查一些定义,因为定义触摸顶点可以会添加一些边角。此解决方案也适用于凹面多边形。
要使圆完全位于多边形的内部,我们需要所有边都在圆的外部。特别是,这可以确保多边形不在圆内。
给出半径为 r 并以 c 为中心的圆和边缘 e 0 ,e 1 ,...,e n 的多边形的必要条件是,对于所有 i
d (c,e i )> = r
其中 d 是euclidian distance。
如果以上内容对任何边缘均不成立,则说明多边形与圆之间存在相交,或者多边形本身完全位于圆内。
最后一个检查是使圆位于内部的必要条件,尽管这还不够,因为可能所有边缘都在圆的外部,但是圆仍然从顶点泄漏。
让我们首先记住我们需要的一些公式。
以(x 0 ,y 0 )为中心的半径 r 圆的方程: >
(x-x 0 ) 2 +(y-y 0 ) 2 = r 2
因此,通过求解,可以找到与线 y = ax + b 的交点:
(x-x 0 ) 2 +(ax + b-y 0 ) 2 = r 2
这不过是一个二次方程式,可以重写为:
(a 2 + 1)x 2 +(2ab-2ay 0 -2x 0 )x +(x 0 +(b-y 0 ) 2 -r 2 )= 0
您可以使用quadratic formula来解决每个顶点。然后,您就有三种可能性。
这表明该顶点不存在交集。使用高级语言,您可以捕获一些MathError
异常来进行检测。否则,您可以在数学上检查discriminant的符号,如果它是负数,则会发生这种情况。
(2ab-2ay 0 -2x 0 ) 2 -4(a 2 + 1)( x 0 +(b-y 0 ) 2 -r 2 )<0
如果方程式有一个解,即两个解都相同,则圆可能会碰到,但不会漏出边缘。您说您的情况仍然认为该对象位于多边形的内部。
从数学上讲,当判别为零时会发生这种情况。
(2ab-2ay 0 -2x 0 ) 2 -4(a 2 + 1)( x 0 +(b-y 0 ) 2 -r 2 )= 0
如果存在两个解决方案,例如 x i 和 x j ,则可能存在是重叠。虽然,对于凹面多边形并不确定。
要检查是否确实存在重叠,必须检查相交是否发生在线段上。
这很简单。假设您的顶点位于(x 1 ,y 1 )和(x 2 y 2 ),那么如果只有...,则存在交点。
x 1
i 2
或...
x 1
j 2
在任何其他情况下,交点都发生在顶点的延续上,而不是顶点本身上。
如果以上条件之一成立,那么只有到那时,您才知道您的圆漏到多边形之外。
仍然需要掩盖一个角落。如前所述,触摸多边形是可以的,因此有一个以上未涵盖的最终角箱:触摸凹边。
凹边缘是指内角大于180°的边缘。因此,只要与多边形存在相交,如果相交发生在凹面的边缘上,就可以忽略它。
以上所有方法均可用于任何多边形,不仅适用于三角形和六边形。