问题描述
我想知道是否存在针对此问题的现有算法,或者是否可以将其映射到现有算法。
问题
您处于2D模式,并且想要在木板上用钉子做一些弦乐艺术。为此,您从场景中的某个钉子开始,所有这些钉子都被不规则地放置在板上。然后,您可以绕着钉板不连续地线性移动,直到到达末端钉子。现在,您拧紧琴弦,并想知道琴弦的路径以及钉子触碰的钉子。
输出:拧紧的弦及其钉子的路径。
示例: 橙色路径是您在木板上所沿的线。绿线是最后拧紧的线。请注意,由于采用了路径,直接连接(例如从钉子X开始)是非法的。
另一个类推:您将绳索固定在木头上的树上。然后,您以线性片段围绕树木划线。您停在一棵树上,并用力拉绳索,以使它拉紧。
该问题似乎是最短路径问题,但有一个额外的约束,即只能使用某些节点/钉子。
解决方法
David Eisenstat提出的潜在解决方案:
多边形中最短的(同形)路径(请参见https://jeffe.cs.illinois.edu/teaching/comptop/2009/notes/shortest-homotopic-paths.pdf)
在这里,我们将算法应用于原始示例。
第1步:交叉序列
使用Delaunay三角剖分,我们可以从输入钉子获得多边形P。然后,我们命名所有三角形交叉点(参见图片)并写下路径的顺序。
结果:ABCBDEFGHIJKLMNOPPQRSTU
第2步:还原
删除不必要的循环:
AB CC BDEFGHIJKLMNO PP QRSTU
-> A BB DEFGHIJKLMNOQRSTU
-> ADEFGHIJKLMNOQRSTU
第3步:袖子
套筒只是按顺序“粘合”在一起的渐缩交点序列中的所有三角形。
第4步:渠道
您基本上从头看漏斗的每个对角线,并反复确定到达特定点的最短路径,直到到达终点为止。
其他说明:本文建议不要按顺序明确使用这些步骤,因为您可以一次性完成这些步骤。此外,该算法还可以对循环进行一些修改。