检测两种几乎简单的多边形


22

我感兴趣的决定给定的非简单的多边形是否是复杂性几乎简单,在任何两个不同的正式感官:弱简单或者非自交。由于这些术语尚未广为人知,因此让我从一些定义开始。

  • 多边形 是线段的闭合循环连接一些有限序列在平面上的点的。点称为多边形的顶点,线段称为多边形的边。我们可以通过仅按顺序列出其顶点来指定任何多边形。Pp0,p1,p2,,pn1pipipi+1modn

  • 如果所有n个顶点都不同并且边仅在其端点处相交,则多边形很简单。等效地,如果多边形对圆是同胚的,并且每个边的长度都为正,则该多边形是简单的。但是,通常,多边形的顶点和边缘可以任意相交,甚至重合。1个n

  • 考虑两条多边形路径AB,它们的交点是两者的共同子路径(可能是一个点)。我们说,如果AB的端点A(0),B(0),A(1),B(1)在公共子路径A \ cap B的邻域边界上交替,则A B 交叉。如果多边形具有两个交叉子路径,则该多边形是自交叉的,否则具有 非自交叉的2A(0),B(0),A(1),B(1)AB

  • 如果多边形是一连串简单多边形的极限,则多边形是弱简单的;或者等效地,如果顶点的任意小扰动使多边形简单,则多边形是简单的。每个弱简单多边形都是非自相交的。但是,一些非自相交的多边形并不是那么简单。

例如,考虑以下所示的六个点a,b,p,q,x,y

在此处输入图片说明

  • 多边形abpqyz很简单;见左图。

  • 多边形papbpqyqzq很弱;中间的图显示了附近的简单多边形。但是,此多边形并不简单,因为它访问了p三次。

  • 多边形是自交的,因为子路径和交叉。见右图以获得一些直觉。b p q z y q p apapbpqzqyqbpqzyqpa

  • 最后,多边形(绕中间多边形缠绕两次)是非自交叉的,但并不是那么简单。直观地,此多边形的转弯数为,而任何简单多边形的转弯数必须为。(形式上的证明需要进行一些案例分析,部分原因是实际上对于角为多边形,转数实际上没有很好地定义!)± 2 ± 1 0 papbpqyqzqpapbpqyqzq±2±10

更新(9月13日):在下图中,多边形是非自交叉的,并且具有转弯数字1,但是并不是那么简单。多边形可以说有几个交叉的非简单子路径,但没有交叉的简单子路径。(我之所以说“可以说”,是因为目前尚不清楚如何定义两个非简单步行的时间!)abcabcxyzxpqrxzyx

在此处输入图片说明

最后,这是我的实际问题:

  • 我们能多快确定给定的多边形是否非自交叉?

  • 我们多快可以确定给定的多边形是否是弱简单的?

可以在时间内解决第一个问题,如下所示。由于存在个顶点,因此存在个顶点到顶点子路径;我们可以测试任何特定的子路径在时间内是否简单(通过蛮力)。对于每对简单的顶点到顶点子路径,我们可以测试它们是否在时间内交叉。但这不可能是最好的算法。n O n 2O n 2O(n5)nO(n2)O(n2)O(n)

我不知道第二个问题是否可以在多项式时间内解决。我想我可以为任何非简单的多边形快速计算一个定义明确的转向数(除非多边形边缘的并集只是一条路径,在这种情况下多边形必须是弱简单的)。请参阅下面的答案。 然而,上面的新示例多边形意味着非自交和车削数1也暗示弱简单。

我们可以通过检查每对边的相交来确定给定的多边形在时间内是否简单,或者使用标准扫掠线算法在时间内甚至在时间内确定是否简单使用Chazelle的三角剖分算法。(如果输入多边形不是简单的,则任何三角剖分算法都将引发异常,无限循环或生成不是有效三角剖分的输出。)但是这些算法都不能解决我要解决的问题。 O n log n O n O(n2)O(nlogn)O(n)


1布兰科·格伦鲍姆(BrankoGrünbaum)。 多边形:Meister是对的,而Poinsot是错的,但是占了上风Beiträgezur代数与几何 53(1):57–71,2012年。

2参见,例如:Erik D. Demaine和Joseph O'Rourke。 几何折叠算法:链接,折纸,多面体。剑桥大学出版社,2007年。


我不明白为什么有人会否决这个问题?
卡夫

我可能完全误解了这个问题,所以也许这已经过去了,但是在我看来,计算顶点的方式意味着第二个问题一定要花费指数时间。让我解释一下:在最后一个示例中,您多次使用相同的顶点。构造具有指数数量的唯一循环的图似乎很容易。
2012年

如果您的输入是如示例中给定的多边形,则输入的顶点数可能是指数的,而无需重复循环。如果图包含您的示例图(2和3)作为子图,则它具有非交叉的循环和交叉的循环。因此,您需要读取整个字符串以确保没有任何交叉循环(可能包括也可能不包括)。在最坏的情况下,这需要花费时间。n
Joe Fitzsimons,2012年

1
@JoeFitzsimons:输入只是点的序列(即,成对的实数),不需要区分。输入大小是此序列的长度,而不是唯一点的数量。n
杰夫·杰夫·2012年

2
@Kaveh:也许太抽象/专业化了?字太多?我应该指定点Ga,Ka,Naa,Taa,Tin,Khat吗?
杰夫·2012年

