পোস্টজিআইএসে এক্স-দিকনির্দেশে (পূর্ব-পশ্চিম দিক) বহুভুজের মধ্যে সর্বাধিক দূরত্ব গণনা করছেন?


13

পূর্ব-পশ্চিম দিকের বহুভুজ যেমন একটি হ্রদ, সর্বাধিক প্রস্থে আমি আগ্রহী। বাউন্ডিং বক্সগুলি কেবল সহজ বহুভুতে সহায়তা করবে তবে জটিল অবতল বহুভুতে নয়।


3
আমি পোস্টগ্রিজ কার্যকারিতার সাথে পরিচিত নই। তবে, একটি বাউন্ডিং বক্স সরঞ্জাম থাকতে পারে। বাউন্ডিং বক্সের প্রস্থটি EW দিকের সর্বোচ্চ দূরত্ব হবে।
ফেজার

4
@ ফেটজার যেটি সঠিক নয়: একটি সাধারণ জড়িত বহুভুজের জন্যও একটি পাল্টা নমুনা হ'ল একটি পাতলা রম্বস যা এসডাব্লু থেকে এনই অবধি বিস্তৃত হয়। এর সর্বাধিক পূর্ব-পশ্চিম প্রস্থ এটির সীমাবদ্ধ বাক্সের প্রস্থের একটি নির্বিচারে ছোট ভগ্নাংশ হতে পারে।
whuber

1
আমি এবং এই প্রস্তাবগুলির উপর ভিত্তি করে এই কাজের জন্য একটি ইউটিলিটি তৈরি করেছি । এটি বহুভুজের সর্বোচ্চ বা ন্যূনতম প্রস্থ গণনা করতে সক্ষম। বর্তমানে এটি একটি shp- ফাইলগুলির সাথে কাজ করে তবে আপনি এটি পোস্টজিআইএস দিয়ে কাজ করতে পুনরায় লিখতে পারেন বা পোস্টজিআইএসের সাথেও কাজ করবে এমন কোনও কিউজিআইএস প্লাগইনে বিকশিত হওয়া পর্যন্ত কিছু সময়ের জন্য অপেক্ষা করতে পারেন। বিস্তারিত বিবরণ এবং ডাউনলোড লিঙ্ক এখানে
এসএস_বিবাদী

উত্তর:


16

সম্ভবত এটির জন্য কোনও জিআইএস প্ল্যাটফর্মের কিছু স্ক্রিপ্টিং দরকার।

সর্বাধিক দক্ষ পদ্ধতিটি (অ্যাসিপটোটিক্যালি) একটি উল্লম্ব লাইন সুইপ: এটি ও (ই * লগ) এর জন্য প্রান্তগুলি তাদের ন্যূনতম y- স্থানাঙ্কগুলি অনুসারে বাছাই করা এবং তারপরে নীচে (সর্বনিম্ন y) শীর্ষে (সর্বোচ্চ y) প্রান্তগুলি প্রক্রিয়াকরণ করা প্রয়োজন it e)) প্রান্তগুলি জড়িত থাকার সময় অ্যালগরিদম ।

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

একটি বহুভুজ

আমরা বিশেষভাবে বহুভুজটির বন্ধের মধ্যে থাকা পুরো দৈর্ঘ্যের অনুভূমিক অংশটি সন্ধান করব । উদাহরণস্বরূপ, এটি x = 20 এবং x = 40 এর মধ্যবর্তী গর্তটি x = 10 এবং x = 25 এর মধ্যে গর্ত থেকে নির্গত করে। তারপরে এটি সর্বাধিক দৈর্ঘ্যের অনুভূমিক বিভাগগুলির মধ্যে অন্তত একটিকে কমপক্ষে একটি মেরুদণ্ডকে ছেদ করে দেখানো সহজ। (যদি কোন ছেদচিহ্ন ছেদ সমাধান, তারা কিছু সামন্তরিক সমাধান যার দ্বারা উপরে এবং নীচে বেষ্টিত অভ্যন্তর থাকবে না ছেদ অন্তত এক চূড়া। এটি আমাদের খুঁজে পেতে একটি উপায় দেয় সব সমাধান।)

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

