जब वक्र लाइन खंडों से युक्त होता है, तो उन खंडों के सभी आंतरिक बिंदु विभक्ति बिंदु होते हैं, जो दिलचस्प नहीं है। इसके बजाय, वक्र को उन खंडों के कोने द्वारा अनुमानित किया जाना चाहिए । उन खंडों के माध्यम से दो बार अलग-अलग वक्र को विभाजित करके, हम फिर वक्रता की गणना कर सकते हैं। एक मोड़ बिंदु, सख्ती से बोल रहा है, फिर एक जगह है जहां वक्रता शून्य है।
उदाहरण में लंबे समय तक खिंचाव हैं जहां वक्रता लगभग शून्य है। इससे पता चलता है कि संकेतित बिंदुओं को कम-वक्रता वाले क्षेत्रों के ऐसे हिस्सों के सिरों को अनुमानित करना चाहिए।
इसलिए एक प्रभावी एल्गोरिथ्म वर्टिकल को फैलाएगा, मध्यवर्ती बिंदुओं के एक घने सेट के साथ वक्रता की गणना करेगा, निकट-शून्य वक्रता की श्रेणियों की पहचान करेगा (इसका "पास" होने के कुछ उचित अनुमान का उपयोग करके), और उन सीमाओं के समापन बिंदुओं को चिह्नित करें। ।
R
इन विचारों को स्पष्ट करने के लिए यहां कोड काम कर रहा है । आइए निर्देशांक के अनुक्रम के रूप में व्यक्त एक लाइन स्ट्रिंग के साथ शुरू करें:
xy <- matrix(c(5,20, 3,18, 2,19, 1.5,16, 5.5,9, 4.5,8, 3.5,12, 2.5,11, 3.5,3,
2,3, 2,6, 0,6, 2.5,-4, 4,-5, 6.5,-2, 7.5,-2.5, 7.7,-3.5, 6.5,-8), ncol=2, byrow=TRUE)
पट्टी एक्स और वाई अलग निर्देशांक वक्र की एक parametrization प्राप्त करने के लिए। (पैरामीटर बुलाया जाएगा time
।)
n <- dim(xy)[1]
fx <- splinefun(1:n, xy[,1], method="natural")
fy <- splinefun(1:n, xy[,2], method="natural")
साजिश रचने और अभिकलन के लिए स्प्लीन को इंटरपोल करें :
time <- seq(1,n,length.out=511)
uv <- sapply(time, function(t) c(fx(t), fy(t)))
हमें एक पैरामीटर वक्र की वक्रता की गणना करने के लिए एक फ़ंक्शन की आवश्यकता होती है। इसे तटरेखा के पहले और दूसरे डेरिवेटिव का अनुमान लगाने की जरूरत है। कई स्प्लिन (जैसे क्यूबिक स्प्लिन) के साथ यह एक आसान बीजीय गणना है। R
स्वचालित रूप से पहले तीन व्युत्पन्न प्रदान करता है। (अन्य वातावरण में, कोई व्यक्ति संख्यात्मक रूप से गणना करना चाहता है।)
curvature <- function(t, fx, fy) {
# t is an argument to spline functions fx and fy.
xp <- fx(t,1); yp <- fy(t,1) # First derivatives
xpp <- fx(t,2); ypp <- fy(t,2) # Second derivatives
v <- sqrt(xp^2 + yp^2) # Speed
(xp*ypp - yp*xpp) / v^3 # (Signed) curvature
# (Left turns have positive curvature; right turns, negative.)
}
kappa <- abs(curvature(time, fx, fy)) # Absolute curvature of the data
मैं वक्र की सीमा के संदर्भ में शून्य वक्रता के लिए एक सीमा का अनुमान लगाने का प्रस्ताव करता हूं । यह कम से कम एक अच्छा प्रारंभिक बिंदु है; इसे वक्र की यातना के अनुसार समायोजित किया जाना चाहिए (जो कि अधिक घटता है)। यह बाद में वक्रता के अनुसार भूखंडों को रंगने के लिए उपयोग किया जाएगा।
curvature.zero <- 2*pi / max(range(xy[,1]), range(xy[,2])) # A small threshold
i.col <- 1 + floor(127 * curvature.zero/(curvature.zero + kappa))
palette(terrain.colors(max(i.col))) # Colors
अब जब वर्टिकल को विभाजित किया गया है और वक्रता की गणना की गई है, तो यह केवल विभक्ति बिंदुओं को खोजने के लिए बनी हुई है । उन्हें दिखाने के लिए हम कोने की साजिश कर सकते हैं, तख़्ता पलट सकते हैं, और उस पर विभक्ति बिंदुओं को चिह्नित कर सकते हैं।
plot(xy, asp=1, xlab="x",ylab="y", type="n")
tmp <- sapply(2:length(kappa), function(i) lines(rbind(uv[,i-1],uv[,i]), lwd=2, col=i.col[i]))
points(t(sapply(time[diff(kappa < curvature.zero/2) != 0],
function(t) c(fx(t), fy(t)))), pch=19, col="Black")
points(xy)
खुले बिंदु में मूल कोने हैं xy
और काले बिंदु इस एल्गोरिथ्म के साथ स्वचालित रूप से पहचाने जाने वाले विभक्ति बिंदु हैं। क्योंकि वक्रता को वक्र के अंत बिंदुओं पर मज़बूती से गणना नहीं की जा सकती है, उन बिंदुओं को विशेष रूप से चिह्नित नहीं किया गया है।