本文主要介绍<< Linear-time algorithms for visibility and shortest path problems inside simple polygons >>中计算多边形内所有顶点距离多边形内一点的最短路径树的线性算法
简单多边形 P P P
顶点个数 n n n
给定的源点 s s s
对于 P P P中的每个顶点 v v v
π ( s , v ) \pi(s,v) π(s,v)表示从s到v的最短欧几里得距离路径
Q s p Q_{sp} Qsp表示所有 π ( s , v ) \pi(s,v) π(s,v)的并集,也叫 P P P的最短路径树(shortest path tree)
G G G表示 P P P内的三角剖分
T T T表示 G G G的对偶图
令 d = u w d=uw d=uw表示 P P P中的一个对角线或边
令 a a a表示 u u u和 w w w在 Q s p Q_{sp} Qsp中的最近共同祖先
F = F u w = π ( a , w ) ∪ π ( a , w ) F=F_{uw}=\pi(a,w)\cup\pi(a,w) F=Fuw=π(a,w)∪π(a,w)表示对于 u w uw uw的通道, a a a为该通道的尖点(cusp)
π ( s , u ) \pi(s,u) π(s,u)和 π ( s , w ) \pi(s,w) π(s,w)都是外凸(outward convex)
计算多边形 P P P的三角剖分 ( O ( n ) O(n) O(n))
维持一个通道 F = F u w = [ u l , u l − 1 , . . . , a , w 1 , . . . , w k ] F=F_{uw}=[u_l,u_{l-1},...,a,w_1,...,w_k] F=Fuw=[ul,ul−1,...,a,w1,...,wk],其中 a = u 0 = w 0 a=u_0=w_0 a=u0=w0表示 F F F的尖点, π ( a , v ) = [ u 0 , . . . , u l − 1 ] , π ( a , w ) = [ w 0 , . . . , w k ] \pi(a,v)=[u_0,...,u_{l-1}],\pi(a,w)=[w_0,...,w_k] π(a,v)=[u0,...,ul−1],π(a,w)=[w0,...,wk], u l − 1 = u , w k = w u_{l-1}=u,w_k=w ul−1=u,wk=w
F F F存储在 finger tree中,可以 O ( l o g δ ) O(log\delta) O(logδ)的时间内搜索到元素x,也可以 O ( l o g δ ) O(log\delta) O(logδ)的时间内在元素x处分开两颗子树( δ \delta δ表示 x x x到最近finger的距离).维持一个指向a的指针 C U S P ( F ) CUSP(F) CUSP(F).
算法从s和相邻顶点 v 1 v_1 v1开始, C U S P ( F ) = s CUSP(F)=s CUSP(F)=s.
令 u u u和 w w w为 F F F的第一个和最后一个元素, a = C U S P ( F ) a=CUSP(F) a=CUSP(F).
令 Δ u w x \Delta uwx Δuwx为 G G G中以 u w uw uw为边且未被处理的唯一三角形