উদাহরণস্বরূপ, যখন y = 10 এর একটি স্তর পৌঁছে যায় তখন রাষ্ট্রটি বিবেচনা করুন। বাম থেকে ডানে, আমরা নিম্নলিখিত প্রান্তগুলি খুঁজে পাই:

      x.min x.max y.min y.max
 [1,]    10     0     0    30
 [2,]    10    24    10    20
 [3,]    20    24    10    20
 [4,]    20    40    10    10
 [5,]    40    20    10    10
 [6,]    60     0     5    30
 [7,]    60    60     5    30
 [8,]    60    70     5    20
 [9,]    60    70     5    15
[10,]    90   100    10    40

এই সারণীতে (x.min, y.min) প্রান্তের নিম্ন প্রান্তের স্থানাঙ্ক এবং (x.max, y.max) এর উপরের শেষ প্রান্তের স্থানাঙ্ক রয়েছে। এই স্তরে (y = 10), প্রথম প্রান্তটি তার অভ্যন্তরের অভ্যন্তরে বাধা দেওয়া হয়, দ্বিতীয়টি তার নীচে বাধা থাকে এবং আরও অনেক কিছু। এই স্তরে শেষ হওয়া কিছু প্রান্ত যেমন (10,0) থেকে (10,10), তালিকায় অন্তর্ভুক্ত নয়

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

উদাহরণস্বরূপ, এখানে এক্স-স্থানাঙ্কের বাছাই করা তালিকা দেওয়া হয়েছে যেখানে অনুভূমিক প্রান্তগুলি y = 10 লাইনে শুরু হয় বা অতিক্রম করে:

x.array    6.7 10 20 48 60 63.3 65 90
interior     1  0  1  0  1    0  1  0

(লক্ষ করুন যে x = 40 এই তালিকায় নেই)) interiorঅ্যারের মানগুলি অভ্যন্তরীণ বিভাগগুলির বাম প্রান্ত চিহ্নিত করে: 1 একটি অভ্যন্তরীণ বিরতি, 0 বহির্মুখী বিরতি নির্ধারণ করে। সুতরাং, প্রথম 1 বহুভুজের মধ্যে x = 6.7 থেকে x = 10 এর বিরতি নির্দেশ করে। পরের 0টি x = 10 থেকে x = 20 এর মধ্যবর্তীটি বহুভুজের বাইরে রয়েছে indicates এবং তাই এটি এগিয়ে যায়: অ্যারে বহুভুজের অভ্যন্তরের হিসাবে চারটি পৃথক অন্তর চিহ্নিত করে।

এর মধ্যে কয়েকটি অন্তর, যেমন x = 60 থেকে x = 63.3 এর মধ্যে কোনও বিন্দু ছেদ করে না: y = 10 দিয়ে সমস্ত উলম্বের এক্স-স্থানাঙ্কের বিরুদ্ধে একটি দ্রুত চেক যেমন অন্তরগুলি সরিয়ে দেয়।

স্ক্যান চলাকালীন আমরা এই ব্যবধানগুলির দৈর্ঘ্য পর্যবেক্ষণ করতে পারি, এখন পর্যন্ত পাওয়া সর্বাধিক দৈর্ঘ্যের বিরতি সম্পর্কিত ডেটা ধরে রেখে।

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

দুটিরও বেশি প্রান্ত একটি শিরোনাম ভাগ করতে পারে: এটি (10,0), (60,5), (25, 20) তে চিত্রিত হয়েছে এবং - যদিও এটি বলা শক্ত - (20,10) এবং (40) 10)। (এটি কারণ দ্বিধাটি (20,10) -> (40,10) -> (40,0) -> (40, -50) -> (40, 10) -> (20, 10)। লক্ষ্য করুন কীভাবে (40,0) এর ভার্টেক্সটি অন্য প্রান্তের অভ্যন্তরেও রয়েছে ... এটি খুব বাজে)) এই অ্যালগরিদম সেই পরিস্থিতিগুলি ঠিক ঠিক পরিচালনা করে।

একটি জটিল পরিস্থিতি একেবারে নীচে চিত্রিত করা হয়েছে: অ-অনুভূমিক বিভাগগুলির এক্স-স্থানাঙ্কগুলি রয়েছে

30, 50

এর ফলে x = 30 এর বামে সমস্ত কিছু বাহ্যিক হিসাবে বিবেচিত হবে, 30 থেকে 50 এর মধ্যে সমস্ত কিছু অভ্যন্তরীণ হবে এবং 50 এর পরে সমস্ত কিছু আবার বহিরাগত হবে। X = 40 এর শীর্ষবিন্দু এমনকি এই অ্যালগরিদমে কখনও বিবেচনা করা হয় না।

