যে কোনও সত্যিকারের সাধারণ-কার্যকর কার্যকর পদ্ধতি আকারগুলির উপস্থাপনাগুলিকে মানক করে তুলবে যাতে তারা আবর্তন, অনুবাদ, প্রতিবিম্ব বা অভ্যন্তরীণ উপস্থাপনায় তুচ্ছ পরিবর্তনের উপর পরিবর্তন করে না।
এটি করার একটি উপায় হ'ল প্রতিটি সংযুক্ত আকারকে এক প্রান্ত থেকে শুরু করে প্রান্ত দৈর্ঘ্যের এবং (স্বাক্ষরিত) কোণগুলির বিকল্প ক্রম হিসাবে তালিকাবদ্ধ করা। (কোনও শূন্য দৈর্ঘ্যের প্রান্ত বা সোজা কোণ না থাকার আকারে আকৃতিটি "পরিষ্কার" হওয়া উচিত)) এই আক্রমণকারীকে প্রতিবিম্বের অধীনে তৈরি করতে, প্রথম নঞ্জেরোটি নেতিবাচক হলে সমস্ত কোণ উপেক্ষা করুন।
(কোন সংযুক্ত পলিলাইন কারণ এন ছেদচিহ্ন থাকবে এন -1 প্রান্ত দ্বারা পৃথক এন -2 কোণ, আমি এর মধ্যে সুবিধাজনক পাওয়া যায় R
কোড নিচে দুইটি অ্যারের, প্রান্ত লেন্থ জন্য এক গঠিত একটি ডাটা স্ট্রাকচার ব্যবহার করতে $lengths
এবং জন্য অন্যান্য কোণ, $angles
একটি লাইন বিভাগের কোনও কোণই থাকবে না, সুতরাং এই জাতীয় ডেটা স্ট্রাকচারে শূন্য দৈর্ঘ্যের অ্যারেগুলি পরিচালনা করা জরুরী))
এই জাতীয় উপস্থাপনা অভিধানিক অর্ডার করা যেতে পারে। মানককরণ প্রক্রিয়া চলাকালীন ভাসমান-পয়েন্ট ত্রুটির জন্য কিছু ভাতা দেওয়া উচিত। একটি মার্জিত পদ্ধতিটি মূল স্থানাঙ্কগুলির ফাংশন হিসাবে এই ত্রুটিগুলি অনুমান করে। নীচের সমাধানে, একটি সহজ পদ্ধতি ব্যবহার করা হয় যেখানে দুটি দৈর্ঘ্যকে সমান হিসাবে বিবেচনা করা হয় যখন তারা আপেক্ষিক ভিত্তিতে খুব অল্প পরিমাণে পৃথক হয় । কোণগুলি কেবলমাত্র পরম ভিত্তিতে খুব অল্প পরিমাণে পৃথক হতে পারে।
অন্তর্নিহিত ওরিয়েন্টেশনের বিপরীতে তাদের অদম্য করে তুলতে, পললাইন এবং এর বিপরীতের মধ্যে অভিধানের প্রথম দিকের প্রতিনিধিত্ব চয়ন করুন।
মাল্টি-পার্ট পলিনগুলি পরিচালনা করতে, তাদের উপাদানগুলি ডিক্সিকোগ্রাফিক ক্রমে সাজান arrange
ইউক্লিডিয়ান রূপান্তরগুলির অধীনে সমতুল্য ক্লাসগুলি সন্ধান করতে, তারপরে,
আকারগুলির মানকৃত উপস্থাপনা তৈরি করুন।
মানকযুক্ত উপস্থাপনার একটি ডিক্সিকোগ্রাফিক সাজান সম্পাদন করুন।
সমান উপস্থাপনার ক্রম সনাক্তকরণের জন্য বাছাই করা ক্রমটি পাস করুন।
গণনার সময় O (n * লগ (n) * N) এর সমানুপাতিক যেখানে n বৈশিষ্ট্যগুলির সংখ্যা এবং N কোনও বৈশিষ্ট্যের মধ্যে শীর্ষে অবস্থিত বৃহত্তম সংখ্যা N এটি দক্ষ।
এটি সম্ভবত উত্তরণে উল্লেখযোগ্য যে, সহজেই গণনা করা আগত জ্যামিতিক বৈশিষ্ট্যের উপর ভিত্তি করে একটি প্রাথমিক দলবদ্ধকরণ, যেমন পললাইন দৈর্ঘ্য, কেন্দ্র এবং সেই কেন্দ্রের মুহুর্তগুলি প্রায়শই পুরো প্রক্রিয়াটিকে প্রবাহিত করার জন্য প্রয়োগ করা যেতে পারে। এই জাতীয় প্রতিটি প্রাথমিক গোষ্ঠীর মধ্যে কেবলমাত্র একত্রিত বৈশিষ্ট্যগুলির সাবগ্রুপগুলি সন্ধান করতে হবে। আকারগুলির জন্য এখানে প্রদত্ত পুরো পদ্ধতিটির প্রয়োজন হবে যা অন্যথায় এতটাই মিল ছিল যে এই জাতীয় সরল আক্রমণকারীরা এখনও তাদের পার্থক্য করতে পারে না। রাস্টার ডেটা থেকে নির্মিত সাধারণ বৈশিষ্ট্যগুলির মধ্যে এই জাতীয় বৈশিষ্ট্য থাকতে পারে। তবে, যেহেতু এখানে প্রদত্ত সমাধানটি যাইহোক এতটা দক্ষ, যে কেউ যদি এটি প্রয়োগের প্রচেষ্টাতে চলে যায় তবে এটি নিজে নিজে ঠিকঠাক কাজ করতে পারে।
উদাহরণ
বাম হাতের চিত্রটিতে পাঁচটি পলিন প্লাস এবং আরও 15 টি দেখানো হয়েছে যা এলোমেলো অনুবাদ, ঘূর্ণন, প্রতিবিম্ব এবং অভ্যন্তরীণ অভিমুখীকরণের বিপরীতকরণ (যা দৃশ্যমান নয়) এর মাধ্যমে প্রাপ্ত হয়েছিল। ডান হাতের চিত্রটি তাদের ইউক্লিডিয়ান সমতুল্য শ্রেণি অনুসারে রঙ করে: একটি সাধারণ রঙের সমস্ত চিত্র একত্রিত হয়; বিভিন্ন রঙ একত্রিত হয় না।
R
কোড অনুসরণ। যখন ইনপুটগুলি 500 আকারের, 500 অতিরিক্ত (একত্রিত) আকারগুলিতে আপডেট করা হয়েছিল, যখন প্রতি আকারের 100 টি উল্লম্ব পরিমাণ ছিল, তখন এই মেশিনে কার্যকর করার সময়টি 3 সেকেন্ড ছিল।
এই কোডটি অসম্পূর্ণ: যেহেতু R
একটি নেটিভ লেসিকোগ্রাফিক বাছাই করে না, এবং আমি স্ক্র্যাচ থেকে কোনও কোডিংয়ের মতো অনুভব করি না, আমি কেবল প্রতিটি মানক আকারের প্রথম স্থানাঙ্কে বাছাই করি। এটি এখানে তৈরি এলোমেলো আকারগুলির জন্য সূক্ষ্ম হবে, তবে উত্পাদন কাজের জন্য একটি সম্পূর্ণ অভিধানিক ক্রম প্রয়োগ করা উচিত। order.shape
এই পরিবর্তন দ্বারা প্রভাবিত একমাত্র ফাংশন হবে। এর ইনপুটটি প্রমিত আকারের একটি তালিকা s
এবং এর আউটপুট সূচকের ক্রম যা এটি সাজায় s
।
#
# Create random shapes.
#
n.shapes <- 5 # Unique shapes, up to congruence
n.shapes.new <- 15 # Additional congruent shapes to generate
p.mean <- 5 # Expected number of vertices per shape
set.seed(17) # Create a reproducible starting point
shape.random <- function(n) matrix(rnorm(2*n), nrow=2, ncol=n)
shapes <- lapply(2+rpois(n.shapes, p.mean-2), shape.random)
#
# Randomly move them around.
#
move.random <- function(xy) {
a <- runif(1, 0, 2*pi)
reflection <- sign(runif(1, -1, 1))
translation <- runif(2, -8, 8)
m <- matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2) %*%
matrix(c(reflection, 0, 0, 1), 2, 2)
m <- m %*% xy + translation
if (runif(1, -1, 0) < 0) m <- m[ ,dim(m)[2]:1]
return (m)
}
i <- sample(length(shapes), n.shapes.new, replace=TRUE)
shapes <- c(shapes, lapply(i, function(j) move.random(shapes[[j]])))
#
# Plot the shapes.
#
range.shapes <- c(min(sapply(shapes, min)), max(sapply(shapes, max)))
palette(gray.colors(length(shapes)))
par(mfrow=c(1,2))
plot(range.shapes, range.shapes, type="n",asp=1, bty="n", xlab="", ylab="")
invisible(lapply(1:length(shapes), function(i) lines(t(shapes[[i]]), col=i, lwd=2)))
#
# Standardize the shape description.
#
standardize <- function(xy) {
n <- dim(xy)[2]
vectors <- xy[ ,-1, drop=FALSE] - xy[ ,-n, drop=FALSE]
lengths <- sqrt(colSums(vectors^2))
if (which.min(lengths - rev(lengths))*2 < n) {
lengths <- rev(lengths)
vectors <- vectors[, (n-1):1]
}
if (n > 2) {
vectors <- vectors / rbind(lengths, lengths)
perps <- rbind(-vectors[2, ], vectors[1, ])
angles <- sapply(1:(n-2), function(i) {
cosine <- sum(vectors[, i+1] * vectors[, i])
sine <- sum(perps[, i+1] * vectors[, i])
atan2(sine, cosine)
})
i <- min(which(angles != 0))
angles <- sign(angles[i]) * angles
} else angles <- numeric(0)
list(lengths=lengths, angles=angles)
}
shapes.std <- lapply(shapes, standardize)
#
# Sort lexicographically. (Not implemented: see the text.)
#
order.shape <- function(s) {
order(sapply(s, function(s) s$lengths[1]))
}
i <- order.shape(shapes.std)
#
# Group.
#
equal.shape <- function(s.0, s.1) {
same.length <- function(a,b) abs(a-b) <= (a+b) * 1e-8
same.angle <- function(a,b) min(abs(a-b), abs(a-b)-2*pi) < 1e-11
r <- function(u) {
a <- u$angles
if (length(a) > 0) {
a <- rev(u$angles)
i <- min(which(a != 0))
a <- sign(a[i]) * a
}
list(lengths=rev(u$lengths), angles=a)
}
e <- function(u, v) {
if (length(u$lengths) != length(v$lengths)) return (FALSE)
all(mapply(same.length, u$lengths, v$lengths)) &&
all(mapply(same.angle, u$angles, v$angles))
}
e(s.0, s.1) || e(r(s.0), s.1)
}
g <- rep(1, length(shapes.std))
for (j in 2:length(i)) {
i.0 <- i[j-1]
i.1 <- i[j]
if (equal.shape(shapes.std[[i.0]], shapes.std[[i.1]]))
g[j] <- g[j-1] else g[j] <- g[j-1]+1
}
palette(rainbow(max(g)))
plot(range.shapes, range.shapes, type="n",asp=1, bty="n", xlab="", ylab="")
invisible(lapply(1:length(i), function(j) lines(t(shapes[[i[j]]]), col=g[j], lwd=2)))