Answers:


2

似乎第一个问题有算法(尽管这也可能不是最优的)。假设有一个交叉点,找到它的关键似乎是必须找到的边缘是那些在公共子路径两侧的边缘。因此,我们查看所有连续的边对。其中有二次数。如果我们找到一对顶点为和的边对,使得边和相同,则我们遵循公共子路径到末端并检查离开它的边。如果它们与和一起形成交叉O(n3)abcdefbcefabde,那么我们就完成了,否则我们继续下一对。遵循公共子路径最多是线性时间操作,因此整个算法为。O(n3)

由于线对公共子路径的对数不是线性的,因此该分析可能并不严格。其中应该只有一个常数。类似地,如果最长公共子路径的长度是恒定的,那么就遵循公共子路径的时间量而言,我们还可以。我希望最糟糕的情况是当子路径共有一个长度为路径时。然后有交互,并且在每个交互中都遵循边。因此,即使如此,跟随的边数仍为O(n)O(n)O(n)O(n)o(n2),界限由对数提供。因此,我猜想该算法的真正界限是。O(n2)


1
“遵循公共子路径最多是线性时间操作……”这是真的吗?请记住,子路径不相同。一个可能会沿着另一个的图像来回折叠。事实上,对我来说,甚至还不清楚。
帕特莫林2012年

好点子。作为预处理步骤,可以将多边形设置为某种标准形式吗?我们将忽略立即折回自身的路径以及与其直接相邻的共线的顶点。然后,您引用的句子将得到更好的定义-公用子路径由具有相同顶点的边组成,并且您知道完成操作是因为您碰到了不同的顶点。证明答案在标准形式的多边形中保持不变应该不太难。
克里斯·格雷

@ChrisGray:也许吧,但并不像您建议的那么容易。如果的图像是一棵树,则递归消除所有的折返最终会将减少到一个点。PPP
杰夫斯

是的,您是对的,这个想法行不通。您上面给出的最右边的数字将减少为一个点。
克里斯·格雷

我打算让赏金到期;一半的分数将自动授予该答案。
Jeffε

2

根据Pat Morin的建议,这是我计算转数的想法。抱歉,这有点草率;我仍在与魔鬼符号作斗争。此外,帕特(Pat)对克里斯(Chris)的回答的评论表明,我已经忽略了一些重要的退化案例。但是无论如何我都会在这里发布,以防其他人发现它有用。

对于任何索引,令θ p i= θ p i 1p ip i + 1表示顶点p i处的有符号外角;这是光线之间的角度逆时针方向p - 1个 p p p + 1,归一化到范围- π θ iθ(pi)=θ(pi1,pi,pi+1)pipi1pipipi+1。(所有指数算术是隐式模 Ñ。)的转动数目 P被定义为 Ť ù ř Ñ P = 1πθiπnP 让我打电话给一个顶点p一个鞭策,如果内部的角度p等于0支点处的外角θi不确定。它可以是π-π。更一般地,的转动数P被良好定义的,当且仅当P没有杂散(没有重复顶点p=

Turn(P)=12πi=0n1θ(pi).
pipi0θiππPP)。如果定义明确,不难证明 T u r n P 是整数。特别地,如果 P是简单多边形,则 T u r n P ± 1pi=pi+1Turn(P)Turn(P)=±1P

现在假定含有以下形式的步行p [R 小号 - [R q,其中p q和路径ř 小号是路径的反转小号 ř。则s是一个刺激。称rs。在这种情况下,让我限定在外部角度小号如下: θ小号= π ·&小号ÑPprsrqpqrssrsrss(但是,如果 θ p - [R q = 0?正如帕特指出,这实际上可以发生。也许有某种递归的方式来定义θ小号

θ~(s)=πsgnθ(p,r,q)={πif θ(p,r,q)>0πif θ(p,r,q)<0
θ(p,r,q)=0θ~(s) 即使在这种情况下,但我不知道它是什么。)

如果是弱简单,然后有一个简单Ñ边形P任意接近P ; TET Ş是顶点P最接近P。作为P接近P,在内部角度小号接近零。不难证明(通过感应上的长度- [R 小号),外部角θ 小号接近θ小号PnP~Ps~P~PP~Ps~rsθ(s~)θ~(s)

如果完全由散步,接着其反转,- [R 小号 - [R ,则外部角度在骨刺ř小号仍然不明确。但是,在这种情况下,我相信P是弱简单,当且仅当步行[R Ş非自交。 (在更复杂的情况下,我无法定义一个合理的修改的转弯数,尤其是如果多边形在一次走动中来回徘徊。但是在所有此类情况下,当且仅当多边形处于是非自我穿越。)PrsrrsPrs

否则,如果我们定义任何非正顶点p ,我们现在有良好定义的旋转数Ť ù ř ÑP = Σ θp / 2 π = Ť ù ř ñ P,它必须是± 1,如果P是弱简单。θ~(pi)=θ(pi)piTurn~(P)=iθ~(pi)/2π=Turn(P~)±1P

我不再确信可以以线性时间来计算。主要的困难是步行[R 小号本身可以包含马刺。在最坏的情况下,通过蛮力找到每个杂散的根的幼稚算法实际上需要Θ n 2时间。考虑一个具有长度为Ω n 的子步的n -gon,该子步仅在两个点之间交替。Turn~(P)rsΘ(n2)nΩ(n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.