软件学报
JOURNAL OF SOFTWARE
1999年 第10卷 第7期　No.7 Vol.10 1999



三维空间中的最短路问题
施　海　虎
　　摘要　在包含一组相互分离凸多面体的三维空间中为任意两点寻找最短路的问题是NP问题.当凸多面体的个数k任意时,它为指数时间复杂度;而当k=1时,为O(n2)（n为凸多面体的顶点数）.文章主要研究了k=2情形下的最短路问题,提出一个在O(n2)时间内解决该问题的算法.所得结果大大优于此情形下迄今为止最好的结果――O(n3logn).另外,将此结果应用到k>2的情形后,获得的结果为O(∑x12i-1n2i).
　　关键词　最短路,凸多面体,计算几何,测地线,Voronoi图.
　　中图法分类号　TP301
The Problem of Shortest Path in 3D Space
SHI Hai-hu
(Hisense Technique Research Center　Qingdao　266071)
(Department of Computer Science and Technology Beijing University Beijing 100871)
　　Abstract　 The problem of computing the euclidean shortest path between two points in the three dimensional space bounded by a collection of convex disjoint polyhedral obstacles is known to be NP-hard and in exponential time for arbitrarily many obstacles. It can be solved in O(n2) time for single convex polyhedron obstacle (here n is the total number of vertices of polyhedron). In this paper, the author mainly researchs the shortest problem of the case of two convex polyhedral obstacles, and presents an algorithm that solves this problem in O(n2) time, and improves improving significantly previous best result O(n3logn) for this special case. On the other hand, the author also presents a better result O(∑x12i-1n2i) for the problem of shortest path amidst a fixed number of convex polyhedral obstacles.
　　Key words　Shortest path, convex polyhedron, computing geometry, geodesics, Voronoi graph.
　　近年来,最短路问题作为运动规划的基本问题之一.在机器人、野外航行、工业自动化和计算机动画等领域中越来越受到人们的关注.通常,在包含一组已知障碍物的环境中为一个给定智能系统寻找最优避碍路径是相当困难的.但是,当将障碍物看成凸多面体、将智能系统看成移动点时,最短路问题就变成可解的了.
　　对于二维空间中的最短路问题,采用可视图的办法可以在O(n2)时间内计算出最短路［1］；在三维空间中,求解该问题则变得十分困难.在包含一组相互分离凸多面体的三维空间中为任意两点寻找最短路的问题是个NP问题［2］.当k任意时,指数时间复杂度是最好的结果［3］；当k固定时,该问题就简单了.文献［4］对k=1时的问题最早进行研究,并给出O(n3logn)的算法.后来,这个结果被文献［5］改进到O(n2)；对于k=2和k>2的情形,目前最好的结果仍为O(n3logn)［6］和O(n4k)［7］.
　　在本文中,我们将文献［1］的技术推广到k=2的情形,提出一个在O(n2)时间内解决该问题的算法.本文第1节简要介绍k=1情况下的最短路问题,第2节重点介绍我们在k=2情况下的工作,最后给出几个重要结果（包括k>2的情况）.
1　单个凸多面体表面上的最短路问题
　　设P是一个给定的凸多面体,S是P的表面,n为P的顶点数,我们用n表示P的复杂度.单个凸多面体表面上的最短路问题,即给定始点X∈S,对于任意点Y∈S,要求计算沿S从X到Y的最短路.
　　为了处理问题方便起见,需要将S进行三角剖分,得到一个新的凸多面体P′,使X也成为P′的顶点,这个过程的时间复杂度为O(nlogn)［8］.另外,P′的复杂度不变,即P的顶点数为O(n).
　　本文使用如下定义.
　　(1) 点Y∈S被称为ridge点(相对于给定的始点X),如果在S上至少存在两条从X到Y的最短路.我们用R表示S上所有ridge点的集合.
　　(2) 对于任意点Y∈S-R,Π(X,Y)(简记为Π(Y))表示从X到Y的唯一最短路.
　　(3) 序列ξ=(ξ1,...,ξm)表示Π(Y)沿S穿过的边所构成的边序列；f=(f0,...,fm)表示Π(Y)沿S穿过的面所构成的面序列,其中ξi＝fi-1∩fi,i=1,...,m；X∈f0,Y∈fm(如图1所示).

