স্থানিক লাইনের বস্তুর মিল কীভাবে পরিমাপ করা যায়


9

আমি দুই নির্মিত SpatialLinesআর বস্তু: ব্যক্তিত্ব

এই বিষয়গুলি এইভাবে তৈরি করা হয়েছিল:

library(sp)
xy <- cbind(x,y)
xy.sp = sp::SpatialPoints(xy)
spl1 <- sp::SpatialLines(list(Lines(Line(xy.sp), ID="a")))

এখন আমি একরকম উপসংহারে আসতে চাই যে এটি একই লাইনটি ঘোরানো এবং উল্টানো হয়েছে এবং তাদের মধ্যে পার্থক্য 0 (সমান আকৃতি সমান) এর সমান।

এটি করতে, কেউ maptoolsপ্যাকেজ ব্যবহার করতে পারেন এবং লাইন # 1 ঘোরান, যেমন:

spl180 <- maptools::elide(spl1, rotate=180)

প্রতিটি ঘোরানো লাইন অবশ্যই rgeosপ্যাকেজ ব্যবহার করে লাইন # 2 বিপরীতে পরীক্ষা করা উচিত , যেমন:

hdist <- rgeos::gDistance(spl180, spl2, byid=FALSE, hausdorff=TRUE)

যাইহোক, SpatialLinesবস্তুর সাথে ম্যাচ করার জন্য এটি এত গুণগত উপায় , বিশেষত যদি সামগ্রীর সংখ্যা 1000 এর কাছাকাছি হয় 1000

এই কাজ করার কোন চালাক উপায় আছে?

পিএস তদতিরিক্ত, উপরে বর্ণিত পদ্ধতির সমস্ত সম্ভাব্য আবর্তন এবং উল্টাপাল্টির গ্যারান্টি নেই।

P.S2। যদি লাইন # 1 লাইন # 2 এর সাথে জুম করা হয় তবে লাইন # 1 এবং # 2 এর মধ্যে পার্থক্যটি এখনও 0 এর সমান হতে হবে।

হালনাগাদ:

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


9

যে কোনও সত্যিকারের সাধারণ-কার্যকর কার্যকর পদ্ধতি আকারগুলির উপস্থাপনাগুলিকে মানক করে তুলবে যাতে তারা আবর্তন, অনুবাদ, প্রতিবিম্ব বা অভ্যন্তরীণ উপস্থাপনায় তুচ্ছ পরিবর্তনের উপর পরিবর্তন করে না।

এটি করার একটি উপায় হ'ল প্রতিটি সংযুক্ত আকারকে এক প্রান্ত থেকে শুরু করে প্রান্ত দৈর্ঘ্যের এবং (স্বাক্ষরিত) কোণগুলির বিকল্প ক্রম হিসাবে তালিকাবদ্ধ করা। (কোনও শূন্য দৈর্ঘ্যের প্রান্ত বা সোজা কোণ না থাকার আকারে আকৃতিটি "পরিষ্কার" হওয়া উচিত)) এই আক্রমণকারীকে প্রতিবিম্বের অধীনে তৈরি করতে, প্রথম নঞ্জেরোটি নেতিবাচক হলে সমস্ত কোণ উপেক্ষা করুন।

(কোন সংযুক্ত পলিলাইন কারণ এন ছেদচিহ্ন থাকবে এন -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)))

যখন অবাধ dilations (বা "isotheties") রূপান্তরের দলের অন্তর্ভুক্ত, সমানতা ক্লাস সঙ্গতি ক্লাস আছে অ্যাফিন জ্যামিতি । এই জটিলতাটি সহজেই পরিচালনা করা হয়: উদাহরণস্বরূপ, সমস্ত ইউনিট দৈর্ঘ্যের দৈর্ঘ্যের জন্য পলিনগুলিকে মানিক করুন।
whuber

অনেক ধন্যবাদ. কেবল একটি প্রশ্ন: আকারগুলিকে স্প্যাটাললাইনস বা স্প্যাটিয়ালপলাইগন হিসাবে উপস্থাপন করা উচিত?
ক্লাউসোস ক্লাউসোস

বহুভুজগুলি আরও একটি জটিলতা সৃষ্টি করে: তাদের সীমানার কোনও নির্দিষ্ট প্রান্ত নেই। হ্যান্ডেল করার অনেকগুলি উপায় রয়েছে, যেমন xy লেসিকোলোগ্রাফিক ক্রমে প্রথমে সাজানো প্রান্তটি (বলা) শুরু করার জন্য উপস্থাপনাটির মানককরণ এবং বহুভুজের চারদিকে একটি ঘড়ির কাঁটার দিকে অগ্রসর হওয়া। (একটি টপোলজিক্যালি "ক্লিন" সংযুক্ত বহুভুজের মধ্যে কেবল একই ধরণের একটি ভার্টেক্স থাকবে)) কোন আকারকে বহুভুজ হিসাবে বিবেচনা করা হয় বা বহুলাইন এটি কী ধরণের বৈশিষ্ট্য উপস্থাপন করে তার উপর নির্ভর করে: বিন্দুগুলির কোনও বদ্ধ তালিকা সম্পর্কে বলার অভ্যন্তরীণ উপায় নেই কিনা একটি বহুবিধ বা বহুভুজ হতে ইচ্ছুক।
whuber

