Raster işleme kullanılarak noktanın çevrelenip çevrilmediğini belirleme


9

Doğal bir tehlike modeli için şu anda son derece hantal bir vektör / python sürecini geliştirmeye çalışıyorum. Şu anda belirli bir noktadan uzaklık / yön çizgileri üreten uzun bir senaryomuz var:

  1. kesiştiği çokgen türü (örn. Orman, çimen, bataklık, vb.)
  2. o çokgene uzaklık
  3. ne kadar çevrelendiğini belirlemek için bu çizgilerin kaç tanesi çokgenlerle kesişir.

Çok daha fazlası var ama bunun özü bu. Bunu iyileştirmek için bir yol bulmaya çalışıyorum ve şu anda 3. bölümde sıkıştım. Fikir, bir noktanın tamamen 200 metre içinde çokgenlerle çevrilip çevrilmediğini belirlemektir.PointA çevrilidir, PointB yalnızca ~% 50 çevrilidir

Ekli görüntümde, A noktasının tamamen çokgenlerimle çevrili olduğu için B noktasından daha yüksek risk altında olarak işaretlenmesini istiyorum. Bu yaklaşık 13 milyon puan için tekrarlanır, bu yüzden küçük bir görev değildir ve senaryomuzu çalıştırmak yerine değerleri türetmek için bir yüzeye sahip olmayı tercih ederim. Bunu yapmak için hidroloji araçlarının veya maliyet yollarının bir varyasyonu olması gerektiğini düşünüyorum ama kafamı bulamıyorum.

Bunu nasıl başarabilirim?


1
Görüş alanı göreve hazırdır, ancak 13 milyon noktaya uygulandığında hatırı sayılır yardıma ihtiyaç duyacaktır! Öncelikle (mesela) 200m'den daha küçük çaplara sahip çokgenlerin dışındaki bölgelerde bulunan ve "A" yı hariç tutabilecek, ancak "B" yi dışlayabilecek noktaları kontrol etmek için kolay olan noktaların nasıl ayıklanacağını düşünün. "B" hiçbir zaman dışlanmayacaktır, çünkü görüş alanı (çokgen alanların çok "yüksek" konumlar olarak görülmesini engeller) B'nin konumundan 200 metreden daha fazla uzanır.
whuber