图1　单个凸多面体上最短路的边、面序列
　　(4) 给定Π（Y）的边序列和面序列,可以将f0,...,fm展开到同一个平面L中.其具体做法可通过一个循环过程来描述.首先将面f0放在L中,使X与初始位置一致；假设我们已经将f0,...,fi-1展开,并且都放入L中,那么可以沿着ξi将fi展开,使之与fi-1同面,这时,fi也处于L中,并且处于ξi的另一边.我们称L为ξ的展开平面,并记X,Y,ξ,f 在L中的映射为X′,Y′,ξ′,f′（如图2所示）.

图2　ξ的展开平面及影子的说明
　　(5) 影子shadow(X′,ξ′i,ξ′i+1),即在L上,ξ′i以X为源点在ξ′i+1上的影子（如图2所示）. 
　　当i=0时,shadow(X′,Φ,ξ′1)={Y′｜Y′∈ξ′1},其中Φ表示空集合；
　　当0<i<m时,shadow(X′,ξ′i,ξ′i+1)={Y′｜Y′∈ξ′i+1,并且直线段X′Y′依次与ξ′1,...,ξ′i相交}.
　　我们将shadow(X′,ξ′i,ξ′i+1)在S上的映射shadow(X,ξ′i,ξ′i+1)称为ξ′i以X为源点在ξ′i+1上的影子.
　　(6) 影子shadow(X′,ξ′i,f′i),即在L上,ξ′i以X为源点在f′i上的影子（参见图2）.
　　当i=0时,shadow(X′,Φ,f′0)={Y′｜Y′∈f′0},其中Φ表示空集合；
　　当0<i<m时,shadow(X′,ξ′i,f′i)={Y′｜Y′∈f′i,Y′ξ′i,并且直线段X′Y′依次与ξ′1,...,ξ′i相交}.
　　我们将shadow(X′,ξ′i,f′i)在S上的映射shadow(X,ξi,fi)称为ξi以X为源点在fi上的影子.注意, shadow(X,ξi,ξi+1)=shadow(X,ξi,fi)∩ξi+1,并且影子可能为空.
　　这里列出单个凸多面体表面上最短路的若干拓扑特性［4］：
　　(1) 最短路不会通过P的顶点（始点或终点为顶点的情况除外）；
　　(2) 最短路与P的每条边（或每个面）的交点（或交线）最多不超过1个（或1条）；
　　(3) 最短路不会自我相交；
　　(4) 任何两条具有相同始点的最短路,要么互不相交,要么其中的某条是另一条的子路；
　　(5) 在凸多面体表面任意两点之间一定存在测地线,连接这两点之间的最短路是测地线；
　　(6) 如果测地线与边序列相交,那么此测地线在ξ的展开平面上是一根直线段.
　　计算Π(Y)的问题可分解成下面两个子问题,即求解了这两个子问题,等价于求解了最短路问题：
　　(1) 求Π(Y)的边序列ξ；
　　(2) 计算Π(Y)与ξ中各条边的交点.
　　根据测地线的展开性,第2个子问题容易解决.而解决第1个子问题的一般方法是：给定X,希望对P进行预处理后,对于任意目标点Y,能够快速计算出从X到Y的最短路.通常,预处理所需要的时间决定了最短路问题的时间复杂度.文献［1］用序列树(sequence tree)的方法来解决找ξ的问题,并提出“一个角一个分叉”算法来构造序列树,用该算法生成的序列树的层数为n,并且每一层的宽度为O(n).该算法的主要思路是：给定凸多面体P及其表面S,对于S上的始点X,求沿S从X到任意点Y∈S的最短路.首先,构造X的序列树,序列树的根结点为X,非根结点为具有相同最短路边序列的点集；其次,从序列树上找出Y所对应的结点,则由从该结点出发到根结点的所有边构成的序列即为X到Y最短路的边序列；最后,根据测地线性质,求出最短路与该边序列中各条边的交点.
2　两个凸多面体间的最短路问题
　　给定两个相互分离且悬空的凸多面体P1,P2,它们的表面和顶点数分别为S1,S2和n1,n2；并给定X∈S1,对于任意点Y∈S2,要求计算沿S1和S2从X到Y的最短路Π(Y).下面针对该问题进行讨论.
　　两个凸多面体间的最短路具有如下拓扑特性［5,6］：
　　(1) 最短路包含3个子段：沿S1从X到“起飞点”t∈S1的最短路、从t到“着落点”l∈S2的直线段以及沿S2从l到Y的最短路(如图3所示).