স্ক্যানের শেষে বহুভুজ দেখতে কেমন। আমি গা ver় ধূসর মধ্যে সমস্ত শীর্ষবিন্দুযুক্ত অভ্যন্তরীণ অন্তরগুলি দেখাব, লাল কোনও সর্বাধিক দৈর্ঘ্যের অন্তর, এবং তাদের y- স্থানাঙ্ক অনুযায়ী প্রান্তকে রঙ করুন। সর্বাধিক বিরতি 64 ইউনিট দীর্ঘ long

স্ক্যানের পরে

জড়িত কেবল জ্যামিতিক গণনাগুলিই এমন গণনা করা হয় যেখানে প্রান্তগুলি অনুভূমিক রেখাগুলি ছেদ করে: এটি একটি সাধারণ লিনিয়ার অন্তরঙ্গন। কোন অভ্যন্তরীণ বিভাগগুলিতে শৃঙ্খলা রয়েছে তা নির্ধারণের জন্য গণনাগুলিও প্রয়োজনীয় : এগুলি হ'ল দূরত্ব নির্ধারণ, সহজেই বেশ কয়েকটি অসমতার সাথে গণনা করা। এই সরলতাটি পূর্ণসংখ্যা এবং ভাসমান পয়েন্টের সমন্বয় উপস্থাপনের জন্য অ্যালগরিদমকে শক্ত এবং উপযুক্ত করে তোলে।

স্থানাঙ্কগুলি যদি ভৌগলিক হয় তবে অনুভূমিক রেখাগুলি অক্ষাংশের বৃত্তগুলিতে রয়েছে। তাদের দৈর্ঘ্য গণনা করা কঠিন নয়: কেবলমাত্র তাদের ইউক্লিডিয়ান দৈর্ঘ্যগুলি তাদের অক্ষাংশের কোসাইন দ্বারা (একটি গোলাকৃতির মডেলটিতে) গুণ করুন। অতএব এই অ্যালগরিদম ভৌগলিক স্থানাঙ্কে খুব ভালভাবে খাপ খায়। (+ -180 মেরিডিয়ান ভালভাবে চারপাশে মোড়ানো পরিচালনা করার জন্য প্রথমে দক্ষিণ মেরু থেকে উত্তর মেরুতে যে বহুবিন্দুটি অতিক্রম করে না এমন একটি বাঁক খুঁজে পাওয়া দরকার all সমস্ত এক্স-স্থানাঙ্কটিকে অনুভূমিক স্থানচ্যুতি হিসাবে পুনরায় প্রকাশের পরে বক্ররেখা, এই অ্যালগরিদম সঠিকভাবে সর্বাধিক অনুভূমিক অংশটি খুঁজে পাবে))


নিম্নলিখিত Rগণনা সম্পাদন করতে এবং চিত্রগুলি তৈরি করতে কোডটি প্রয়োগ করা হয়েছে।

