让我们将非自相交多边形的顶点视为 1.(X_1,Y_1) 2.(X_2,Y_2),...,6。(x_6,y_6)。
我们还给出了在数组中形成多边形边缘的对点。 该阵列是{(1,4),(2,6),(2,5),(4,3),(6,1),(3,5)}'。请注意,此边不是连续的,而(x,y)=(y,x)。
我需要一个算法来获取$(1,4),(4,3),(3,5),(5,2),(2,6),(6,1)$类型的数组,这样我就可以逐个获得连续的边缘。
感谢您的帮助。
答案 0 :(得分:1)
您似乎正在处理类似图形的数据,因此igraph
包可能会有所帮助。
points<-rbind(c(1,4),c(2,6),c(2,5),c(4,3),c(6,1),c(3,5))
library(igraph)
plot(minimum.spanning.tree(graph.edgelist(points)))
答案 1 :(得分:0)
您没有为多边形坐标提供数据结构,因此我假设它们存储在data.frame
中。
数据强>
d <- data.frame(from = c(1, 2, 2, 4, 6, 3), to = c(4, 6, 5, 3, 1, 5))
<强>代码强>
getEdgesOrdered <- function(current, rest, result = list(unlist(current))) {
if (NROW(rest) == 0) {
result
} else {
to <- current$to
wh <- match(to, rest$from)
if (is.na(wh)) {
wh <- match(to, rest$to)
elem <- setNames(rest[wh, c("to", "from")], c("from", "to"))
} else {
elem <- rest[wh, c("from", "to")]
}
Recall(elem, rest[-wh, ], c(result, list(unlist(elem))))
}
}
getEdgesOrdered(d[1,], d[-1,])
<强>解释强>
该函数采用第一个边缘,并在剩余的to
中的from
列中查找data.frame
节点。如果在那里找不到,它会在to
列中查找。然后将当前边缘附加到结果向量,找到的边缘从data.frame
中移除,并且它是要查找的新边缘。当data.frame
中没有剩余行时,算法停止并返回搜索路径。
答案 2 :(得分:0)
扫描边缘列表并填充两个数组:在索引i
处,存储链接到顶点i
的两个顶点的索引,让p[N]
和q[N]
(初始化) p
和q
保留值含义&#34;未知&#34;)。这需要线性时间。
然后从(i, j):= (1, p[1])
开始,找到下一个边缘:if p[j] == i
,然后(j, q[j])
else (j, p[j])
。重复直到j == 1
。这也需要线性时间。
在你的情况下:
1 -> 4, 6
2 -> 6, 5
3 -> 4, 5
4 -> 1, 3
5 -> 3, 2
6 -> 2, 1
周期为1, 4, 3, 5, 2, 6
。