【问题标题】:Calculate if circle fits inside of polygon (triangle/pentagon) given coordinates where touching the polygon is allowed? [closed]给定允许触摸多边形的坐标,计算圆形是否适合多边形(三角形/五边形)? [关闭]
【发布时间】:2019-03-15 19:49:06
【问题描述】:

给定一个圆心 (Xc,Yc) 和半径 r 以及在数组内部具有顶点的多边形,使得 顶点[] = { (Xv1, Yv1) , ... , (Xvn, Yvn) } 其中 n 是顶点数。

我希望能够确定圆是否在多边形内。我假设(并且可以安全地假设)多边形中没有孔。

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

到目前为止,我所做的是计算圆心是否在多边形内部。这个函数叫做isInside()

如何检查圆是否完全在我正在检查的多边形内?摸一下就好了。

更具体地说,我在计算圆和多边形的关系时遇到了问题,这对于解决这个问题至关重要。我了解如何查找圆心是否在多边形内,但如果整个圆包含在多边形中,则不知道。

任何帮助:)

【问题讨论】:

  • 这不是c 特有的,您对这个问题的处理方法是什么?
  • 你懂数学吗?
  • @Observer 正确。但是,我正在用 C 语言制作这个解决方案。我将编辑问题以删除标签。到目前为止,我的方法是确定圆心是否在多边形内部。在那之后,我不知道该怎么办。我试图找到圆的半径和圆的位置之间的关系,使其完全适合多边形。
  • 在这种情况下,您的出发点是寻求数学方面的帮助。你不能为你不理解的东西编写程序。编程不是魔术——它要求你知道自己想做什么
  • 我投票结束这个问题,因为它属于数学网站

标签: algorithm math collision-detection polygon bounds


【解决方案1】:

以下假设您已经知道the center of the circle is inside the polygon。您需要检查几件事,因为您的定义触摸顶点是可以的添加了一些极端情况。此解决方案也适用于凹多边形。

早期检查

要使圆完全多边形内,我们需要所有边都在圆之外。尤其是这样可以确保多边形不完全在圆内。

给定半径为r的圆,以c为中心,边e0,e1 sub>, ..., en ,因此一个必要条件是对于所有 i :

d(c, ei) >= r

其中 deuclidian distance

如果以上对任何边都不成立,那么多边形和圆之间存在交点,或者多边形本身完全在圆内。

圆是否与多边形相交

最后的检查是圆在里面的必要条件,虽然它是不充分的,因为可能所有的边都在圆的外面,但圆仍然从一个顶点漏出。

让我们首先记住一些我们需要的公式。

(x0, y0)为圆心的半径为r的圆的方程: p>

(x - x0)2 + (y - y0)2 = r2

因此通过求解找到与线y = ax + b的交点:

(x - x0)2 + (ax + b - y0)2 = r 2

这不过是一个二次方程,可以改写为:

(a2 + 1)x2 + (2ab - 2ay0 - 2x0)x + (x0 + (b - y0)2 - r2) = 0

您可以使用每个顶点的quadratic formula 来解决这个问题。那么你有三种可能。

1) 没有解决办法

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

(2ab - 2ay0 - 2x0)2 - 4 (a2 + 1) ( x0 + (b - y0)2 - r2)

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

如果方程有一个解,即两个解相同,则圆可能会接触,但不会泄漏到边缘。你说这仍然被认为是 inside 在你的情况下。

从数学上讲,这发生在判别式为零时。

(2ab - 2ay0 - 2x0)2 - 4 (a2 + 1) ( x0 + (b - y0)2 - r2) = 0

3) 存在两种解决方案

如果存在两种解决方案,比如 xixj,那么可能有 是一个重叠。虽然,这在凹多边形的情况下是不确定的。

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

这很简单。假设您的顶点位于 (x1, y1)(x2 点之间, y2),那么有一个交集,如果一个仅当...

x1i 2

或者...

x1j 2

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

如果上述条件之一成立,那么只有那时你才知道你的圆在多边形之外泄漏。

最终角盒:凹边

如前所述,触摸多边形是可以的,因此上面没有涵盖最后一个角落:触摸凹边。

凹边是内角大于180°的边。因此,只要与多边形有交集,如果交集发生在凹边上,您就想忽略它。

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

【讨论】:

  • 您能否详细说明顶点跨度的含义或提供示例?和线性代数中的span一样吗?
  • @Gabe 就是这样,我还添加了一些可能发生的极端情况的信息。这主要是由于您的条件 touching 多边形没问题。
【解决方案2】:

方法一:简单但不精确

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


方法 2:更复杂,但很精确

  1. 找到多边形每一边的法向量(您可以轻松计算)。
  2. 通过这个法向量求圆心到边的距离(线相交也是一项简单的任务)。
  3. 如果距离小于圆的半径,则圆在多边形之外。
  4. 否则,如果每条边到点的法线距离大于或等于圆的半径,则圆在里面。

【讨论】:

  • 这很有道理,谢谢!我将采用第二种方法,因为准确性对我的应用程序很重要,
  • @Gabe 对于凹多边形,第二个选项可能是错误的,您需要找到交点并将它们与顶点域进行比较。看我的回答。
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2019-03-11
  • 2011-11-11
  • 2012-07-05
  • 2014-05-29
  • 2016-02-16
相关资源
最近更新 更多