একটি সাধারণ প্রশ্নের জন্য দুঃখিত, তবে আমার এটি আপনার উদাহরণটি বোঝার জন্য বলা উচিত। আপনার অবজেক্টের আকার.এসটিডি এর উভয় দৈর্ঘ্য এবং। কোণ রয়েছে। তবে, আমি যদি এই কোডটি আমার এক্সওয়াই ডেটাতে চালিত করি (যেমন [1,] 3093.5 -2987.8 [2,] 3072.7 -2991.0 ইত্যাদি), এটি কোণ অনুমান করে না, আকারও আঁকেনি। আমি যদি প্লট (আকার [[1]]] চালনা করি তবে আমি স্পষ্টভাবে আমার পলাইনটি দেখতে পাচ্ছি। সুতরাং, কীভাবে আমার ডেটাতে আপনার কোড পরীক্ষা করতে সক্ষম হবার জন্য আর এ পোলাইনগুলি সংরক্ষণ করব?
ক্লাউসোস ক্লাউসোস

আপনি যে একই ডেটা কাঠামোটি দিয়েছিলেন আমি তা শুরু করেছি: (x, y) স্থানাঙ্কের একটি অ্যারে। আমার অ্যারে সেই স্থানাঙ্কগুলি কলামগুলিতে রেখেছিল (যেন আপনি তার rbind(x,y)পরিবর্তে ব্যবহার করেছেন cbind(x,y))। আপনার যা প্রয়োজন তা কেবল: spগ্রন্থাগারটি ব্যবহৃত হয় না। কি আপনি বিষদভাবে সম্পন্ন করা হয় অনুসরণ করতে চান তাহলে, আমি আপনাকে পরামর্শ দিচ্ছি আপনার সাথে, বলো, শুরু n.shapes <- 2, n.shapes.new <- 3এবং p.mean <- 1। তারপরে shapes, shapes.stdইত্যাদি খুব সহজেই পরিদর্শন করা যায়। মার্জিত - এবং "ডান" উপায় - এই সমস্ত মোকাবেলা করা মানক বৈশিষ্ট্য উপস্থাপনা একটি শ্রেণি তৈরি করা হবে ।
whuber

1

আপনি নির্বিচারে আবর্তন এবং প্রসারণ সহ অনেক কিছু জিজ্ঞাসা করছেন! সেখানে হাউসডর্ফ দূরত্ব কতটা কার্যকর তা নিশ্চিত নয় তবে এটি পরীক্ষা করে দেখুন। আমার পদ্ধতির সস্তার তথ্যের মাধ্যমে চেক করার ক্ষেত্রে মামলার সংখ্যা হ্রাস করা হবে। উদাহরণস্বরূপ, দুটি লাইনস্ট্রিংয়ের দৈর্ঘ্য একটি পূর্ণসংখ্যার অনুপাত না হলে (ধনাত্মক সংখ্যার / স্নাতক স্কেলিং অনুমান করে ) আপনি ব্যয়বহুল তুলনাগুলি এড়িয়ে যেতে পারেন । আপনি একইভাবে বাউন্ডিং বক্স অঞ্চল বা তাদের উত্তল হলের অঞ্চলগুলি একটি ভাল অনুপাতে কিনা তা পরীক্ষা করতে পারেন। আমি নিশ্চিত যে সেন্ট্রয়েডের বিরুদ্ধে আপনি প্রচুর সস্তা চেক করতে পারেন যেমন শুরু / শেষ থেকে দূরত্ব বা কোণগুলি।

তারপরেই, আপনি যদি স্কেলিং সনাক্ত করেন তবে এটিকে পূর্বাবস্থায় ফেরান এবং সত্যিই ব্যয়বহুল চেকগুলি করুন।

স্পষ্টকরণ: আপনি যে প্যাকেজগুলি ব্যবহার করছেন তা আমি জানি না। পূর্ণসংখ্যার অনুপাতের দ্বারা আমি বোঝাতে চেয়েছিলাম আপনার উভয় দূরত্বকে ভাগ করে নেওয়া উচিত, ফলাফলটি পূর্ণসংখ্য কিনা তা পরীক্ষা করে দেখুন, যদি না হয় তবে সেই মানটি উল্টো করুন (আপনি কি ভুল ক্রমটি বেছে নিয়েছিলেন) এবং পুনরায় পরীক্ষা করা উচিত। আপনি যদি একটি পূর্ণসংখ্যা পান বা যথেষ্ট কাছে পান তবে আপনি অনুমান করতে পারেন যে সম্ভবত স্কেলিং চলছে। অথবা এটি কেবল দুটি ভিন্ন আকার হতে পারে।