#
# Plotting functions.
#
points.polygon <- function(p, ...) {
  points(p$v, ...)
}
plot.polygon <- function(p, ...) {
  apply(p$e, 1, function(e) lines(matrix(e[c("x.min", "x.max", "y.min", "y.max")], ncol=2), ...))
}
expand <- function(bb, e=1) {
  a <- matrix(c(e, 0, 0, e), ncol=2)
  origin <- apply(bb, 2, mean)
  delta <-  origin %*% a - origin
  t(apply(bb %*% a, 1, function(x) x - delta))
}
#
# Convert polygon to a better data structure.
#
# A polygon class has three attributes:
#   v is an array of vertex coordinates "x" and "y" sorted by increasing y;
#   e is an array of edges from (x.min, y.min) to (x.max, y.max) with y.max >= y.min, sorted by y.min;
#   bb is its rectangular extent (x0,y0), (x1,y1).
#
as.polygon <- function(p) {
  #
  # p is a list of linestrings, each represented as a sequence of 2-vectors 
  # with coordinates in columns "x" and "y". 
  #
  f <- function(p) {
    g <- function(i) {
      v <- p[(i-1):i, ]
      v[order(v[, "y"]), ]
    }
    sapply(2:nrow(p), g)
  }
  vertices <- do.call(rbind, p)
  edges <- t(do.call(cbind, lapply(p, f)))
  colnames(edges) <- c("x.min", "x.max", "y.min", "y.max")
  #
  # Sort by y.min.
  #
  vertices <- vertices[order(vertices[, "y"]), ]
  vertices <- vertices[!duplicated(vertices), ]
  edges <- edges[order(edges[, "y.min"]), ]

  # Maintaining an extent is useful.
  bb <- apply(vertices <- vertices[, c("x","y")], 2, function(z) c(min(z), max(z)))

  # Package the output.
  l <- list(v=vertices, e=edges, bb=bb); class(l) <- "polygon"
  l
}
#
# Compute the maximal horizontal interior segments of a polygon.
#
fetch.x <- function(p) {
  #
  # Update moves the line from the previous level to a new, higher level, changing the
  # state to represent all edges originating or strictly passing through level `y`.
  #
  update <- function(y) {
    if (y > state$level) {
      state$level <<- y
      #
      # Remove edges below the new level from state$current.
      #
      current <- state$current
      current <- current[current[, "y.max"] > y, ]
      #
      # Adjoin edges at this level.
      #
      i <- state$i
      while (i <= nrow(p$e) && p$e[i, "y.min"] <= y) {
        current <- rbind(current, p$e[i, ])
        i <- i+1
      }
      state$i <<- i
      #
      # Sort the current edges by x-coordinate.
      #
      x.coord <- function(e, y) {
        if (e["y.max"] > e["y.min"]) {
          ((y - e["y.min"]) * e["x.max"] + (e["y.max"] - y) * e["x.min"]) / (e["y.max"] - e["y.min"])
        } else {
          min(e["x.min"], e["x.max"])
        }
      }
      if (length(current) > 0) {
        x.array <- apply(current, 1, function(e) x.coord(e, y))
        i.x <- order(x.array)
        current <- current[i.x, ]
        x.array <- x.array[i.x]     
        #
        # Scan and mark each interval as interior or exterior.
        #
        status <- FALSE
        interior <- numeric(length(x.array))
        for (i in 1:length(x.array)) {
          if (current[i, "y.max"] == y) {
            interior[i] <- TRUE
          } else {
            status <- !status
            interior[i] <- status
          }
        }
        #
        # Simplify the data structure by retaining the last value of `interior`
        # within each group of common values of `x.array`.
        #
        interior <- sapply(split(interior, x.array), function(i) rev(i)[1])
        x.array <- sapply(split(x.array, x.array), function(i) i[1])

        print(y)
        print(current)
        print(rbind(x.array, interior))


        markers <- c(1, diff(interior))
        intervals <- x.array[markers != 0]
        #
        # Break into a list structure.
        #
        if (length(intervals) > 1) {
          if (length(intervals) %% 2 == 1) 
            intervals <- intervals[-length(intervals)]
          blocks <- 1:length(intervals) - 1
          blocks <- blocks - (blocks %% 2)
          intervals <- split(intervals, blocks)  
        } else {
          intervals <- list()
        }
      } else {
        intervals <- list()
      }
      #
      # Update the state.
      #
      state$current <<- current
    }
    list(y=y, x=intervals)
  } # Update()

  process <- function(intervals, x, y) {
    # intervals is a list of 2-vectors. Each represents the endpoints of
    # an interior interval of a polygon.
    # x is an array of x-coordinates of vertices.
    #
    # Retains only the intervals containing at least one vertex.
    between <- function(i) {
      1 == max(mapply(function(a,b) a && b, i[1] <= x, x <= i[2]))
    }
    is.good <- lapply(intervals$x, between)
    list(y=y, x=intervals$x[unlist(is.good)])
    #intervals
  }
  #
  # Group the vertices by common y-coordinate.
  #
  vertices.x <- split(p$v[, "x"], p$v[, "y"])
  vertices.y <- lapply(split(p$v[, "y"], p$v[, "y"]), max)
  #
  # The "state" is a collection of segments and an index into edges.
  # It will updated during the vertical line sweep.
  #
  state <- list(level=-Inf, current=c(), i=1, x=c(), interior=c())
  #
  # Sweep vertically from bottom to top, processing the intersection
  # as we go.
  #
  mapply(function(x,y) process(update(y), x, y), vertices.x, vertices.y)
}


