In un certo senso, di aver risposto alla tua domanda.
Supponendo di avere un insieme di punti, e si utilizza ahull(...)
nel pacchetto alphahull
per generare convesso, è possibile estrarre i punti sul contorno, nell'ordine corretto, direttamente dall'oggetto ahull
. Ecco un esempio:
library(sp)
library(alphahull)
set.seed(1) # for reproducible example
X <- rnorm(100)
Y <- rnorm(100)
plot(X,Y)
XY <- cbind(X,Y)
hull <- ahull(XY,alpha=1)
plot(hull)
# extract the row numbers of the boundary points, in convex order.
indx=hull$arcs[,"end1"]
points <- XY[indx,] # extract the boundary points from XY
points <- rbind(points,points[1,]) # add the closing point
# create the SpatialPolygonsDataFrame
SpP = SpatialPolygons(list(Polygons(list(Polygon(points)),ID="s1")))
plot(SpP)
points(XY)
EDIT risposta a OP di fornire il loro set di dati.
ahull(...)
sembra fallire, senza preavviso, con il set di dati - non produce scafi convessi. Dopo un po 'di sperimentazione, sembra che il problema abbia a che fare con la grandezza dei valori x, y. Se divido tutto per 1000, funziona. Non ho idea di cosa ne faccia uno (forse qualcun altro fornirà una visione ??). Comunque, ecco il codice e il risultato:
library(sp)
library(alphahull)
df <- read.csv("ahull problem.csv")
hull <- ahull(df[2:3]/1000,alpha=2)
plot(hull)
# extract the row numbers of the boundary points, in convex order.
indx=hull$arcs[,"end1"]
points <- df[indx,2:3] # extract the boundary points from df
points <- rbind(points,points[1,]) # add the closing point
# create the SpatialPolygonsDataFrame
SpP = SpatialPolygons(list(Polygons(list(Polygon(points)),ID="s1")))
plot(SpP)
points(df[2:3])
Si noti inoltre che alpha=2
. L'impostazione di alpha=1
con questo set di dati genera in realtà 2 scafi, uno con 1 punto e uno con tutti gli altri punti. L'impostazione alpha=2
crea 1 scafo.
Non sono sicuro che esista un semplice algoritmo per "capire" come ordinare i vertici in modo da evitare che i bordi dei poligoni si incrocino. Hai scavato attraverso pacchetti come 'spatstat' per vedere se hanno strumenti pertinenti? So che ha test come 'crossing.psp', ma odio dover testare in modo esaustivo tutte le coppie di segmenti. –