বাউন্ডিং বক্সের জন্য, আপনি সম্ভবত এটি উপস্থাপন করে যে আয়তক্ষেত্রের বিপরীত পয়েন্ট পেয়েছেন, তাই অঞ্চলটি তাদের মধ্যে থেকে পাওয়া সহজ পাটিগণিত। অনুপাতের তুলনার পিছনে নীতিটি একই, ফলাফলটি স্কোয়ার করা হবে। উত্তম হোলগুলি নিয়ে বিরক্ত করবেন না যদি আপনি সেগুলি ভালভাবে আর আর প্যাকেজ থেকে বের করতে না পারেন, এটি কেবল একটি ধারণা ছিল (সম্ভবত এটি যথেষ্ট সস্তা নয়)।


অনেক ধন্যবাদ. আপনি যদি দয়া করে দুটি লাইনস্ট্রিংয়ের দৈর্ঘ্য একটি পূর্ণসংখ্যার অনুপাত না হয় তা কীভাবে সনাক্ত করবেন তা ব্যাখ্যা করতে পারেন? এছাড়াও, "বাউন্ডিং বাক্স অঞ্চল বা উত্তল হলের অঞ্চলগুলি যদি একটি ভাল অনুপাতে থাকে"
ক্লাউসোস ক্লাউসোস

উদাহরণস্বরূপ, আমি যদি স্থানিক ডেটা থেকে স্থানিক সীমানা বাক্সটি বের করি তবে আমি কেবল দুটি পয়েন্ট পেয়েছি: spl <- sp :: SpatialLines (তালিকা (লাইন (লাইন (xy.sp), ID = i))) বি <- bbox (
spl

মূল পদ বাড়ানো হয়েছে।
lynxlynxlynx 21

"আপনি যদি একটি পূর্ণসংখ্যা পান বা যথেষ্ট কাছে পান তবে আপনি অনুমান করতে পারেন যে সম্ভবত স্কেলিং চলছে" " কোনও ব্যবহারকারী কি 1.4 বা আরও বেশি স্কেল প্রয়োগ করতে পারেন না?
জার্মানি ক্যারিলো

অবশ্যই, তবে আমার ধারণাটি স্পষ্ট করে দেওয়া হয়েছিল, বিশেষত পরবর্তী সম্পাদনাগুলির সাথে। আমি ওয়েবম্যাপ স্টাইলটি জুম করার কথা ভাবছিলাম, যেখানে একটি সুন্দরভাবে সীমাবদ্ধ।
lynxlynxlynx

1

এই পলিইনগুলির তুলনা করার একটি ভাল পদ্ধতিটি হ'ল প্রতিটি উল্লম্বে (দূরত্ব, কোণ ঘোর) এর অনুক্রম হিসাবে উপস্থাপনার উপর নির্ভর করা: পয়েন্টগুলি সমন্বিত একটি লাইনের জন্য P1, P2, ..., PN, এই ক্রমটি হবে:

(দূরত্ব (পি 1 পি 2), কোণ (পি 1, পি 2, পি 3), দূরত্ব (পি 2 পি 3), ..., কোণ (পি (এন -2), পি (এন -1), পিএন), দূরত্ব (পি (এন-1) ) পি এন))।

আপনার প্রয়োজনীয়তা অনুসারে, দুটি লাইন সমান হয় যদি এবং কেবল যদি তাদের সম্পর্কিত অনুক্রমগুলি একই হয় (ক্রম এবং কোণের দিকটি মডুলু করা হয়)। সংখ্যা ক্রম তুলনা তুচ্ছ।

প্রতিটি পললাইন সিকোয়েন্সটি কেবল একবার গণনা করে এবং, যেমন লাইনক্স্লিনেক্স্লিনেক্সের পরামর্শ অনুসারে, পললাইন একই ধরণের তুচ্ছ বৈশিষ্ট্য (দৈর্ঘ্য, শীর্ষে সংখ্যা ...) থাকার জন্য ক্রমের মিলটি পরীক্ষা করে, গণনাটি সত্যই দ্রুত হওয়া উচিত!


এটি সঠিক ধারণা। এটি আসলে কাজ করার জন্য, যদিও অনেকগুলি বিবরণ সম্বোধন করা দরকার, যেমন প্রতিচ্ছবি মোকাবেলা, অভ্যন্তরীণ প্রবণতা, একাধিক সংযুক্ত উপাদানগুলির সম্ভাবনা এবং ভাসমান পয়েন্ট রাউন্ডঅফ ত্রুটি। আমার দেওয়া সমাধানটিতে সেগুলি আলোচনা করা হয়।
whuber

হ্যাঁ, আমি কেবল মূল ধারণাটি বর্ণনা করেছি। আপনার উত্তরটি উল্লেখযোগ্যভাবে আরও সম্পূর্ণ (প্রায়শই :-)
জুলিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.