যখন বক্ররেখার রেখাংশগুলি নিয়ে গঠিত হয়, তখন se বিভাগগুলির সমস্ত অভ্যন্তরীণ পয়েন্টগুলি হ্রাস পয়েন্ট হয়, যা আকর্ষণীয় নয়। পরিবর্তে, বক্ররেখাটি se বিভাগগুলির উল্লম্ব দ্বারা অনুমিত হিসাবে বিবেচনা করা উচিত । এই বিভাগগুলির মাধ্যমে দ্বি-পার্থক্যযুক্ত বক্ররেখার বিভাজন দিয়ে আমরা পরে বক্ররেখাটি গণনা করতে পারি। দৃ inf়ভাবে বলতে গেলে একটি প্রতিচ্ছবি বিন্দু হল এমন একটি স্থান যেখানে বক্রতা শূন্য।
উদাহরণে লম্বা প্রসারিত রয়েছে যেখানে বক্রতা প্রায় শূন্য। এটি পরামর্শ দেয় যে নির্দেশিত পয়েন্টগুলি নিম্ন বক্ররেখা অঞ্চলগুলির এই প্রসারিত প্রান্তগুলির আনুমানিক হওয়া উচিত।
একটি কার্যকর অ্যালগরিদম সুতরাং শিখরগুলি স্প্লিন করবে, মধ্যবর্তী পয়েন্টগুলির একটি ঘন সেট বরাবর বক্রাকার গণনা করবে, নিকটে-শূন্য বক্রতার পরিসীমা চিহ্নিত করবে (এটি "কাছাকাছি" এর অর্থ কীটির কিছু যুক্তিসঙ্গত প্রাক্কলন ব্যবহার করে) এবং এই ব্যাপ্তির শেষ প্রান্তগুলি চিহ্নিত করবে ।
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
এবং কালো বিন্দুগুলি স্বয়ংক্রিয়ভাবে এই অ্যালগরিদমের সাথে চিহ্নিত হয়ে যায় lection কার্ভটি কার্ভের শেষ পয়েন্টগুলিতে নির্ভরযোগ্যভাবে গণনা করা যায় না, এই পয়েন্টগুলি বিশেষভাবে চিহ্নিত করা হয়নি।