Возможно ли сопоставить матрицу с объектом igraph?

#r #polygon #igraph

#r #полигон #igraph

Вопрос:

У меня есть матрица A , которая определяет упорядоченные сегменты самопересекающегося многоугольника:

 A <- t(matrix(c(
         0,  0  ,
         1,  0  ,
         1, -2  ,
        -2, -2  ,
        -2, -1  ,
         0, -1  ,
         0, -4  ,
        -1, -4  ,
        -1, -2  ,
         2, -2  ,
         2, -3  ,
         0, -3  ,
         0, 0), nrow = 2));

par(mfrow=c(1,3)) 

plot(A, col='red', type= 'l', xlim=c(min(A[,1]),max(A[,1])),
      ylim=c(min(A[,2]),max(A[,2])), xlab='x', ylab='y'); 
points(A, col='black', pch = 22); 
grid()  
  

Я бы хотел сопоставить матрицу A с неориентированным графом, где точка (x,y) соответствует вершине, а отрезок между «соседними» точками соответствует ребру. Соседние точки (по расстоянию, но не по номеру идентификатора) соединены красными линиями на правой фигуре.

Редактировать. После комментария пользователя 20650 я сопоставил матрицу с неориентированным графиком (средний график на рисунке). Неориентированный график выглядит как ожидаемый результат. Но с edge.curved=TRUE опцией (rigth fugure) мы видим ребра (3,4) , (6,7) , (9,10) и (12, 13) .

 library(igraph)
g <- make_empty_graph(n=nrow(A)); 
g <- g   path(seq_len(nrow(A))); 
plot(as.undirected(g), layout=as.matrix(A))
plot(g, layout=as.matrix(A), edge.curved=TRUE)
  

Длина ребер должна быть равна 1. Исходя из условия, мы должны добавить 5 ветви к графу g и соответствующие ребра.

Я могу удалить ребро (3,4) и (3,9) добавить ребра и (9,4) и так далее для пар (12, 13) , (9,10) и (6,7) .

Вопрос. Существует ли способ такого сопоставления?

введите описание изображения здесь

Комментарии:

1. делает ли это то, что вы хотите; library(igraph) ; g <- make_empty_graph(n=nrow(A)) ; g <- g path(seq_len(nrow(A))) ; plot(g, layout=as.matrix(A))

2. Я добавил замечание к своему первоначальному вопросу. Возможно ли добавить дополнительную вершину, которая определяется пересечениями двух сегментов?

3. к каким вершинам подключена дополнительная вершина? можете ли вы сделать это вручную с помощью add_vertices , add_edges ?

4. В вашем графике дополнительная вершина должна быть связана с 3, 6, 9 и 12. Конечно, я могу добавить новую вершину вручную. Возможно ли это сделать автоматически, потому что края «пересекаются»?

5. хорошо. это заставляет меня думать, что код в моем предыдущем комментарии — это не то, что вы хотите. Путь от вершины 3 (1, -2) до вершины 4 (-2, -2) проходит через вершину 9 (-1, -2), но между ними нет ребра. Аналогично 7 и 12 и т. Д