İyi bir nokta @whuber. Kesinlikle yakınlık ve aslında benzersiz lat-longs tarafından işlenen toplam puan sayısını azaltabiliyorum (apartman blokları 50 puandan 1'e düşürülebilecek şekilde coğrafi kodlu adreslerden bahsediyorum) ama hala bakacağım birkaç milyon yerde. Ayrıca gerekirse her şeyi çakışan bloklara bölebilirim. Görüş alanını araştıracak. Teşekkürler!
Loz

Bir başka hızlı ekran, dairesel bir mahalle kullanarak çokgenlerin 0-1 gösterge ızgarasının odak ortalamasını hesaplamaktır: değerinin 1 olduğu herhangi bir hücrede, çokgenleriniz çevrelenmeleri gereken yarıçapta tüm çevreyi işgal eder. Bu hızlı bir hesaplamadır ve nerede olduklarına ve çokgenlerinizin ne kadar kıvrık olduğuna bağlı olarak puanlarınızın büyük çoğunluğunu ayıklayabilir. Ayrıca, ilk önce ızgarayı 25-50 m gibi bir kaba çözünürlükle yeniden örnekleyerek ilk taramayı hızlandırabilirsiniz.
whuber

Bir başka potansiyel işleme adımı veya ön işleme adımı, puanlarınızı veri kümenizin, noktaların etrafındaki bir mahallenin istatistiklerini karşılaştıran rasterleştirilmiş bir sürümünden geçirmek olacaktır. 'Çevrili' gereksiniminizi puan mahallesinin bir istatistiği olarak soyutlayabilir veya 'çevrili' gerekliyse, raster mahallesini kullanarak 'kolay' noktaları (yani tamamen riskli bir alan içindeki bir noktayı) bulabilirsiniz, Tüm noktalardan 'kolay' noktaları ayrıştırın, sonra geri kalan noktalar için vektör analizini kullanın.
DPierce

vay benim sorgu kesinlikle çok ilgi yarattı! Öneri ve yorum yapan herkese teşekkürler. Hepsine rağmen yoluma devam edeceğim ve cevap vereceğim ama hepsi test etmem için biraz zaman alacak. Söz veriyorum sonunda cevap vereceğim!
Loz

Yanıtlar:


6

Bir maliyet yolu çözümü var, ancak bunu kendiniz kodlamanız gerekecek. Sorudaki görüntüdeki her noktaya uygulandığında neye benzeyebileceği aşağıda (hesaplamaları hızlandırmak için biraz kabalaştırılmıştır):

Resim 0

Kara hücreler, çevreleyen çokgenlerin parçalarıdır. Açık turuncu (kısa) ile mavi (uzun) arasında değişen renkler, poligon hücrelerini engellemeden görüş hattı geçişi ile ulaşılabilecek maksimum mesafeyi (maksimum 50 hücreye kadar) gösterir. (Bu görüntünün kapsamı dışındaki herhangi bir hücre, çokgenlerin bir parçası olarak ele alınır.)

Verilerin raster temsilini kullanarak bunu yapmanın etkili bir yolunu tartışalım. Bu gösterimde, tüm "çevreleyen" poligonal hücrelerin, örneğin sıfır olmayan değerlere sahip olacağı ve "içinden geçilebilen" herhangi bir hücrenin sıfır değeri olacaktır.

1. Adım: Bir mahalle veri yapısının önceden hesaplanması

Önce bir hücrenin diğerini engellemesinin ne anlama geldiğine karar vermelisiniz. Bulabildiğim en adil kurallardan biri şudur: satırlar ve sütunlar için integral koordinatlar kullanarak (ve kare hücreleri varsayarak), hangi hücrelerin (i, j) hücresini başlangıç ​​noktasındaki (0,0) görünümden engelleyebileceğini düşünelim. Koordinatları i ve j'den en fazla 1 farklı olan tüm hücreler arasında (i, j) 'den (0,0)' a bağlanan çizgi segmentine en yakın hücreyi (i ', j') belirlerim. Çünkü bu her zaman değil benzersiz bir çözüm üretir (örneğin, (i, j) = (1,2) hem (0,1) hem de (1,1) eşit derecede iyi çalışır), bağları çözmek için bazı araçlar gereklidir. Bağların bu çözümünün ızgaralardaki dairesel mahallelerin simetrilerine saygı duyması iyi olurdu: koordinatı reddetmek veya koordinatları değiştirmek bu mahalleleri korur. Bu nedenle hangi hücrelerin bloke olduğuna karar verebiliriz (i,

Bu kuralı açıklayan şu prototip kodudur R. Bu kod, bir ızgaradaki rasgele hücrelerin "çevrelenmesini" belirlemek için uygun olacak bir veri yapısı döndürür.

screen <- function(k=1) {
  #
  # Returns a data structure:
  #   $offset is an array of offsets
  #   $screened is a parallel array of screened offset indexes.
  #   $distance is a parallel array of distances.
  # The first index always corresponds to (0,0).
  #
  screened.by <- function(xy) {
    uv <- abs(xy)
    if (reversed <- uv[2] > uv[1]) {
      uv <- rev(uv)
    }
    i <- which.min(c(uv[1], abs(uv[1]-uv[2]), uv[2]))
    ij <- uv + c(floor((1-i)/3), floor(i/3)-1)
    if (reversed) ij <- rev(ij)
    return(ij * sign(xy))
  }
  #
  # For each lattice point within the circular neighborhood,
  # find the unique lattice point that screens it from the origin.
  #
  xy <- subset(expand.grid(x=(-k:k), y=(-k:k)), 
               subset=(x^2+y^2 <= k^2) & (x != 0 | y != 0))
  g <- t(apply(xy, 1, function(z) c(screened.by(z), z)))
  #
  # Sort by distance from the origin.
  #
  colnames(g) <- c("x", "y", "x.to", "y.to")
  ij <- unique(rbind(g[, 1:2], g[, 3:4]))
  i <- order(abs(ij[,1]), abs(ij[,2])); ij <- ij[i, , drop=FALSE]
  rownames(ij) <- 1:length(i)
  #
  # Invert the "screened by" relation to produce the "screened" relation.
  #
  # (Row, column) offsets.
  ij.df <- data.frame(ij, i=1:length(i))
  #
  # Distances from the origin (in cells).
  distance <- apply(ij, 1, function(u) sqrt(sum(u*u)))
  #
  # "Screens" relation (represented by indexes into ij).
  g <- merge(merge(g, ij.df), ij.df, 
             by.x=c("x.to", "y.to"), by.y=c("x","y"))
  g <- subset(g, select=c(i.x, i.y))
  h <- by(g$i.y, g$i.x, identity)

  return( list(offset=ij, screened=h, distance=distance) )
}

Değeri, screen(12)bu tarama ilişkisinin bu tasvirini üretmek için kullanıldı: oklar hücrelerden onları hemen tarayanlara işaret ediyor. Tonlar, bu mahallenin ortasında bulunan menşe mesafesine göre orantılıdır:

Şekil 1

Bu hesaplama hızlıdır ve belirli bir mahalle için sadece bir kez yapılması gerekir. Örneğin, 5 m hücreli bir ızgarada 200 m'ye bakıldığında, mahalle büyüklüğü 200/5 = 40 birim olacaktır.

Adım 2: Hesaplamanın seçilen noktalara uygulanması

Gerisi basittir: (x, y) 'de (satır ve sütun koordinatlarında) bulunan bir hücrenin bu mahalle veri yapısına göre "çevrili" olup olmadığını belirlemek için, testi (i, j) = (0,0) (mahalle menşei). (X, y) + (i, j) 'deki çokgen ızgaradaki değer sıfır değilse, orada görünürlük engellenir. Aksi takdirde, ofset (i, j) 'de engellenmiş olabilecek tüm ofsetleri (döndürülen veri yapısı kullanılarak O (1) zamanında bulunur) dikkate almamız gerekir screen. Engellenen hiçbir şey yoksa, çevreye ulaştık ve (x, y) 'nin çevrelenmediği sonucuna vardık, bu nedenle hesaplamayı durduruyoruz (ve mahallede kalan noktaları denetlemeye zahmet etmiyoruz).

Algoritma sırasında ulaşılan en uzak görüş mesafesini takip ederek daha da faydalı bilgiler toplayabiliriz. Bu istenen yarıçaptan küçükse, hücre çevrilidir; aksi halde değildir.

İşte Rbu algoritmanın bir prototipi. Göründüğünden daha uzun, çünkü Rözyinelemeyi uygulamak için gerekli (basit) yığın yapısını yerel olarak desteklemiyor, bu nedenle bir yığının da kodlanması gerekiyor. Gerçek algoritma, yolun yaklaşık üçte ikisini başlatır ve sadece bir düzine çizgiye ihtiyaç duyar. (Ve bu yarısı sadece mahalle içinde dışarı aralık endekslerinin kontrol, ızgara kenarında durumu idare. Bu daha verimli hale getirilebilir basitçe tarafından poligon ızgara genişleterek konun çevresinde satır ve sütun herhangi ortadan kaldırarak çokgen ızgarasını tutmak için biraz daha fazla RAM pahasına dizin aralığı kontrolüne ihtiyaç var.)

#
# Test a grid point `ij` for a line-of-sight connection to the perimeter
# of a circular neighborhood.  
#   `xy` is the grid.
#   `counting` determines whether to return max distance or count of stack ops.
#   `perimeter` is the assumed values beyond the extent of `xy`.
#
# Grid values of zero admit light; all others block visibility
# Returns maximum line-of-sight distance found within `nbr`.
#
panvisibility <- function(ij, xy, nbr=screen(), counting=FALSE, perimeter=1) {
  #
  # Implement a stack for the algorithm.
  #
  count <- 0 # Stack count
  stack <- list(ptr=0, s=rep(NA, dim(nbr$offset)[1]))
  push <- function(x) {
    n <- length(x)
    count <<- count+n         # For timing
    stack$s[1:n + stack$ptr] <<- x
    stack$ptr <<- stack$ptr+n
  }
  pop <- function() {
    count <<- count+1         # For timing
    if (stack$ptr <= 0) return(NULL)
    y <- stack$s[stack$ptr]
    #stack$s[stack$ptr] <<- NA # For debugging
    stack$ptr <<- stack$ptr - 1
    return(y)
  }
  #
  # Initialization.
  #
  m <- dim(xy)[1]; n <- dim(xy)[2]
  push(1) # Stack the *indexes* of nbr$offset and nbr$screened.
  dist.max <- -1
  #
  # The algorithm.
  #
  while (!is.null(i <- pop())) {
    cell <- nbr$offset[i, ] + ij
    if (cell[1] <= 0 || cell[1] > m || cell[2] <= 0 || cell[2] > n) {
      value <- perimeter
    } else {  
      value <- xy[cell[1], cell[2]]
    }
    if (value==0) {
      if (nbr$distance[i] > dist.max) dist.max <- nbr$distance[i]
      s <- nbr$screened[[paste(i)]]
      if (is.null(s)) {
        #exited = TRUE
        break
      }
      push(s)
    }
  }
  if (counting) return ( count )
  return(dist.max)
}

Şekil 2: Örnek

Bu örnekte, çokgen hücreler siyahtır. Renkler, çokgen olmayan hücreler için kısa mesafeler için açık turuncudan en uzun mesafeler için koyu maviye kadar maksimum görüş hattı mesafesini (50 hücreye kadar) verir. (Hücreler bir birim genişliğinde ve yüksektir.) Görünür şekilde belirgin çizgiler "nehrin" ortasındaki küçük çokgen "adalar" tarafından oluşturulur: her biri diğer hücrelerin uzun bir çizgisini engeller.

Algoritmanın analizi

Yığın yapısı uygulayan, bir hücre olduğunu kanıtlar mahalle görüş grafiğinin bir derinlik ilk arama değil çevrili. Hücrelerin herhangi bir çokgenden uzak olduğu durumlarda, bu arama için yarıçap-k dairesel bir mahalle için sadece O (k) hücrelerinin incelenmesi gerekir. En kötü durumlar mahallede az sayıda dağınık poligon hücresi olduğunda, ancak mahallenin sınırına tam olarak ulaşılamaması durumunda ortaya çıkar: bunlar her mahalledeki neredeyse tüm hücrelerin incelenmesini gerektirir, bu bir O (k ^ 2) operasyon.

Aşağıdaki davranış, karşılaşılacaklar için tipiktir. Küçük k değerleri için, çokgenler ızgaranın çoğunu doldurmadıkça, çokgen olmayan hücrelerin çoğu açık bir şekilde tamamlanamaz ve algoritma O (k) gibi ölçeklenir. Ara değerler için ölçeklendirme O (k ^ 2) gibi görünmeye başlar. K gerçekten büyüdükçe, çoğu hücre çevrelenecek ve bu gerçek tüm mahalle incelenmeden çok önce belirlenebilir: algoritmanın hesaplama çabası pratik bir sınıra ulaşır. Bu sınır, mahalle yarıçapı ızgaradaki en büyük bağlı poligonal olmayan bölgelerin çapına yaklaştığında elde edilir.

Örnek olarak, her çağrıda kullanılan yığın işlemlerinin sayısını döndürmek için countingprototipine kodlanmış seçeneği kullanıyorum screen. Bu hesaplama çabasını ölçer. Aşağıdaki grafik, mahalle yarıçapının bir fonksiyonu olarak ortalama yığın ops sayısını göstermektedir. Tahmin edilen davranışı gösterir.

Figür 3

Bunu, bir tablodaki 13 milyon noktayı değerlendirmek için gereken hesaplamayı tahmin etmek için kullanabiliriz. Varsayalım ki k = 200/5 = 40 mahallesi kullanılıyor. Daha sonra ortalama olarak birkaç yüz yığın operasyonuna ihtiyaç duyulacaktır (çokgen ızgarasının karmaşıklığına ve çokgenlere göre 13 milyon noktanın bulunduğu yere), verimli bir derlenmiş dilde en fazla birkaç bin basit sayısal işlem anlamına gelir. (ekleme, çarpma, okuma, yazma, ofset vb.) gerekir. Çoğu bilgisayar bu oranda yaklaşık bir milyon noktanın çevresini değerlendirebilecektir. (Ruygulama çok daha yavaştır, çünkü bu tür bir algoritmada zayıftır, bu yüzden sadece bir prototip olarak kabul edilebilir.) Buna göre, makul derecede verimli ve uygun bir dilde etkili bir uygulamanın - C ++ ve Python akla geliyor - tüm poligon ızgarasının RAM'de bulunduğu varsayılarak , bir dakika veya daha kısa sürede 13 milyon noktanın değerlendirmesini tamamlayabilir .

Bir ızgara RAM'e sığmayacak kadar büyük olduğunda, bu prosedür ızgaranın döşenmiş kısımlarına uygulanabilir. Yalnızca ksatır ve sütunlarla çakışmalıdırlar ; sonuçları mozaiği yaparken üst üste gelenleri alın.

Diğer uygulamalar

Bir su kütlesinin "getirilmesi", noktalarının "çevrelenmesi" ile yakından ilişkilidir. Aslında, su kütlesinin çapına eşit veya daha büyük bir mahalle yarıçapı kullanırsak, su kütlesinin her noktasında (yönsüz) getirme ızgarası oluşturacağız. Daha küçük bir mahalle yarıçapı kullanarak, en azından getirilen tüm noktalarda getirme için en azından daha düşük bir sınır elde edeceğiz, bu da bazı uygulamalarda yeterince iyi olabilir (ve hesaplama çabalarını önemli ölçüde azaltabilir). Bu algoritmanın belirli yönlerle "taraması yapılan" ilişkiyi sınırlayan bir varyantı, bu yönlerde getirmeyi verimli bir şekilde hesaplamanın bir yolu olacaktır. Bu tür değişkenlerin kodunun değiştirilmesini gerektirdiğini unutmayın screen; kodu panvisibilityhiç değişmez.


2

Bir raster çözümü ile bunu nasıl yapmak isteyebileceğini kesinlikle görebiliyorum, ancak azaltılmış nokta sayısı bile göz önüne alındığında, çok büyük / yüksek çözünürlüklü ve bu nedenle ızgara veya ızgara kümesini işlemek zor olurdu. Bu göz önüne alındığında, bir gdb'de topolojiden yararlanmak daha verimli olabilir mi acaba? Tüm iç boşlukları aşağıdaki gibi bir şeyle bulabilirsiniz:

arcpy.env.workspace = 'myGDB'
arcpy.CreateTopology_management('myGDB', 'myTopology', '')    
arcpy.AddFeatureClassToTopology_management('myTopology', 'myFeatures', '1','1')    
arcpy.AddRuleToTopology_management ('myToplogy', 'Must Not Have Gaps (Area)', 'myFeatures', '', '', '')    
arcpy.ValidateTopology_management('myTopology', 'Full_Extent')
arcpy.ExportTopologyErrors_management('myTopology', 'myGDB', 'topoErrors')
arcpy.FeatureToPolygon_management('topoErrors_line','topoErrorsVoidPolys', '0.1')`

daha sonra topoErrorsVoidPolysnormal Intersect_analysis()ya da başka bir şekilde çalışabilirsiniz . İlgilendiğiniz polisleri çıkararak uğraşmanız gerekebilir topoErrorsVoidPolys. @whuber, gis.stackexchange.com adresindeki başka yerlerde bu tür şeyler hakkında oldukça mükemmel yayınlara sahiptir.


Bu ilginç bir ön işleme fikri. Bence 200m sınırını (tamponlama ve kavşak vb.) İçerecek şekilde kolayca uyarlanabilir. CBS'de, bir soruna çözümün tamamen raster tabanlı veya tamamen vektör tabanlı olması gerektiğini söyleyen bir kural yoktur (her ne kadar bir gösterimden diğerine ortada dönüştürmek için oldukça iyi bir nedeniniz olması gerektiğini söyleyen bir ilke olmasına rağmen) Burada, önerdiğiniz gibi, tam olarak bunu yapmanın önemli bir yararı olabilir).
whuber

0

Eğer gerçekten raster gitmek istiyorsanız ... Ben bu sahte kod satırları boyunca bir şeyler yapmak istiyorum (sadece, çünkü ben bir AML gerileme açıktır!)

  1. noktaları ("pts_g") ve polisleri ("polys_g" (
  2. voids = bölge grubu (con (isnull (polys_g), 1))
  3. istenmeyen çokgen / açık evren alanını ortadan kaldırmak için boşlukları hassaslaştırmak için bir şeyler yapması gerekebilir
  4. pts_surrounded = con (boşluklar, pts_g)

Sadece bunu telafi etmek için, daha da arındırmak gerekebilir.


Çözümünüz sınırlayıcı mesafeye (örneğin, 200m) gönderme yapmaz, bu nedenle soruya doğru yanıt vermiyor gibi görünüyor.
whuber

haklısın. Bu benim diğer cevabım için de geçerli. Biri kullanabilirsiniz Expand(), ama o noktada @radouxju cevap işlevsel olarak eşdeğer ve muhtemelen daha hızlı olacağını düşünüyorum. (görüş alanına karşı hiçbir şey, sadece fazla kullanmayın).
Roland

zaman dolduğunda düzenlemeye çalışıyordu. Expand()Bunu yapmak için genişletmek istiyorum pts_gve sadece Con()ile kesişmek için kullanın polys_g.
Roland

0

Bir eşik mesafe değeri kullanırsanız (burada yaklaşık 200 m konuşursunuz), en iyi çözüm vektör analizini kullanmaktır:

1) her noktanın etrafında 200 m'lik bir tampon oluşturun (resimde siyah)

2) tampon ve çokgenler arasındaki kesişim aracını (analiz) kullanın (resimde mavi olarak gösterilmiştir). Bunu çevreleyen çokgenlerin ve tamponun sınırları arasında yaparsanız daha güzel görünecektir, ancak nihai sonuç aynıdır.

3) noktalarınızın tamamen çevrili olduğu çokgenler oluşturmak için çokgen (yönetim) özelliğini kullanın (resimde kırmızı renkte)

4) çevrili noktaları belirlemek için katmanları konuma (yönetim) veya uzamsal birleşime (analiz) göre seçin. Uzamsal birleştirme kullanımı, daha fazla işlem için yararlı olabilecek gömme çokgen (çokgenin alanı, bölgesel istatistikler ...) hakkında bilgi sahibi olmanızı sağlar.

Alternatifler 2b) İhtiyaçlarınıza bağlı olarak, çevredeki çokgenleri 200 metrelik bir mesafe içinde konumlarına göre seçebilirsiniz, daha sonra bazı tür "muhafaza" tanımlayabilirsiniz, ancak 2'de olduğu gibi değil).

resim açıklamasını buraya girin

"Labirent durumda" göz önüne alındığında, bu yardımcı olabilir: yerden "kaçmak" ne kadar zaman değerlendirmek.

  • Tamamen dahil olan veya tamamen ücretsiz olan noktaları analizden hariç tutabilirsiniz

  • daha sonra engellerinizi bir raster haline dönüştürür ve değerleri bir poligonun bulunduğu NoData'ya ve kullanmadığınız metre cinsinden hücre boyutuna ayarlarsınız (bu, maliyet rasterinizi oluşturur).

  • üçüncü olarak, yeni oluşturulan maliyet rasterini kullanarak maliyet mesafesini hesaplayabilirsiniz

  • son olarak, raster dönüştürülen arabellek sınırlarına (bir halka oluşturur) dayalı olarak bir bölgesel istatistik kullanırsınız. Her yöne kaçabiliyorsanız, minimum yaklaşık 200 olmalıdır (analizinizin hücre boyutuna bağlı olarak). Ancak bir labirentte iseniz, maksimum 200'den büyük olacaktır. Böylece, bölgesel istatistiklerin eksi 200'ü maksimum "kaçmanın" ne kadar zor olduğunu belirten sürekli bir değer olacaktır.


Lütfen "surrounded" tanımınızı açıklayın. Sorudaki açıklama, çokgenin bir kısmı o noktanın etrafındaki tüm yönlerde (200 m mesafeye kadar) göründüğünde bir noktanın "çevrili" olarak düşünülmesi gerektiğini göstermektedir . (3.) adımında bunu nasıl test edersiniz? (Bir vektör analizi kullanmak kolay değil!)
Whuber

Küçük bir örnek ekledim, böyle açıklamak daha kolay. Arabellek tüm yönlerde bir çokgeni kesmezse, döngü kapatılmaz. Ve döngü yakın değilse, bu çokgen yapmaz.
radouxju

"Döngü" veya "kapalı" ile ne demek istediğinizden emin değilim. Etrafında bir nokta yarıçapı r (200 m'den az) dairesi tamamen çokgen içinde olmasa bile "çevrilebilir". Bir labirent düşünün: Çokgen, labirentteki koridorlar hariç her şeydir . Bir labirent içindeki herhangi bir noktadan kaçabilir, ama çoğu nokta labirentin dış onlardan görünmez olması anlamında "çevrili" olacaktır.
whuber

Anladığım kadarıyla, çevrili kaçamayacağınız bir yer anlamına gelir. Halatta, B'den kaçabilir, ancak A'dan kaçamazsınız. Öte yandan, görüş alanını kullanırsanız B çevrili görünüyor (görüntüde ölçek çubuğu olmadığı için belki 200 m'de değil, ama tüm yönlere bakarken çokgen sınırlarına bakın). Sanırım @Loz
radouxju'dan

"Kaçamayan" kontrol edilecek kriter olsaydı bu hiç de zor bir soru olmazdı: sadece bölge grubunu çokgenin tamamlayıcısı, sadece benzersiz harici bileşeni tut ve içine dahil olup olmadığını kontrol et. Sorunun yakından okunması - özellikle de olası tüm rulmanlara bakma referansları - oldukça belirsiz bir şekilde ifade edildiğini kabul etsem de, “çevrelenmiş” in amaçlandığı duyguyu açıklığa kavuşturuyor.
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.