图3　两个凸多面体间的最短路
　　(2) 若X与l可视（两点可视,即它们的连线与P1,P2的内部无任何交点）,则t=X；若t与Y可视,则l=Y；除非t=X（或l=Y）,否则t（或l）处于对应多面体表面的边上.
　　(3) 最短路不会经过S1,S2上的任何顶点（X,Y本身是多面体顶点和X与Y可视这两种情况除外）.
　　在最短路的3段子路中,第2段为直线段；第1、3段属于单个凸多面体情形,可使用文献［5］的算法来计算.因此,两个凸多面体间的最短路问题可归结为找起飞点和着落点的问题.设最短路所经过的边序列为ζ=(ζ1,...,ζm1+m2),其中ζ1,...,ζm1∈S1,ζm1+1,...,ζm1+m2∈S2,t∈ζm1,l∈ζm1+1,则该最短路问题又可分为下面两个子问题：
　　(1) 找起飞点t和着落点l所在的边ζm1,ζm1+1；
　　(2) 找起飞点t和着落点l.
　　根据文献［6］中关于两条边可视的定义可得：
　　(1) 设点X∈S1与边ξi∈S2可视,那么,ξi最多可分成两段,使其中的某段与X可视,而另一段与X不可视；
　　(2) 设边ξ1∈S1与ξ2∈S2可视,那么,ξ1最多可分成3段,使其中的某段与ξ2不可视,而另两段与ξ2可视.对于ξ2亦然.
　　为了便于讨论,我们将半平面记为f(l),其中l为半平面的边；将半平面f(l)的补记为f*(l),它也是一个半平面,与f(l)位于同一个平面上,边相同,但方向相反；将三角面记为fABC(BC)（简记为f(BC)）.
　　两个平行半平面上两点间的最短路问题：即设半平面f(l1)与f(l2)相互平行,并且互不相交,并设点X∈f(l1),Y∈f(l2),要求计算从X到Y依次经过l1、l2的最短路.因为在X∈l1、两个半平面同面以及l1与l2平行这3种情形下的最短路问题容易求解,所以在以后的讨论中假定X,Y不在半平面的边上,两个半平面不同面,并且它们的边不平行.
　　作为预备性知识,这里先给出若干性质.
　　定理1. 给定平面L以及直线l1,l2,它们满足：
　　(1) l1∈L；
　　(2) l2L,但与L平行；
　　(3) l1与l2既不平行,又不垂直.
那么,点X∈l2以l1为轴旋转后与L相交于点X1、X2,当X遍历l2上所有点时,其对应的所有X1,X2所构成的轨迹为双曲线.
　　证明：略.
　　双曲线具有如下性质：
　　定理2. 设W为双曲线x2/a2-y2/b2=1(x>0)；对于任意点x<0,从x出发的任意两条射线最多将W分割成5段,而这两条射线之间最多包含3条曲线段.
　　证明：略.
　　在后面的讨论中,假定两条射线之间只有1条曲线段,即从X出发的每条射线最多只与双曲线相交于一点.对于包含3条曲线段的情况,只要将下面的过程重复3次即可讨论完毕.
　　根据定理1和定理2可得：
　　定理3. 对于两个平行半平面间的最短路问题,设X到Y的最短路与l1,l2的交点为A,B,并设以l1为轴,l2的旋转轨迹与f*(l1)的交线为W2；以l2为轴,l1的旋转轨迹与f*(l2)的交线为W1；点A绕l2旋转后与W1相交于A′；点B绕l1旋转后与W2相交于B′,则在包含f(l1)的平面L1内,X,A,B′三点共线；在包含f(l2)的平面L2内,A′,B,Y三点共线(如图4所示).

图4　三点共线定理
　　证明：根据单个凸多面体最短路的特性（6）即可证明.
　　根据定理3可得：
　　定理4. 对于两个平行半平面间的最短路问题,设Y1,Y2∈f(l2)(Y1≠Y2),X到Y1(Y2)的最短路与l1,l2的交点分别为A1,B1(A2,B2)；并设以l1为轴,l2的旋转轨迹与f*(l1)的交线为W2；以l2为轴,l1的旋转轨迹与f*(l2)的交线为W1；点A1,A2绕l2旋转后与W1相交于A′1,A′2；点B1,B2绕l1旋转后与W2相交于B′1,B′2；设f(l1)∈L1,f(l2)∈L2（如图5（a）所示）,则在L2内,A′1Y1与A′2Y2互不相交.