scale <- 10
p.raw = list(scale * cbind(x=c(0:10,7,6,0), y=c(3,0,0,-1,-1,-1,0,-0.5,0.75,1,4,1.5,0.5,3)),
             scale *cbind(x=c(1,1,2.4,2,4,4,4,4,2,1), y=c(0,1,2,1,1,0,-0.5,1,1,0)),
             scale *cbind(x=c(6,7,6,6), y=c(.5,2,3,.5)))

#p.raw = list(cbind(x=c(0,2,1,1/2,0), y=c(0,0,2,1,0)))
#p.raw = list(cbind(x=c(0, 35, 100, 65, 0), y=c(0, 50, 100, 50, 0)))

p <- as.polygon(p.raw)

results <- fetch.x(p)
#
# Find the longest.
#
dx <- matrix(unlist(results["x", ]), nrow=2)
length.max <- max(dx[2,] - dx[1,])
#
# Draw pictures.
#
segment.plot <- function(s, length.max, colors,  ...) {
  lapply(s$x, function(x) {
      col <- ifelse (diff(x) >= length.max, colors[1], colors[2])
      lines(x, rep(s$y,2), col=col, ...)
    })
}
gray <- "#f0f0f0"
grayer <- "#d0d0d0"
plot(expand(p$bb, 1.1), type="n", xlab="x", ylab="y", main="After the Scan")
sapply(1:length(p.raw), function(i) polygon(p.raw[[i]], col=c(gray, "White", grayer)[i]))
apply(results, 2, function(s) segment.plot(s, length.max, colors=c("Red", "#b8b8a8"), lwd=4))
plot(p, col="Black", lty=3)
points(p, pch=19, col=round(2 + 2*p$v[, "y"]/scale, 0))
points(p, cex=1.25)

এমন কোন উপপাদ্য যা প্রমাণ করে যে কোনও প্রদত্ত দিকের নন-উত্তল বহুভুজের ভিতরে সর্বাধিক দৈর্ঘ্যের রেখাটি এই বহুভুজের কমপক্ষে একটি ভার্টেক্সকে ছেদ করে?
এসএস_বিবাদী

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

আর এই উপপাদকের নাম কী? আমি এটি খুঁজে পেতে সংগ্রাম করছি। বিটিডাব্লু, কোন বাঁকা প্রান্তের কী আছে যার কোনও বিন্দু নেই (মানে একটি তাত্ত্বিক পদ্ধতির অর্থ)? চিত্রটি যার অর্থ আমি বোঝাতে চাইছি (একটি বোবা ঘণ্টা আকৃতির বহুভুজ) এর উদাহরণের একটি স্কেচ: "সি = ডি"।
এসএস_বিবাদী

@ এসএসএস যখন প্রান্তগুলি বাঁকা হয় তখন উপপাদ্যটি আর ধরে না। কার্যকর ফলাফল পেতে ডিফারেনশাল জ্যামিতির কৌশল প্রয়োগ করা যেতে পারে। রিজার্নিয়ান জ্যামিতির তুলনামূলক উপপাদাগুলি চিজার এবং এবিনের বই থেকে আমি এই পদ্ধতিগুলি শিখেছি । তবে, বেশিরভাগ জিআইএসগুলি যে কোনও উপায়ে বিশদ পলিনগুলি দ্বারা আনুমানিক বক্ররেখাগুলি তৈরি করবে, সুতরাং প্রশ্নটি (ব্যবহারিক বিষয় হিসাবে) মোট।
whuber

আপনি উপপাদ্যের নাম (এবং যদি পৃষ্ঠায় সম্ভব হয়) নির্দিষ্ট করতে পারেন? আমি বইটি পেয়েছি এবং প্রয়োজনীয় উপপাদ্যটি সনাক্ত করতে সক্ষম হয়েছি।
এসএস_বিবাদী

9

এখানে একটি রাস্টার ভিত্তিক সমাধান রয়েছে। এটি দ্রুত (আমি 14 মিনিটের মধ্যে শেষ হতে সমস্ত কাজ করেছি), কোনও স্ক্রিপ্টিংয়ের দরকার নেই, কেবল কয়েকটি অপারেশন লাগে, এবং যুক্তিসঙ্গতভাবে নির্ভুল।

