我得到一组坐标。坐标的顺序有些随机,但坐标聚集到一起以形成不同的区域。我正在努力创建一个算法来创建具有正确顺序坐标的单个路径。我一直在寻找寻路和图像处理解决方案来解决这个问题,但到目前为止还没有运气。
坐标可以如下所示。
任何人都可以提供一些帮助来创建算法来将这些坐标(按照正确的顺序)排序到路径中吗?
答案 0 :(得分:1)
一个解决方案:
重复此操作,直到图像为空。
然后您将拥有一组路径。
答案 1 :(得分:1)
这个问题看起来有点挑战,因为其中一条路径实际上是由两个循环组成的。如果选择了正确的起始位置,在此图像中仍然可行,但请考虑这一点:
XXX XX XXX XXXXX
X X X XXX X X X
X X X X X XXXXX X
XXX XX XX X XXXX
XXXXXXX XX
很容易看出,通过任意路径,我们最终会得到Königsberg的七座桥。(顺便说一下,由于桥梁数量的一些变化,现在可以解决这个问题......)
如何更改问题以使其可解决至少有两种可能性:
查找路径段并不是很具挑战性,但是将它们组合成循环需要更详细地定义问题。
在路径寻找中,我们需要能够确定路径将从属于路径的单个点的所有方向。这可以通过考虑像素的所有可能的3x3邻域来完成。
还有一个要求:如果路径从像素A到相邻像素B,则这两者之间必须存在反向路径。这一要求缩小了可能性。此外,还有很多对称性(旋转90°,镜像)。
应该注意,最多可能有4个近邻(在以下配置中):
.X. X.X
XXX .X.
.X. X.X
上述评论中引入的优先级规则是一个很好的规则。所以:
后一条规则可以通过以下方式说明:
.XX .N.
XX. => N .
..X ..N
其中N代表邻居。
因此,每个点都有一个0..4相邻点的列表。相邻点具有相似的列表,因此连接是一对一的。
但现在我们遇到了挑战。如何将连接信息组合到列表中?
简单案例:
在此之后我们有分段和交叉点。通过这个答案开头的例子我们有:
111 33 666 AAAAA
1 1 3 X5X 6 A A
1 1 3 4 7 X8X99 A
11X X4 77 B XAAA
2222222 BB
这里0..B表示段,X表示3或4个交叉点。
似乎至少有一条有用的规则可用于简化结果:
在我们的示例图中,这可以应用于最左边的循环:
111 33 666 AAAAA
1 1 3 X5X 6 A A
1 1 3 4 7 X8X99 A
111 X4 77 B XAAA
1111111 BB
然后对于每个3个交叉点,有三种方法可以连接它:
/ / /
/ / /
/ /
----- --- -- |
\ \
\ \ \
\ \ \
对于每个4个交叉点,有四种不同的可能性:
| | | |
/ \
--------- --- --- --- --- --- ---
/ \
| | | |
由于我的图表有五个3个交叉点和一个4个交叉点,因此有3 ^ 5 x 4 = 972种不同的方式来连接这些段。这可以通过详尽的搜索来完成,但是必须决定哪种解决方案是最好的。可能需要最小化路径的数量,但是最好是最大化最长路径还是最大化最短路径?或其他什么?
有一些优化空间,因为几种不同的组合方式可能会产生基本相同的结果(三端交叉处的所有末端的循环可以两种方式运行)。
总结:
找到相邻的连接
将简单案例连接到段(0,1或2个邻居)
问题中显示的案例不需要最后一条规则,因为只有两个平凡的三字交叉。