图5　不相交定理
　　证明：设l1与l2的公垂线l与l2相交于O,过O在平面L2上作l1的平行线l′1；以公垂线l为Y轴,l′1为Z轴,过O垂直于l1,l′1的直线为X轴建立右手直角坐标系；设l′1与l2的夹角为α,并将X,曲线W2垂直投影到L2上,得到如图5(b)所示的投影图.于是,在平面（X-Z坐标系）中,l′1,l2,W1,W2的方程分别为：
　　　　　　　　　　l′1:x=0,
　　　　　　　　　　l2:x=tgα.z,
　　　　　　　　　　W1:(tg2α-1)*x2+2tgα*xz+a2=0(x<0),
　　　　　　　　　　W2:x=(a2+tg2α*z2)1/2,
其中a为直线l1,l2间的距离.很显然,W1(W2)上的点与l2(l′1)上的点一一对应.
　　设A1,A2,B1,B2,A′1,A′2,B′1,B′2的坐标分别为
　　　　(z1,x1),(z2,x2),(z3,x3),(z4,x4),(z5,x5),(z6,x6),(z7,x7),(z8,x8).
　　根据前面的假设,从X出发的每条射线最多只与W2相交于1点,那么A1与B1′一一对应,即A1与B1一一对应.同理可得A2与B2一一对应.因此,假设z1<z2,那么可得z3<z4,z5<z6,z7<z8.
　　(1) 若A′1B1与A′2B2相交,则A1B′1与A2B′2相交,这与A1B′1,A2B′2是从X出发的两条射线上的两条线段矛盾.
　　(2) 若B1Y1与B2Y2相交于D,那么从X到D存在两条最短路,这与最短路的唯一性矛盾.
　　上述两点证明了线段A′1Y1与A′2Y2要么重合,要么互不相交.　　□
　　在两个平行半平面间的最短路问题中,如果存在线段ξ1∈l1,ξ2∈l2,那么最短路与l1,l2的交点可能会落在ξ1,ξ2的端点之外.在这种情况下,如果要求最短路必须经过线段ξ1,ξ2,那么最短路将不得不经过线段的端点位置.此时,如果最短路必须通过的端点已知,那么上述的最短路问题可分解成若干个子问题,其中的每个子问题都是计算两点间的最短路问题,而根据前面的分析,这些子问题都可以用很简单的算法计算出来.由此可引出下面的问题.
　　两个平行三角面间的最短路问题：给定平行且互不相交的两个三角面fABC(BC),fDEF(EF),要求计算从A到D,并依次经过BC,EF的最短路.
　　很显然,最短路Π(A,D)极有可能经过线段BC,EF的端点.若Π(A,D)经过线段的端点（不失一般性,设该端点为B）,则Π(A,D)可分解为Π(A,B)与Π(B,D).根据前面的讨论,Π(A,B)与Π(B,D)的计算相当简单,因此可得下面的结论：经过端点的最短路的计算是相当简单的.下面假定最短路不经过线段端点.