বহুভুজের রাস্টার উপস্থাপনা দিয়ে শুরু করুন। এটির মধ্যে 550 টি সারি এবং 1200 কলামের গ্রিড ব্যবহার করা হয়েছে:

বহুভুজ

এই উপস্থাপনায় ধূসর (অভ্যন্তরীণ) কোষগুলির মান 1 এবং অন্যান্য সমস্ত কোষ নোডেটা হয়।

ওয়েট গ্রিড ("বৃষ্টিপাতের পরিমাণ") এর ইউনিট সেল মান ব্যবহার করে পশ্চিম থেকে পূর্ব দিকে প্রবাহের সঞ্চারকে গণনা করুন :

প্রবাহ জমে

কম জমে থাকা অন্ধকার, উজ্জ্বল হলুদে সর্বাধিক সঞ্চারে বাড়ছে।

একটি জোনাল সর্বাধিক (গ্রিডের জন্য বহুভুজ ব্যবহার করে এবং মানগুলির জন্য প্রবাহের সঞ্চার) কোষ (গুলি) সনাক্ত করে যেখানে প্রবাহ সর্বাধিক। এগুলি দেখানোর জন্য, আমাকে নীচের ডানদিকে জুম করতে হবে:

সর্বাধিক

লাল কোষগুলি স্রোতের সর্বাধিক সঞ্চারের প্রান্ত চিহ্নিত করে: এগুলি বহুভুজের সর্বাধিক দৈর্ঘ্যের অভ্যন্তরীণ অংশগুলির ডানদিকের শেষ পয়েন্ট।

এই বিভাগগুলি সন্ধান করতে, সমস্ত ওজন লাল কোষে রাখুন এবং প্রবাহটি পিছনের দিকে চালান!

ফলাফল

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

রাস্টার প্রতিনিধিত্ব করে কিছু বিচক্ষণ ত্রুটি হয়েছে। এটি রেজুলেশন বাড়িয়ে, গণনার সময় কোনও মূল্যে হ্রাস করা যেতে পারে।


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

কাছাকাছি-অনুকূল ঘর নির্বাচন করা হয়েছে

পূর্ব থেকে পশ্চিমে প্রবাহ চালানো অনুভূমিক বিভাগগুলির এই সংগ্রহের উত্পাদন করে:

কাছাকাছি অনুকূল সমাধান

এটি এমন জায়গাগুলির মানচিত্র যেখানে বহুবিধের মধ্যে পূর্ব-পশ্চিম সীমানা 95% বা তার চেয়ে বেশি পূর্ব-পশ্চিম সীমানার চেয়ে বেশি।


3

ঠিক আছে. আমি আরেকটি (আরও ভাল) ধারণা পেয়েছি ( ধারণা -2 )। তবে আমি অনুমান করি যে এটি একটি এসকিউএল-কোয়েরি হিসাবে নয়, অজগর স্ক্রিপ্ট হিসাবে অনুধাবন করা ভাল। আবার এখানে সাধারণ ঘটনা, কেবল EW নয়।

বহুভুজের জন্য আপনার একটি বাউন্ডিং বাক্স এবং আপনার পরিমাপের দিকনির্দেশ হিসাবে একটি আজিমুথ (এ) প্রয়োজন হবে। ধরে নিন যে বিবিক্স প্রান্তগুলির দৈর্ঘ্য এলএ এবং এলবি are সর্বোচ্চ সম্ভব দূরত্ব (এমডি) একটি বহুভুজ মধ্যে হল: MB = (LA^2 * LB^2)^(1/2), তাই চাইছেন মান (v) মেগাবাইট চেয়ে বড় নয়: V <= MB

  1. বিবিক্সের যে কোনও প্রান্ত থেকে শুরু করে দৈর্ঘ্যের এমবি এবং আজিমুথ এ দিয়ে একটি লাইন (এলএল) তৈরি করুন
  2. ছেদ লাইন (আইএল) পেতে বহুভুজের সাথে লাইন এলএল ছেদ করুন
  3. আইএল এর জ্যামিতি পরীক্ষা করুন - যদি আইএল লাইনে কেবল দুটি পয়েন্ট থাকে তবে তার দৈর্ঘ্য গণনা করুন। যদি 4 বা ততোধিক হয় - বিভাগগুলি গণনা করুন এবং দীর্ঘতম দৈর্ঘ্যের চয়ন করুন। নাল (কোনও ছেদ নেই) - উপেক্ষা করুন।
  4. প্রারম্ভকেন্দ্রের কাউন্টার থেকে ঘড়ির কাঁটার দিক থেকে অন্য এলএল লাইনগুলি তৈরি করা চালিয়ে যান, যতক্ষণ না আপনি প্রারম্ভিক পয়েন্টে শেষ করবেন না (আপনি পুরো লুপটি BBox জুড়ে করবেন)।
  5. বৃহত্তম আইএল দৈর্ঘ্যের মানটি তুলুন (আসলে আপনাকে সমস্ত দৈর্ঘ্য সংরক্ষণ করতে হবে না, লুপিংয়ের সময় আপনি কেবলমাত্র 'এতদূর' সর্বোচ্চ মূল্য রাখতে পারেন) - এটি আপনি যা খুঁজছেন তা হবে।

