एक मायने में, आप अपने खुद के सवाल का जवाब दे दिया है।
मान लिया जाये कि आप अंक का एक सेट है, और आप alphahull
पैकेज में ahull(...)
का उपयोग उत्तल पतवार उत्पन्न करने के लिए, आप अंक सीमा पर, सही क्रम में, ahull
वस्तु से सीधे निकाल सकते हैं।
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)
संपादित ओपी अपने डाटासेट प्रदान करने के लिए उत्तर: यहाँ एक उदाहरण है।
ahull(...)
आपके डेटासेट के साथ चेतावनी के बिना असफल प्रतीत होता है - यह किसी भी उत्तल झुकाव का उत्पादन नहीं करता है। प्रयोग के बाद थोड़ा सा, ऐसा लगता है कि समस्या x, y मानों की परिमाण के साथ करना है। अगर मैं 1000 से सब कुछ विभाजित करता हूं, तो यह काम करता है। कोई विचार नहीं कि उसके साथ क्या चल रहा है (शायद कोई और अंतर्दृष्टि प्रदान करेगा ??)। वैसे भी, यहाँ कोड और परिणाम है:
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])
भी ध्यान रखें कि alpha=2
। इस डेटासेट के साथ alpha=1
सेट करना वास्तव में 2 हल्स उत्पन्न करता है, एक 1 बिंदु और एक अन्य सभी बिंदुओं के साथ। alpha=2
सेट करना 1 हल बनाता है।
मुझे यकीन नहीं है कि आपके पॉलीगॉन किनारों को एक-दूसरे को पार करने से बचने के लिए अपने आकृतियों को ऑर्डर करने के लिए "समझें" के लिए कोई आसान एल्गोरिदम है। क्या आपने 'स्पैटस्टैट' जैसे पैकेजों के माध्यम से यह देखने के लिए खोला है कि उनके पास कोई प्रासंगिक उपकरण है या नहीं? मुझे पता है कि इसमें 'crossing.psp' जैसे परीक्षण हैं लेकिन मुझे सभी सेगमेंट जोड़े का परीक्षण करने से नफरत है। –