Verilen nokta koordinatları kümesinden sınır koordinatları mı buluyorsunuz?


18

Bir dizi koordinat verildiğinde, sınır koordinatlarını nasıl buluruz.
koordinat kümesi <== Şekil 1
Yukarıdaki setteki koordinatlar göz önüne alındığında, kırmızı sınırdaki koordinatları nasıl alabilirim. Sınır, alanı en üst düzeye çıkaracak şekilde, köşeler için giriş koordinatları tarafından oluşturulan çokgendir.

Bir şehrin 'x' mil içindeki mülkleri arayan bir uygulama üzerinde çalışıyorum . Ne var:

  1. Tüm özelliklerin koordinatları.
  2. Her şehir için bir dizi koordinat (Her bir zip için bir koordinatım var. Çoğu şehirde birden fazla zip bulunduğundan, her şehrin bir dizi koordinatı vardır)

Maksimum alan için sormamın nedeni , aşağıdaki gibi bir çokgen bulmamalarıdır:

çarpık çokgen <== Şekil 2

İhtiyacım olan şey , sınır için koordinatlar kümesini bulmak için algoritma . Şekil 1 için sınır koordinatları bulmamı sağlayacak bir algoritma .



4
Hayır, kopya değil, bu dışbükey gövde, içbükey değil
Nicklas Avén

1
Mevcut belirli yazılım ortamlarında kod, teorik referanslar veya çözümler mi arıyorsunuz?
WolfOdrade

1
@Khaja Hayır, alanı en üst düzeye çıkarmak istemiyorsunuz , noktaları içeren tüm dışbükey çokgenler arasında en aza indirmek istiyorsunuz . (Alanı en üst düzeye çıkarmanın tek yolu, tüm dünyayı çokgen içeren olarak kullanmaktır.)
Whuber

1
@whuber Evet, şimdi ne demek istediğini anlıyorum, minimal alana sahip dışbükey bir çokgen istiyorum. Nihai hedefim, yakınlık araması yapmak. İşten bizim yakınlık arama istediğiniz yoludur: Belirli bir şehirde (dışbükey), biz "x", mil mesafedeki (her ev bir koordinat etti) ev aramalarına olursa, bu bana bütün vermelidir evleri ya vardır içeride dışbükey gövde veya "x"
mil'den

Yanıtlar:


21

Bu sorunu çözmek için birçok algoritma vardır ( Wikipedia "Convex_hull_algorithms" ):

  • Hediye paketi aka Jarvis march - O (nh): En basit algoritmalardan biri. O (nh) zaman karmaşıklığına sahiptir, burada n, kümedeki nokta sayısıdır ve h, gövdedeki nokta sayısıdır. En kötü durumda karmaşıklık O (n2) 'dir.
  • Graham taraması - O (n log n): Biraz daha karmaşık ancak çok daha verimli bir algoritma. Noktalar zaten koordinatlardan birine veya sabit bir vektörün açısına göre sıralandıysa, algoritma O (n) zamanını alır. [ sözde kod ]
  • QuickHull: Quicksort algoritması gibi, O (n log n) 'in beklenen zaman karmaşıklığına sahiptir, ancak en kötü durumda O (nh) = O (n2)' ye dejenere olabilir. [ resimli açıklama ]
  • Böl ve fethet - O (n log n): Bu algoritma ayrıca üç boyutlu durum için de geçerlidir.
  • Monoton zincir - O (n log n): Noktaları sözlükbilimsel olarak koordinatlarına göre sıralayan Graham taramasının bir varyantı. Giriş zaten sıralandığında, algoritma O (n) zaman alır.
  • Artımlı dışbükey gövde algoritması - O (n log n)
  • Fetih öncesi evlilik - O (n günlüğü h): Optimal çıktıya duyarlı algoritma.
  • Chan'ın algoritması - O (n log h): Daha basit, çıkışa duyarlı algoritma.

Bu @ underdark'ı listelediğiniz için teşekkür ederiz ... hangisi sizin seçiminiz?
Marin



3

İstediğiniz şey Dışbükey gövde. PostGIS'te size Convex gövdesi ST_ConvexHull (geometri) veren bir işlev (aslında GEOS) vardır .

Vikipedi'de içbükey gövdeler hakkında birçok bilgi var.


1

Bunu yapmak için bir algoritma (bunu yapabilen paketler yerine) istiyorsanız, o zaman veri üçgenlemek gerektiğini düşünüyorum; veya temel olarak her noktadan diğer noktalara doğru bir çizgi tanımlayın. Daha sonra, en yüksek Y değerine sahip noktadan (diyelim ki) başlayarak, en küçük dış açı / yatak ile bağlı çizgiyi takip ederek dış çevresinde bir rota izleyin.

Önce kesişen çizgileri atarak izlemeyi hızlandırabilirsiniz. Dış sınırda kesişme olmayacaktır.

btw - FME bunu ConvexHullAccumulator veya ConvexHullReplacer transformatörleri ile de yapacak!


1

Kodda uygulanan mevcut bir algoritmaya bakmakla ilgileniyorsanız, NetTopologySuite'in bunu yapmak için bir algoritması vardır

ConvexHull.cs dosyasına bakın

Bu arada NTS ve bir dizi diğer kütüphane, burada bulunan DotSpatial adlı harika bir projeye sarıldı

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.