এটি শিখুনের দ্বিগুণ উপরে ডাবল লুপের মতো: এটি যথেষ্ট পরিমাণে অক্ষম যে এটি এড়ানো উচিত (খুব সরলিকৃত বহুভুজ ব্যতীত)।
whuber

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

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

@ হুবার, প্রস্তাবিত অ্যালগরিদম প্রদত্ত দিকটি উপস্থাপন করে এমন রেখাটির সাহায্যে বহুভুজের দীর্ঘতম ছেদ খুঁজে পেয়েছে। স্পষ্টতই ফলাফলটি জিজ্ঞাসা করা হয়েছিল যে ছেদ লাইনগুলির মধ্যে দূরত্ব -> 0 বা এটি সমস্ত শীর্ষবিন্দুগুলি (বাঁকা চিত্রগুলির জন্য নয়) অতিক্রম করে।
এসএস_বিবাদী

3

আমি নিশ্চিত না যে ফেটজারের উত্তরটি আপনি যা করতে চান তা হ'ল তবে st_box2d কাজটি করতে পারে।

এসএস_বেলিয়াসের ধারণা এন ° 1 অনেক ক্ষেত্রে কাজ করবে তবে কিছু অবতল বহুভুজের জন্য নয়।

আমি মনে করি যে পূর্ব-পশ্চিম রেখার সম্ভাবনা থাকলে ভার্টেক্স-তৈরি লাইনগুলি বহুভুজের সীমানা অতিক্রম করার সময় আপনার অবশ্যই কৃত্রিম এলডব্লু-লাইন তৈরি করতে হবে যা প্রান্তগুলি অনুসরণ করে points এটি কাজ করবে না যেখানে একটি উদাহরণ

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


এটি সঠিক পথে রয়েছে। বহু দৈর্ঘ্যের ইডাব্লু অংশটি বহুভুজের অভ্যন্তরের সাথে অনুভূমিক রেখার সাথে বহুভুজের অভ্যন্তরের চৌরাস্তার মধ্যে পাওয়া যাবে be এটি শীর্ষে লুপ করতে কোড প্রয়োজন। বহুভুজের রাস্টার উপস্থাপনা জুড়ে একটি কৃত্রিম পূর্ব-পশ্চিম প্রবাহ অনুসরণ করে একটি বিকল্প (তবে সমতুল্য) পদ্ধতি উপলব্ধ রয়েছে : বহুভুজের সর্বাধিক প্রবাহ দৈর্ঘ্য (যা তার "অঞ্চলের পরিসংখ্যানগুলির মধ্যে একটি") পছন্দসই প্রস্থ। রাস্টার সমাধানটি মাত্র 3 বা 4 ধাপে প্রাপ্ত হয় এবং কোনও লুপিং বা স্ক্রিপ্টিংয়ের প্রয়োজন হয় না।
হুশিয়ার

@ নাম, ভুল বোঝাবুঝি এড়ানোর জন্য দয়া করে "SS1" "SS_Rebelious এর ধারণায়" যুক্ত করুন: আমি আরও একটি প্রস্তাব যুক্ত করেছি। আমি আপনার উত্তরটি নিজে সম্পাদনা করতে পারছি না কারণ এই সম্পাদনাটি 6 টি অক্ষরের চেয়ে কম।
এসএস_বিবাদী

1

