Я должен согласиться с @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)
![](https://i.imgur.com/vQujov8.png)
Установить различия:
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)
![](https://i.imgur.com/VSnQwGf.png)
Выпуклые корпуса с множеством различий:
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)
![](https://i.imgur.com/lNxxiQs.png)
Если вы хотите найти точки пересечения:
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)
![](https://i.imgur.com/Cnvc1kG.png)