一尘不染

非凸多边形内的最大圆

algorithm

如何找到可以容纳在凹多边形内的最大圆?

只要可以实时处理具有约50个顶点的多边形,就可以使用蛮力算法。


阅读 247

收藏
2020-07-28

共1个答案

一尘不染

解决此问题的关键是首先观察:适合任意多边形内部的最大圆的中心是:

  1. 在多边形内部;和
  2. 距多边形边缘上任意点最远的位置。

为什么?因为圆弧边缘上的每个点都与该中心等距。根据定义,最大的圆将具有最大的半径,并且将在至少两个点上接触多边形,因此,如果您发现距多边形最远的点,则您已经找到了圆心。

此问题出现在地理环境中,并且可以任意精度迭代解决。它称为不可访问的波兰人问题。请参阅“无法接近的极点:地球上最偏远的地方的计算算法”

基本算法的工作原理如下:

  1. 将R定义为从(x min,y min)到(x max,y max)的直线区域;
  2. 将R分为任意数量的点。本文使用21作为启发式方法(意思是将高度和宽度除以20);
  3. 裁剪多边形外的所有点;
  4. 对于其余部分,找到距边缘上任何点最远的点;
  5. 从这一点开始,定义一个具有较小间隔和界限的新R,并从第2步开始重复以获取任意精度的答案。本文将R减小2的平方根。

请注意,如何测试点是否在多边形内:解决问题的这一部分最简单的方法是将射线投射到该点的右侧。如果它穿过奇数个边,则位于多边形内。如果是偶数,就在外面。

此外,就测试到任何边缘的距离而言,您需要考虑两种情况:

  1. 该点垂直于该边缘上的点(在两个顶点的范围内);要么
  2. 不是。

(2)容易。到边缘的距离是到两个顶点的距离中的最小值。对于(1),该边缘上最接近的点将是从要测试的点开始以90度角与该边缘相交的点。请参见点到射线或线段的距离

2020-07-28