প্রথমে কিছু বিশ্লেষণ করা যাক।
মনে করুন বহুভুজ within এর মধ্যে এর সম্ভাব্যতা ঘনত্ব আনুপাতিক ফাংশন তারপরে আনুপাতিকতার ধ্রুবক হ'ল বহুভুজের উপর এর অবিচ্ছেদ্য বিপরীত ,পিp ( x , y)) ।পি
μ0 , 0( পি) =∬পিp ( x , y)) d xd y।
সাধারণ কেন্দ্র বহুভুজ গড় স্থানাঙ্ক তাদের প্রথম মুহূর্ত হিসেবে নির্ণিত বিন্দু। প্রথম এক
μ1 , 0( পি) =1μ0 , 0( পি)∬পিএক্সp ( x , y)) d xd y।
নিষ্ক্রিয় টেন্সর ম্যাট্রিক্স যে,: বহুভুজ অনুবাদ মূল তার সাধারণ কেন্দ্র লাগাতে পর নির্ণিত দ্বিতীয় মুহূর্তের প্রতিসম অ্যারের হিসাবে প্রতিনিধিত্ব করা যেতে পারে কেন্দ্রীয় দ্বিতীয় মুহূর্ত
μ′k,l(P)=1μ0,0(P)∬P(x−μ1,0(P))k(y−μ0,1(P))lp(x,y)dxdy
যেখানে থেকে পরিসীমা থেকে থেকে টেনসর নিজেই - ওরফে কোভেরিয়েন্স ম্যাট্রিক্স - হয়(k,l)(2,0)(1,1)(0,2).
I(P)=(μ′2,0(P)μ′1,1(P)μ′1,1(P)μ′0,2(P)).
একটি PCA of এর মূল অক্ষগুলি অর্জন করে এগুলি তাদের ইউনিটগুলি দ্বারা মাপানো একক আইজিভেক্টর।I(P)P:
এর পরে, গণনাগুলি কীভাবে করা যায় তার বিষয়ে কাজ করা যাক। যেহেতু বহুভুজটি তার কেন্দ্রিক সীমানা বর্ণনা করে উল্লম্বের অনুক্রম হিসাবে উপস্থাপিত হয়েছে তাই অনুরোধ করা স্বাভাবিক is∂P,
গ্রিনের উপপাদ্য: যেখানে form এবং∬Pdω=∮∂Pω
ω=M(x,y)dx+N(x,y)dyPdω=(∂∂xN(x,y)−∂∂yM(x,y))dxdy.
উদাহরণস্বরূপ, এবং ধ্রুবক ( অর্থাত্ , ইউনিফর্ম) ঘনত্ব আমরা (পরিদর্শন করে) অনেকগুলি মধ্যে একটি বেছে নিতে পারি সমাধানগুলি, যেমনdω=xkyldxdyp,ω(x,y)=−1l+1xkyl+1dx.
এর বিন্দুটি হ'ল কনট্যুর ইন্টিগ্রালটি লম্বাংশের ক্রম দ্বারা নির্ধারিত রেখাংশগুলি অনুসরণ করে। ভার্টেক্স থেকে ভার্টেক্স পর্যন্ত যে কোনও লাইন বিভাগকে ফর্মের মধ্যে একটি বাস্তব পরিবর্তনশীল দ্বারা প্যারামিটারাইজ করা যেতে পারেuvt
t→u+tw
যেখানে হ'ল একক সাধারণ দিক direction থেকেমান তাই থেকে পরিসীমা থেকে অধীনে এই একখান এবং রৈখিক ফাংশন হয় এবং এবং রৈখিক ফাংশন হয় এভাবে প্রতিটি প্রান্ত উপর কনট্যুর অবিচ্ছেদ্য এর integrand একটি হয়ে বহুপদী ফাংশন এর যা খুব সহজেই ছোট মূল্যায়ন করা হয় এবংw∝v−uuv.t0|v−u|.xytdxdydt.t,kl.
এই বিশ্লেষণটি কার্যকর করা এর উপাদানগুলির কোডিংয়ের মতোই সহজ। সর্বনিম্ন স্তরে আমাদের একটি লাইন বিভাগের উপর বহুবচনীয় এক-রূপকে সংহত করার জন্য একটি ফাংশন প্রয়োজন। উচ্চ স্তরের ক্রিয়াকলাপগুলি এগুলিকে একত্রিত করে ব্যারিসেন্টার এবং জড়তাভুক্ত টেনসর পেতে কাঁচা এবং কেন্দ্রীয় মুহুর্তগুলি গণনা করতে পারে এবং শেষ পর্যন্ত আমরা মূল টুকরো (যা এর আকারযুক্ত আইজেনেক্টরগুলি হয়) খুঁজে পেতে সেই টেন্সরের উপর পরিচালনা করতে পারি। R
সঞ্চালিত নিচের কোড এই কাজ। এটি দক্ষতার কোনও প্রবণতা তৈরি করে না: এটি কেবল পূর্ববর্তী বিশ্লেষণের ব্যবহারিক প্রয়োগকে চিত্রিত করার উদ্দেশ্যে। প্রতিটি ফাংশন সোজা এবং নামকরণ কনভেনশনগুলি বিশ্লেষণের সাথে সমান্তরাল হয়।
কোডটিতে অন্তর্ভুক্তটি হ'ল বৈধ বদ্ধ, সহজভাবে সংযুক্ত, অ-স্ব-ছেদ করা বহুভুজগুলি তৈরি করার পদ্ধতি (এলোমেলোভাবে একটি বৃত্ত বরাবর পয়েন্টগুলি বিকৃত করে এবং একটি বদ্ধ লুপ তৈরির জন্য তার চূড়ান্ত বিন্দু হিসাবে প্রারম্ভিক শীর্ষটি সহ)। বহুভুজকে প্লট করার জন্য এর কয়েকটি সূচনা অনুসরণ করা হয়েছে, এর শীর্ষকোষগুলি প্রদর্শন করতে হবে, ব্যারিসেনটার সংযুক্ত করুন এবং মূল (বৃহত্তর) এবং নীল (ক্ষুদ্রতম) মূল অক্ষগুলি প্লট করুন, বহুভুজ কেন্দ্রিক ইতিবাচক-ভিত্তিক সমন্বয় ব্যবস্থা তৈরি করুন।
#
# Integrate a monomial one-form x^k*y^l*dx along the line segment given as an
# origin, unit direction vector, and distance.
#
lintegrate <- function(k, l, origin, normal, distance) {
# Binomial theorem expansion of (u + tw)^k
expand <- function(k, u, w) {
i <- seq_len(k+1)-1
u^i * w^rev(i) * choose(k,i)
}
# Construction of the product of two polynomials times a constant.
omega <- normal[1] * convolve(rev(expand(k, origin[1], normal[1])),
expand(l, origin[2], normal[2]),
type="open")
# Integrate the resulting polynomial from 0 to `distance`.
sum(omega * distance^seq_along(omega) / seq_along(omega))
}
#
# Integrate monomials along a piecewise linear path given as a sequence of
# (x,y) vertices.
#
cintegrate <- function(xy, k, l) {
n <- dim(xy)[1]-1 # Number of edges
sum(sapply(1:n, function(i) {
dv <- xy[i+1,] - xy[i,] # The direction vector
lambda <- sum(dv * dv)
if (isTRUE(all.equal(lambda, 0.0))) {
0.0
} else {
lambda <- sqrt(lambda) # Length of the direction vector
-lintegrate(k, l+1, xy[i,], dv/lambda, lambda) / (l+1)
}
}))
}
#
# Compute moments of inertia.
#
inertia <- function(xy) {
mass <- cintegrate(xy, 0, 0)
barycenter = c(cintegrate(xy, 1, 0), cintegrate(xy, 0, 1)) / mass
uv <- t(t(xy) - barycenter) # Recenter the polygon to obtain central moments
i <- matrix(0.0, 2, 2)
i[1,1] <- cintegrate(uv, 2, 0)
i[1,2] <- i[2,1] <- cintegrate(uv, 1, 1)
i[2,2] <- cintegrate(uv, 0, 2)
list(Mass=mass,
Barycenter=barycenter,
Inertia=i / mass)
}
#
# Find principal axes of an inertial tensor.
#
principal.axes <- function(i.xy) {
obj <- eigen(i.xy)
t(t(obj$vectors) * obj$values)
}
#
# Construct a polygon.
#
circle <- t(sapply(seq(0, 2*pi, length.out=11), function(a) c(cos(a), sin(a))))
set.seed(17)
radii <- (1 + rgamma(dim(circle)[1]-1, 3, 3))
radii <- c(radii, radii[1]) # Closes the loop
xy <- circle * radii
#
# Compute principal axes.
#
i.xy <- inertia(xy)
axes <- principal.axes(i.xy$Inertia)
sign <- sign(det(axes))
#
# Plot barycenter and principal axes.
#
plot(xy, bty="n", xaxt="n", yaxt="n", asp=1, xlab="x", ylab="y",
main="A random polygon\nand its principal axes", cex.main=0.75)
polygon(xy, col="#e0e0e080")
arrows(rep(i.xy$Barycenter[1], 2),
rep(i.xy$Barycenter[2], 2),
-axes[1,] + i.xy$Barycenter[1], # The -signs make the first axis ..
-axes[2,]*sign + i.xy$Barycenter[2],# .. point to the right or down.
length=0.1, angle=15, col=c("#e02020", "#4040c0"), lwd=2)
points(matrix(i.xy$Barycenter, 1, 2), pch=21, bg="#404040")