“对于无孔房间,可以先三角剖分,再用漏斗算法避开整张二次大小可见图。有限面积机器人则先通过Minkowski 和把碰撞转成参考点的禁区;转动机器人还增加姿态维度,不能继续只用本页二维点图。”
形式陈述
在带标准 Euclidean 内积的实平面中,给定无孔简单多边形
把每个三角形看成一个节点,共有对角线的两片相连。该图连通,并有
最短路不会离开通道后再回来。若它越出通道边界对角线,之后必须再次穿回同一条分隔对角线;把两次交点之间的绕行改成对角线上的直段,不会更长,非直绕行严格更短。因此只需在这条通道里拉紧路径。
每个门户写成
直觉
维护三份状态:已经确定的共同路径 tail,以及从其末点
新门户只替换一个端点。若新端点还能由当前 apex 看见,便收紧相应一侧;如果越过另一侧的第一条射线,就必须先绕过那一侧的第一个拐点。这个拐点从“可能要经过”变成“所有后续路径都必须经过”,于是移入 tail,成为新 apex。
例子与边界
不重新扫描旧门户的链算法
两条链用双端队列保存:链尾按后进先出顺序弹出,链首用于移动 apex。tail 最后一项与两链首项是同一个点。以下是替换左端为
- 只要
至少有两点,且 ,弹掉 的尾点 - 若
只剩 apex,检查另一链:只要 至少有两点,且 ,删除 的旧首点,把新首点加入 tail,并让 的唯一点改成新 apex - 若
不等于当前左端,将 加到 尾部
替换右端时,第一步条件改为
这些方向判断对应两种几何修复:尾端弹出删掉已经可以直连跨越的旧拐点;首端弹出则确认必须绕过的拐点。后者是推进最短路共同前缀,不是把所有已处理门户退回去再算一遍。
四个门户与两个真正拐点
仍用耳切页的十边形,取
第一步
第三门户把右端改成
第四门户把
核验程序记录六次新链点插入、三次删除、一次 apex 前移,旧门户重扫次数为零。独立可见图给出相同长度;每段也通过精确的自由区域检查。
推论与应用
链不变量说明每次删除都不会丢掉最短路:同侧非凸拐弯可由弦缩短,跨到另一侧则由通道边界强迫经过旧链的下一个拐点。剩余的尾与两条凹链继续描述到整个门户的最短路族,故归纳到目标点时得到最短路。
设通道有
从头计时,还需三角剖分、定位起终点、搜索对偶树。用单调划分剖分为
只保存左右两条射线、换 apex 后从某个旧门户重新开始的短实现,可能多次处理同一门户。它并不自动继承上述链记录的摊还证明。本页实现显式保留两条链,用删除计数证明线性。带孔区域的对偶图有环,任取一条通道只能得到该通道或同伦类别内的解,不能直接声称是全局最短。
参考资料
- Jeff Erickson,Shortest (Homotopic) Paths,2023,Triangulations and Dual Graphs、Sleeves、Growing Funnels 三节,链式漏斗与按删除次数计时。
- Der-Tsai Lee、Franco P. Preparata,Euclidean Shortest Paths in the Presence of Rectilinear Barriers,Networks 14,1984,393–410。原始路线来源;本页具体双链符号约定和坐标例由独立程序逐步核验。