আমার একটি ধারণা -1 রয়েছে ( সম্পাদনা করুন: সাধারণ ক্ষেত্রে, কেবল EW দিকই নয়, এবং মন্তব্যগুলিতে বর্ণিত কিছু সীমাবদ্ধতার সাথেও)। আমি কোডটি সরবরাহ করব না, কেবল একটি ধারণা। "এক্স-ডাইরেক্টেশন" আসলে একটি আজিমুথ, যা ST_Azimuth দ্বারা গণনা করা হয়। প্রস্তাবিত পদক্ষেপগুলি হ'ল:

  1. পয়েন্ট হিসাবে বহুভুজ থেকে সমস্ত শীর্ষে বের করুন।
  2. প্রতিটি জোড় পয়েন্টের মধ্যে লাইন তৈরি করুন।
  3. মূল বহুভুজের মধ্যে থাকা লাইনগুলি (তাদেরকে এলডব্লু-লাইনগুলি কল করতে দিন) নির্বাচন করুন (আমাদের এমন বহু লাইনের প্রয়োজন নেই যা বহুভুজের সীমানা অতিক্রম করবে)।
  4. প্রতিটি এলডাব্লু-লাইনের জন্য দূরত্ব এবং আজিমুথগুলি সন্ধান করুন।
  5. আলডাব্লু-লাইনগুলি থেকে দীর্ঘতম দূরত্ব নির্বাচন করুন যেখানে আজিমুথ আজিমুথের সন্ধান সমান বা কিছু বিরতিতে রয়েছে (এটি এমন হতে পারে যে কোনও আজিমুথ আজিমুথের সন্ধানের জন্য ঠিক সমান হবে না)।

এটি কিছু ত্রিভুজগুলির জন্য এমনকি কাজ করতে ব্যর্থ হবে , যেমন একটি শীর্ষে (0,0), (1000, 1000) এবং (501, 499)। এর সর্বাধিক পূর্ব-পশ্চিম প্রস্থ প্রায় 2; আজিমুথগুলি প্রায় 45 ডিগ্রি প্রায়; এবং নির্বিশেষে, শীর্ষভাগের মধ্যে সংক্ষিপ্ততম রেখাংশটি পূর্ব-পশ্চিম প্রস্থের চেয়ে 350 গুণ বেশি লম্বা।
whuber

@ হুবুহু, আপনি ঠিক বলেছেন, এটি ত্রিভুজগুলির জন্য ব্যর্থ হবে তবে বহুভুজের জন্য কিছু প্রাকৃতিক বৈশিষ্ট্য উপস্থাপন করা এটি কার্যকর হতে পারে।
এসএস_বিবাদী

1
এমন একটি পদ্ধতির সুপারিশ করা কঠিন যা সাধারণ ক্ষেত্রেও নাটকীয়ভাবে ব্যর্থ হয় এমনকি এই আশায় যে এটি কখনও কখনও সঠিক উত্তর পায়!
হুড়হুড়ি

@ হুবুহু, সুতরাং এটি সুপারিশ করবেন না! ;-) আমি এই প্রস্তাবটির প্রস্তাব দিয়েছি কারণ এই প্রশ্নের কোনও উত্তর নেই। লক্ষ্য করুন যে আপনি নিজের ভাল উত্তর পোস্ট করতে পারেন। বিটিডাব্লু, আপনি যদি ত্রিভুজ প্রান্তে কিছু পয়েন্ট রাখেন তবে আমার প্রস্তাবটি কাজ করবে ;-)
এসএস_বিবাদী

আমি বেশ কয়েকটি পদ্ধতির পরামর্শ দিয়েছি। একজন রাস্টার একজন gis.stackexchange.com/questions/32552/…রয়েছে এবং forums.esri.com/Thread.asp?c=93&f=982&t=107703&mc=3বিস্তৃত । অন্য একটি - যথেষ্ট হিসাবে প্রযোজ্য নয়, তবে আকর্ষণীয় ব্যবহার সহ - এটি gis.stackexchange.com/questions/23664/… (রেডন রূপান্তর) এ রয়েছে। এটি stats.stackexchange.com/a/33102চিত্রিত
whuber

1

আমার তাকান প্রশ্ন এবং এভিল জিনিয়াসের উত্তরটি দেখুন

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

এখানে একটি উদাহরণ:

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

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

এই পদ্ধতির জন্য অনিয়মিত বা অবতল বহুভুজের জন্য একটি ধারণা। হতে পারে আপনাকে রাস্টার দিয়ে বহুভুজ ছেদ করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.