用绳子连接板上钉子的算法

问题描述

我想知道是否存在针对此问题的现有算法,或者是否可以将其映射到现有算法。

问题

您处于2D模式,并且想要在木板上用钉子做一些弦乐艺术。为此,您从场景中的某个钉子开始,所有这些钉子都被不规则地放置在板上。然后,您可以绕着钉板不连续地线性移动,直到到达末端钉子。现在,您拧紧琴弦,并想知道琴弦的路径以及钉子触碰的钉子。

输出:拧紧的弦及其钉子的路径。

示例: 橙色路径是您在木板上所沿的线。绿线是最后拧紧的线。请注意,由于采用了路径,直接连接(例如从钉子X开始)是非法的。

Example

一个类推:您将绳索固定在木头上的树上。然后,您以线性片段围绕树木划线。您停在一棵树上,并用力拉绳索,以使它拉紧。

该问题似乎是最短路径问题,但有一个额外的约束,即只能使用某些节点/钉子。

解决方法

David Eisenstat提出的潜在解决方案:

多边形中最短的(同形)路径(请参见https://jeffe.cs.illinois.edu/teaching/comptop/2009/notes/shortest-homotopic-paths.pdf

在这里,我们将算法应用于原始示例。

第1步:交叉序列

使用Delaunay三角剖分,我们可以从输入钉子获得多边形P。然后,我们命名所有三角形交叉点(参见图片)并写下路径的顺序。

Polygon P and the path crossing triangles.

结果:ABCBDEFGHIJKLMNOPPQRSTU

第2步:还原

删除不必要的循环:

AB CC BDEFGHIJKLMNO PP QRSTU

-> A BB DEFGHIJKLMNOQRSTU

-> ADEFGHIJKLMNOQRSTU

第3步:袖子

套筒只是按顺序“粘合”在一起的渐缩交点序列中的所有三角形。

第4步:渠道

您基本上从头看漏斗的每个对角线,并反复确定到达特定点的最短路径,直到到达终点为止。

其他说明:本文建议不要按顺序明确使用这些步骤,因为您可以一次性完成这些步骤。此外,该算法还可以对循环进行一些修改。