图6　定理5的说明
　　类似于两平行半平面间的最短路问题的讨论,可得：
　　定理5. 如图6所示,设三角面fABC(BC)∈L1,fDEF(EF)∈L2,W为BC绕EF旋转后在L2上的轨迹,A到E,F的最短路与BC的交点分别为G′,H′,而G′,H′在W上的对应点为G,H,l1和l2为分别通过点E,G和F,H的直线；并设从A到D的最短路为Π(A,D),那么：
　　(1) l1与l2相交于点O,并且O在线段FH之外；
　　(2) 若线段OD与EF相交（不包括端点E,F）,则Π(A,D)与EF相交且不交于端点；否则,Π(A,D)与端点E或F相交.
　　证明：设l′1和l″1为以E为源点、分别与矢量EG和GE同方向的射线；l′2和l″2为以F为源点、分别与矢量FH和HF同方向的射线；并设Π(A,D)与BC的交点为Q′,Q′在W上的对应点为Q,则：
　　(1) 取任意点Y1∈l′1和Y2∈l″1,则根据定理4,线段GY1与HY2互不相交,从而可得l1与l2要么平行,要么相交于FH之外的点.若l1与l2平行,显然W与EF平行,即BC与EF平行,这与假设矛盾,从而证明了定理的第1部分.
　　(2) 若D在由线段EF和射线l″1,l″2射线所构成的区域内（不包括l″1,l″2上的点）,则Π(A,D)与BC,EF的交点肯定在线段G′H′,EF内；否则,若Q落在曲线段GH之外,显然线段QD与HF或GE相交,这与定理4矛盾.
　　同理可证,若D在EF,l″1和l″2所构成的区域之外（包括l″1和l″2上的点）,则Π(A,D)与EF的交点为E或F.　　□
　　注意,在图6中,Π(A,D)的长度为｜AQ′｜+｜QD｜；并且沿DQ方向,DQ的延长线不一定经过点O.
　　因为可将X,ζ1,...,ζm1与ζm1+1,...,ζm1+m2,Y分别展开到平面L1与L2上,所以两个凸多面体间的最短路问题可描述为求从X∈L1到Y∈L2,依次经过线段ζm1,ζm1+1的最短路问题.若将X(Y)与ζm1(ζm1+1)的两端点相连构成三角形,则该最短路问题又可描述为求两平行三角形f(ζm1)与f(ζm1+1)间的最短路问题.
　　定理4和定理5说明,两个凸多面体间的最短路问题可归结为两个平行三角形间的最短路问题,即只要找到t与l所在的边（根据文献［5］,从序列树中找出Y所在的结点,即找到了最短路的边序列,也即找到了ζm1与ζm1+1）,就能在常数时间内求出t与l.参见定理3和图4,根据ζm1与ζm1+1求解t与l的算法可简单描述如下：根据测地线的展开性,由于X′,A,B′三点成直线,A′,B,Y三点成直线,解由两个直线方程构成的方程组即可求出A,B.
　　根据两条边可视性质的讨论,ζm1（起飞点t所在的边）与ζm1+1（着落点l所在的边）最多可分为3个子段,其中,ζm1上的两个子段（不妨设为seg1(t),seg2(t)）与ζm1+1上的两个子段（不妨设为seg1(l),seg2(l)）两两可视.根据定理2,seg1(t)以S为源点在seg1(l)和seg2(l)上的投影最多各有3个子段,即seg1(t)在ζm1+1上的投影最多只有6个子段；同理,seg2(t)在ζm1+1上的投影也最多只有6个子段.所以,ζm1以S为源点在ζm1+1上的投影最多只有12个子段,从而可得如下性质.
　　性质1. ζm1在ζm1+1上的影子最多只有12个子段.
3　结 论
　　将上面的性质应用到文献［5］的算法中,则该算法生成的序列树的层数为n1+n2,在第1层与第n1之间,树的宽度为O(n1)；在第n1+1层至第n1+n2层之间,树的宽度为O(12n2),由此可得如下结论.
　　定理6. 给定两个凸多面体P1,P2,它们的表面为S1,S2,顶点数为n1,n2；并给定点X∈S1,要求计算从X出发,沿S1,S2到任意点Y∈S2的最短路.此问题的解的时间复杂度为O(n21+12n22).
　　将此结果应用到给定固定数目的凸多面体中,则可以得到下面的结论：
　　定理7. 给定k个凸多面体P1,...,Pk,设它们的表面为S1,...,Sk,顶点数为n1,...,nk；并给定点X∈S1,要求计算从X出发,依次经过S1,...,Sk到任意点Y∈Sk的最短路.此问题的解的时间复杂度为O(∑x12i-1n2i).
　　致谢 本文的主要研究工作在中国科学院数学研究所完成,在此感谢各位领导和同志所给予的支持与帮助.
　　本文研究得到国家自然科学基金、国家863高科技项目基金和中国科学院院长特别基金资助.作者施海虎,1969年生,博士后,讲师,主要研究领域为人工智能,知识工程,计算机动画,软件工程,CAI.
　　本文通讯联系人:施海虎,青岛266071,青岛市江西路11号海信集团技术中心
　　作者单位：海信集团技术中心　青岛　266071；北京大学计算机科学与技术系　北京　100871
参考文献
　1　Lozano-Perez T, Wesley M A. An algorithm for planning collision-free paths among polyhedral obstacles. Journal of ACM, 1979,22:560～570
　2　Canny J, Reif J. New lower bound techniques for robot motion planning problems. In: Proceedings of the 28th Annual IEEE Symposium. New York: Foundations of Computer Science, IEEE, 1987. 49～60
　3　John H R, James A S. A single-exponential bound for finding shortest paths in three dimensions. Journal of ACM, 1994,41(5):1013～1019
　4　Sharir M, Schorr A. On shortest paths in polyhedral spaces. SIAM Journal of Computing, 1986,15:193～215
　5　Chen Jin-dong, Han Yi-jie. Shortest paths on a polyhedron. In: Proceedings of the 6th Annual Symposium on Computing Geometry. 1990. 360～369
　6　Baltsan A, Sharir M. On the shortest paths between two convex polyhedra. Journal of ACM, 1988,35(2):267～287
　7　Mount D M. The number of shortest paths on the surface of a polyhedron, SIAM Journal of Computing, 1990,19(4):593～611
　8　Garey M R, Johnsosn D S. Triangulating a simple polygon. Information Processing Letters, 1978,7(4):175～179
1997-11-11收到原稿 
1998-07-20收到修改稿
