“构造禁区后,可把参考点交给可见图最短路。若膨胀后的障碍互相重叠,需要先合并边界;不能仍把相交障碍当成满足两两不交合约的独立输入。”
形式陈述
在带标准 Euclidean 内积的实平面上,有有限个两两不相交的简单多边形障碍,以及自由区域中的起点
建立可见图:顶点是
可见图中的最短路径恰好给出平面自由区域中的最短路径。若再有一个简单多边形作为外墙,只需同时要求可见线段留在外墙的闭区域中;同样的角点结论仍成立。与一般图最短路不同,关键工作在于证明这张有限图没有漏掉连续问题的最优解。
直觉
把一根细绳绕过障碍拉紧。没有碰到障碍的位置不可能保留弯折,因为两点之间的直线更短。落在一条障碍边中间的弯折也不是必要的:附近自由空间是一个半平面,仍可把两小段替成更短的直段。真正卡住绳子的只能是障碍角点。
严格说,取路径上一段没有障碍角点的局部区域。若它在自由内部,这里有一个小圆盘;若贴着边内部,则有一个自由半圆盘。两者均凸,把局部折线换成弦不离开自由空间。三角不等式说明,非共线折弯会严格缩短。因此最短路除了沿边界直行外,只能在角点改变方向。
每个相邻转弯点之间的直段可见,故一条连续最短路也是可见图中的路径。反过来,每条图边都经过自由性检查,图路径一定合法。两个最优值分别不大于对方,从而相等。对于有可行路的有限多边形环境,可以限制在某条已知可行路长度给出的有界区域内,利用有界长度曲线的紧性取得最短路;结论不是只对一个未必达到的下确界成立。
例子与边界
取
直达线段穿过两个障碍,不可加入图。第一块上方与第二块下方之间存在一条斜向通道。可见图的最短路径是
长度
其中两条水平边沿障碍边界行走,必须保留;把“接触任何边都算碰撞”作为统一规则,就会错误删除这份最优解。若任务真的要求严格正安全间距,应该先膨胀障碍或改变自由空间,而不是在一个允许贴边的模型中临时删边。
路线也不能根据每个障碍单独选择“较近的一侧”。绕第一块的方向会改变到第二块的到达方向;可见图让所有角点选择一起参加最短路比较。按原始图边长排序贪心连线并不保存最优子结构。
怎样核验一条擦边线段
一般位置下,可检查所有障碍边的严格交叉,再检查候选线段端点附近是否进入障碍,或用适当的内部点测试处理穿过障碍的弦。判断相交的符号来自方向测试,分类内部/边界则使用点内判定。
为使共线和多顶点接触也可审计,本单元的参考检查更直接:把候选线段与所有边界的交点写成参数
推论与应用
设障碍总顶点数为
在明确的一般位置合约下,逐边检查可做
对于无孔房间,可以先三角剖分,再用漏斗算法避开整张二次大小可见图。有限面积机器人则先通过Minkowski 和把碰撞转成参考点的禁区;转动机器人还增加姿态维度,不能继续只用本页二维点图。
参考资料
- Mark de Berg 等,Computational Geometry: Algorithms and Applications,第 3 版,2008,§15.1–15.2,点机器人最短路、可见图与构建算法。课程原书
- Dave Mount,CMSC 754 讲义,Lecture 31: Shortest Paths and Visibility Graphs,角点折线结构及图归约。