Как объединить 2 пересекающихся полигона, получая 2 отдельных полигона - PullRequest
0 голосов
/ 27 марта 2019

Как объединить пересекающиеся многоугольники (идеальные круги), как показано на следующем рисунке: enter image description here

До сих пор я использовал rgeos и sf, но не мог определить простой способпока.

library(rgeos)
library(sp)
pts <- SpatialPoints(cbind(c(2,3), c(1,1)))
plot(pts)
pol <- gBuffer(pts, width=0.6, byid=TRUE)
plot(pol)

@ Эге Рубак подсказал создать выпуклую оболочку вокруг различий окружностей.с rgeos решение выглядит как следующий код.Однако я изо всех сил пытаюсь получить решение за один шаг.

gSym1 <- gDifference(pol[1,],pol[2,])
gch1 <- gConvexHull(gSym1)
gSym2 <- gDifference(pol[2,],pol[1,])
gch2 <- gConvexHull(gSym2)
plot(gch1)
plot(gch2, add=TRUE)

1 Ответ

2 голосов
/ 28 марта 2019

Я должен согласиться с @Spacedman, что ваш вопрос может использовать гораздо больше подробно о проблеме. Ниже приведен быстрый подход для двух кругов используя spatstat. Пакеты как sf, sp и т. Д., Безусловно, имеют те же возможности.

Два перекрывающихся (полигональных приближения) диска в коробке:

library(spatstat)
A <- disc()
B <- shift(A, vec = c(1.6,0))
box <- boundingbox(union.owin(A,B))
plot(box, main = "")
B <- shift(A, vec = c(1.6,0))
colA <- rgb(1,0,0,.5)
colB <- rgb(0,1,0,.5)
plot(A, col = colA, add = TRUE, border = colA)
plot(B, col = colB, add = TRUE, border = colB)

Установить различия:

AnotB <- setminus.owin(A, B)
BnotA <- setminus.owin(B, A)
plot(box, main = "")
plot(AnotB, col = colA, add = TRUE, border = colA)
plot(BnotA, col = colB, add = TRUE, border = colB)

Выпуклые корпуса с множеством различий:

AA <- convexhull(AnotB)
BB <- convexhull(BnotA)
plot(box, main = "")
plot(AA, col = colA, add = TRUE, border = colA)
plot(BB, col = colB, add = TRUE, border = colB)

Если вы хотите найти точки пересечения:

edgesA <- edges(A)
edgesB <- edges(B)
x <- crossing.psp(edgesA,edgesB)
plot(box, main = "")
plot(A, col = colA, add = TRUE, border = colA)
plot(B, col = colB, add = TRUE, border = colB)
plot(x, add = TRUE, pch = 20, col = "blue", cex = 3)

...