#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 и т. Д