Вот функция для преобразования ваших данных координат в объект окна (owin
).
Предполагается, что вы собрали все координаты вершин многоугольника во фрейм данных со столбцами x
, y
и id
, где x
и y
- координаты, а id
- целое число, которое отличает каждую из кривых, которые вы хотите рассматривать как отдельные замкнутые кривые.
df2owin <- function(df) {
## check that 'df' is a data frame with columns x, y, id
stopifnot(is.data.frame(df))
stopifnot(ncol(df) == 3)
stopifnot(all(c("x", "y", "id") %in% colnames(df)))
## separate according to 'id'
z <- split(df[,c("x","y")], factor(df$id))
## force all curves to be traversed anticlockwise
z <- lapply(z, as.list)
areas <- sapply(z, spatstat.utils::Area.xypolygon)
neg <- (areas < 0)
if(any(neg)) z[neg] <- lapply(z[neg], spatstat.utils::reverse.xypolygon)
## convert them to individual windows
winlist <- lapply(z, function(a) owin(poly=as.list(a)))
## now figure out which curves fall inside other curves
n <- length(winlist)
isinside <- logical(n)
for(i in 1:n) {
for(j in (1:n)[-i]) {
if(is.subset.owin(winlist[[i]], winlist[[j]])) {
isinside[i] <- TRUE
break
}
}
}
## assume there are no islands-within-holes etc.
ishole <- isinside
## holes should be traversed clockwise
if(any(ishole)) z[ishole] <-
lapply(z[ishole], spatstat.utils::reverse.xypolygon)
## now make the combined window
result <- owin(poly=z)
return(result)
}