计算圆是否适合多边形(三角形/五边形)的内部(在允许接触多边形的坐标处)?

时间:2018-10-10 20:08:50

标签: algorithm math collision-detection polygon bounds

给出一个圆心为(X c ,Y c )且半径为 r 的圆 以及在数组内部具有顶点的多边形 vertices [] = {(X v1 ,Y v1 ),...,(X vn ,Y vn )},其中n是顶点数。

我想知道圆是否在多边形内。我假设(并且可以假设)多边形中没有孔。

我要检查的唯一多边形将是三角形和五边形。

到目前为止,我所做的就是计算圆的中心是否在多边形内部。此功能称为isInside()

如何检查圆是否完全在要检查的多边形内?可以的。

更具体地说,我在解决圆与多边形之间关系的数学上遇到麻烦,这对于解决此问题至关重要。我知道如何查找圆的中心是否在多边形内,但是不知道完整的圆是否包含在多边形中。

任何帮助:)

2 个答案:

答案 0 :(得分:0)

方法1:简单但不精确

您已经实现了一种用于检查点是否在多边形内的算法。那么,为什么不仅仅将一个圆近似为等边多边形呢?您只需要检查圆的16或64或256点即可。


方法2:更复杂,但精确一些

  1. 找到多边形各面的法线向量(可以轻松地计算出它)。
  2. 通过此法线向量找到圆心到边的距离(线相交也是一个简单的任务)。
  3. 如果距离小于圆的半径,则圆在多边形之外。
  4. 否则,如果两边到该点的法线距离均大于或等于圆的半径,则该圆在内部。

image

答案 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来解决每个顶点。然后,您就有三种可能性。

1)没有解决办法

这表明该顶点不存在交集。使用高级语言,您可以捕获一些MathError异常来进行检测。否则,您可以在数学上检查discriminant的符号,如果它是负数,则会发生这种情况。

  

(2ab-2ay 0 -2x 0 2 -4(a 2 + 1)( x 0 +(b-y 0 2 -r 2 )<0

2)有一个独特的解决方案

如果方程式有一个解,即两个解都相同,则圆可能会碰到,但不会漏出边缘。您说您的情况仍然认为该对象位于多边形的内部

从数学上讲,当判别为零时会发生这种情况。

  

(2ab-2ay 0 -2x 0 2 -4(a 2 + 1)( x 0 +(b-y 0 2 -r 2 )= 0

3)存在两种解决方案

如果存在两个解决方案,例如 x i x j ,则可能存在重叠。虽然,对于凹面多边形并不确定。

要检查是否确实存在重叠,必须检查相交是否发生在线段上。

这很简单。假设您的顶点位于(x 1 ,y 1 (x 2 y 2 ,那么如果只有...,则存在交点。

  

x 1 i 2

或...

  

x 1 j 2

在任何其他情况下,交点都发生在顶点的延续上,而不是顶点本身上。

如果以上条件之一成立,那么只有到那时,您才知道您的圆漏到多边形之外。

最终角套:凹形边缘

仍然需要掩盖一个角落。如前所述,触摸多边形是可以的,因此有一个以上未涵盖的最终角箱:触摸凹边。

凹边缘是指内角大于180°的边缘。因此,只要与多边形存在相交,如果相交发生在凹面的边缘上,就可以忽略它。

以上所有方法均可用于任何多边形,不仅适用于三角形和六边形。