Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有正交边(凸或凹或有孔)的多边形内的最远点_Algorithm_Geometry_Polygon_Computational Geometry - Fatal编程技术网

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

Algorithm 具有正交边(凸或凹或有孔)的多边形内的最远点,algorithm,geometry,polygon,computational-geometry,Algorithm,Geometry,Polygon,Computational Geometry,我有一组表示单个形状的非相交矩形。所有矩形边要么垂直,要么水平。有些矩形是相邻的,有些是不相交的。该集合是通过从单个其他矩形裁剪出类似方向的矩形而得到的。如何查找距离新形状边缘最远的所有点 所谓最远,我指的是给定连接多边形p内的点a(因此我们忽略所有不包含a的不相交多边形;给定非相交多边形将只有一个)使P内没有点B,从B到P边缘上任何点的最小距离大于与A相同的最小距离 这就是我想我必须要做的: 将相邻矩形分组 将多个相邻矩形转换为单个不规则多边形,该多边形可以是凸多边形,也可以是凹多边形,可能包

我有一组表示单个形状的非相交矩形。所有矩形边要么垂直,要么水平。有些矩形是相邻的,有些是不相交的。该集合是通过从单个其他矩形裁剪出类似方向的矩形而得到的。如何查找距离新形状边缘最远的所有点

所谓最远,我指的是给定连接多边形
p
内的点
a
(因此我们忽略所有不包含
a
的不相交多边形;给定非相交多边形将只有一个)使
P
内没有点
B
,从
B
P
边缘上任何点的最小距离大于与
A
相同的最小距离

这就是我想我必须要做的:

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

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

    • 问题:如何测试点是否在多边形内

    • 答复:

  • 过滤所有具有最大最小距离的点;这些都是结果

  • 假设这是正确的,那么最好的算法是什么(3),以及它如何影响答案的其余部分?仅具有垂直或水平边缘是否简化了问题

    我所说的最好,是指最简单或最快的

    说明:

    编辑v1:

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

    算法
  • Voronoi图->中轴

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

  • 使用,
    O[n*log(n)]

    适用于凸多边形或凹多边形,与孔无关。为多边形的边构造voronoi图。不幸的是,生成了一组无序的线段(直线或抛物线)。在确定最大内切圆之前,将集合组织成图形结构。有关fortune算法的详细概述,请参阅

  • 使用,
    O(n)

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

  • 使用,
    O(n)

    仅适用于凸多边形,因此不适用于我的问题。有关更多信息,请参阅

  • 直骨骼->中轴

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

  • 使用,
    O[n*log(n)]
    。有关更多信息,请参阅
  • 蛮力,
    O(n^4)
    。见和

  • 对于多边形边和顶点的所有可能的三向组合(顺序无关紧要):

  • 为每个集合构建最大内切圆,即找到与所有三个集合等距的中心点

  • 如果中心位于多边形之外,则放弃结果

  • 如果任何其他边或顶点位于圆内(或相交),则放弃结果

  • 按圆半径排序;返回最大的圆

  • Delaunay三角剖分->Voronoi图->中轴

    应该可以将delaunay三角剖分转换为voronoi图。。。但我还没有研究过边的voronoi图。如果几何体库仅提供delaunay三角剖分,则此方法可能非常有用

  • Voronoi图与最大内切圆 我看到的每个资源都声称最大内切圆接触多边形的三个面(顶点或边),因此最大圆的中心必须是中轴上的顶点。但这只表示最大内接圆的子集。考虑矩形的中轴:

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

    直观地说,我认为这就是它的工作原理,考虑到多边形边与最近邻单元的可能组合:

    • 线,线,平行:中轴是一条线,它代表一组可能的最大内接圆

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

    • 直线、点:中轴为抛物线。如上所述,使用反射线确定可能的最大内切圆的中心。(*)

    • 点,点:同上。(*)

      不知道最后两个

    这就是上文详述的暴力手段不完整的原因

    正交多边形 尽管有正交约束,我还是找不到任何更简单的算法来构造中轴。一篇论文使用了这个约束