【问题标题】:sorting of edges of polygon多边形边的排序
【发布时间】:2015-01-09 11:04:50
【问题描述】:

让我们将非自相交多边形的顶点视为 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)$ 类型的数组,这样我就可以一个接一个地得到连续的边。

感谢您的帮助。

【问题讨论】:

    标签: r algorithm sorting computational-geometry


    【解决方案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)))
    

    【讨论】:

    • 是的,我正在使用类似图形的数据。从数据看来,2 和 5 是连接节点,但该图未显示该连接。您能否解释一下我们缺少什么。
    • 我创建了一个最小生成树,因此您可以放松循环性(如您的示例中所示)。如果您想保留该方面,只需使用plot(graph.edgelist(points))
    • 我明白了。感谢您的帮助和建议。
    【解决方案2】:

    您没有为多边形坐标提供数据结构,因此我假设它们存储在 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,])
    

    说明

    该函数获取第一条边并在剩余的data.framefrom 列中查找to 节点。如果在那里找不到它,它会在to 列中查找它。然后将当前边附加到结果向量,找到的边从data.frame 中删除,它是要查找的新边。当data.frame 中没有剩余行时,算法停止并返回搜索路径。

    【讨论】:

    • 很好的答案。它正在工作,并且解释非常清楚。非常感谢。
    • 不客气。如果它也符合您的需求,您可以接受吗?
    • 抱歉,打勾标记迟了。其实我不知道这个刻度线。无论如何,再次感谢。
    【解决方案3】:

    扫描边缘列表并填充两个数组:在索引i处,存储链接到顶点i的两个顶点的索引,让p[N]q[N](初始化pq为一个保留值,意思是“未知”)。这需要线性时间。

    然后从(i, j):= (1, p[1])开始,找到下一条边:如果p[j] == i,那么(j, q[j]),否则(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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2014-08-12
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多