具有正交边缘(凸面或凹面或有孔)的多边形内的最远点

时间:2018-04-30 17:26:40

标签: algorithm geometry polygon computational-geometry

我有一组代表单一形状的非交叉矩形。所有矩形边都是垂直或水平的。有些矩形是相邻的,有些是不相交的。通过从单个其他矩形中剪切出类似定向的矩形来导出该集合。如何找到距离新形状边缘最远的所有点?

最远,我指的是给定连接多边形A中的一个点P(因此我们忽略所有不包含A的不相交多边形;给定非交叉点只会有1)B内没有P点,BP边缘上任意点的最小距离大于A的最小距离{ {1}}。

这是我认为我必须做的事情:

  1. 对相邻的矩形进行分组。
  2. 将多个相邻的矩形转换为单个不规则多边形,该多边形可以是凸面或凹面,也可以包含孔,但只有正交边。问题:如何表示漏洞?是否应移除孔(3)?如何在保持边缘正交的同时去除孔?

    • 可能更容易并行执行步骤1和2。
  3. 对于每个多边形,应用一种算法,该算法返回距离该多边形边缘最远的点,以及最小距离。

  4. 过滤所有最小距离最大的点;结果就是这样。

  5. 假设这是正确的,最好的算法是什么(3),它如何影响答案的其余部分?仅通过垂直或水平边缘简化了问题吗?

    最好的,我的意思是最简单或最快。

    插图:

    Furthest Points Example

    编辑v1:

    所以我用google来解决这个问题,找到了几种方法

    算法

    1. Voronoi图 - >内侧轴

      线段(而不是点)的voronoi图由中间轴段(线或抛物线弧)和从多边形的每个顶点到中轴的顶点的(反射)线组成。有关voronoi图,中轴和最大内切圆问题之间关系的概述,请参阅this stackoverflow answer (#2)。另见下文。

      1. 使用"A Sweepline Algorithm for Voronoi Diagrams"O[n*log(n)]

        无论孔洞如何,都可以使用凸多边形或凹多边形。构造多边形边缘的voronoi图。不幸的是会产生一组无序的线段(线条或抛物线)。在确定最大内切圆之前,将集合组织成图形结构。有关财富算法的详细概述,请参阅"Voronoi Diagrams and a Day at the Beach"

      2. 使用"Finding the Medial Axis of a Simple Polygon in Linear Time"O(n)

        适用于没有孔的简单多边形(凸面或凹面)。它看起来很复杂,所以我决定跳过这个。

      3. 使用"A Linear time algorithm for computing the Voronoi diagram of a convex polygon"O(n)

        仅适用于凸多边形,因此不适用于我的问题。有关详细信息,请参阅this stackoverflow answer (#1)

    2. 直骨架 - >中轴

      对于凸多边形,voronoi图和直骨架是相同的。因此,这些解决方案不适用于我的问题。

      1. 使用"STALGO"O[n*log(n)]。有关详细信息,请参阅this stackoverflow answer (#1)
    3. 蛮力,O(n^4)。请参阅this stackoverflow answer (#3)this stackoverflow answer (#2)

      1. 对于多边形边顶点的所有可能的三向组合(顺序并不重要):

      2. 为每组构建最大内切圆,即找到与所有三个中心点等距的中心点。

      3. 如果中心位于多边形之外,则丢弃结果。

      4. 如果任何其他边缘或顶点在圆圈内(或相交),则丢弃结果。

      5. 按圆半径排序;返回最大的圈子。

    4. Delaunay三角测量 - > Voronoi图 - >内侧轴

      应该可以从delaunay三角测量转换为voronoi图...但我还没有调查 edge 的voronoi图。如果几何库仅提供delaunay三角剖分,则此方法可能很有用。

    5. Voronoi图和最大内切圆

      我见过的每一个资源都声称最大内切圆触及多边形的三个面(顶点或边),因此最大圆的中心必须是中轴上的顶点。但这仅代表最大内切圆的子集。考虑一个矩形的中轴:

      Medial Axis of Rectangle

      沿着中轴的水平段具有中心的任何圆都是有效的最大内切圆。因此,如果中间轴段分隔两个最近的相邻单元格,并且这些单元格的相应多边形区段是平行的,则整个中间轴边缘代表单个点而不是单个点,表示最大内切圆的集合。

      直观地说,考虑到多边形边缘与最近邻居单元格的可能组合,我认为这是如何工作的:

      • line,line,parallel:中轴是一条线,代表可能的最大内切圆的集合。

      • 线,线,不平行:中轴是一条线。像往常一样,该线的端点必须至少有两条连接回多边形的反射线。可能的最大内切圆以具有最长反射线的端点为中心。

      • line,point:中轴是抛物线。如上所述,使用反射线来确定可能的最大内切圆的中心。 (*)

      • 点,点:与上述相同。 (*)

        不确定最后两个

      这就是上面详述的蛮力方法不完整的原因。

      正交多边形

      尽管存在正交约束,但我无法找到任何更简单的算法来构建中轴。一篇论文使用此约束来为中轴提供更稳定的替代方案:"Skeletal representations of orthogonal shapes"

      编辑v2:

      我想知道是否有可能以this stackoverflow approach - 基于"Poles of Inaccessibility: A Calculation Algorithm for the Remotest Places on Earth"来调整我的输入(绿色)矩形(而不是正方形),同时保证绝对最大内切圆。

0 个答案:

没有答案