Hangi üçgen noktalarının bulunduğunu bulma


16

ve üçgenlerden oluşan bir 2B ve . Her bir noktanın hangi üçgenin içinde olduğunu belirlemenin en iyi yolu nedir?{Tk}k=1N{pi}i=1Mk=1NTK

Örneğin, aşağıdaki görüntüde Elimizdeki , , bir işlevi gibi bu yüzden, listesi bu getiriler .p1T2p2T4p3T2ff(p1,p2,p3)=[2,4,2]

resim açıklamasını buraya girin

Matlab, Delaunay kafesleri için istediğimi yapan fonksiyon noktalarına sahiptir, ancak genel kafesler için başarısız olur.

İlk (aptal) düşüncem, tüm düğümleri için , hangi üçgen p i'nin içinde olduğunu bulmak için tüm üçgenler arasında . Ancak, bu son derece verimsizdir - her nokta için her üçgeni döngüye gerekebilir, bu yüzden sürebilir O ( N M ) çalışması.pbenpbenÖ(N-M)

Tüm noktalar için Benim sonraki düşünce vardır , o en yakın düğüme bağlı üçgenler bakmak, en yakın örgü düğümü aracılığıyla en yakın komşu arama bulabilirsiniz. Bu durumda, iş O ( a M l o g ( N ) ) olacaktır ; burada a , ağdaki herhangi bir düğüme bağlı maksimum üçgen sayısıdır. Bu yaklaşımla ilgili birkaç çözülebilir ancak can sıkıcı sorun var,pbenÖ(birMlÖg(N-))bir

  • Bu, önemsiz olmayan bir görev olabilecek en yakın komşu etkili bir aramanın (veya buna sahip bir kütüphanenin bulunmasının) yapılmasını gerektirir.
  • Her düğüme hangi üçgenlerin bağlı olduğunu, kodumun şu anda ayarlanmadığı bir listenin saklanmasını gerektirir - şu anda sadece düğüm koordinatlarının bir listesi ve bir öğe listesi var.

Tamamen yetersiz görünüyor ve bence daha iyi bir yol olmalı. Bu çok ortaya çıkan bir sorun olmalı, bu yüzden teorik olarak veya mevcut kütüphaneler açısından düğümlerin hangi üçgenlerde bulunduğunu bulmanın en iyi yolunu önerebileceğini merak ediyordum.

Teşekkürler!

Yanıtlar:


16

Olağan rasgele kenar atlatma yöntemi çalışmalıdır. Temel olarak, ağın herhangi bir üçgeni ile başlayın, ardından hedef noktanın hangi kenarlarından hangisinin karşı tarafında olduğunu belirleyin. Yani, bir çizgiye uzatıldığında, kenarların hangisinin üçgenin iç kısmından ayrıldığını belirleyin. İki olasılık olduğunda, rastgele birini seçin ve bu paylaşılan kenara bitişik üçgeni düşünün ve tekrarlayın. Rasgeleleştirme, bu yöntemi Delaunay üçgenlemeleri için olasılık 1 ile yakınlaştırmalıdır ve keyfi üçgenleme için işe yaramayacak bir neden düşünemiyorum.

Düzenleme : Bu kenar atlamalı tek bir nokta için makul bir sabit ile olması gerektiğini eklemeliyim , bu yüzden M noktaları için O ( M log N ) olurdu . Ancak, puanlarınızı yere göre sıralarsanız (önce bir Hilbert eğrisi sırası gibi), çalışma zamanını daha da azaltmak için her yeni sorguyu bir önceki sorgunun üçgeni ile başlatabilirsiniz (CS teorisyeni değilim, böylece ' size büyük O'nun orada olacağını söylemiyorum).Ö(günlükN-)Ö(MgünlükN-)M

Edit2 : Sonlandırılması garanti edilen ve daha saf yaklaşımları inceleyen böyle bir "yürüyüş" şemasını açıklayan bu PDF'yi buldu .

Quadtrees kullanmanın bir diğer alternatifi bir Nirengi Hiyerarşisi kullanmaktır. Bakınız Olivier Devillers. Geliştirilmiş artımlı randomize Delaunay nirengi. Proc. 14. Annu. ACM Sempozyumları. Comput. Geom., Sayfa 106-115, 1998. Delaunay üçgenlemeleri için en iyi sonucu verir, ancak Delaunay olmayanlar için de kullanılabilir.

Temel olarak nokta konumunu hızlandırmak için ne yaparsanız yapın, bir yardımcı veri yapısının inşasını gerektirir. Dörtlü veya başka bir uzamsal altbölüm durumunda, altbölüm ağacını oluşturmanız gerekir. Kenar atlaması durumunda, üçgen bitişik topolojik yapıyı oluşturmanız gerekir. Nirengi hiyerarşisi ayrıca daha kaba üçgenleme ağacı oluşturmayı gerektirir.


Victor - kenar atlamalı yaklaşımı benimseyen açık kaynaklı bir kod biliyor musunuz? Benim durumum için coudl çok iyi bir çözüm olabilir gibi görünüyor. (traingualr ağ ızgarasındaki mevcut alanların yönlendirdiği parçacık izleme modeli) -Teşekkürler
Chris Barker

Bunun için kod var ve size gönderebilirim; C / C ++ 'dadır. Temizlemek ve henüz Github'da yayınlamak için zamanım olmadı. Bunu hayatımda en az iki kez yazmak zorunda kaldım. İletişim bilgilerini bulabileceğiniz web sitem için profil sayfama bakın. Bunu daha fazla çevrimdışı tartışabiliriz.
Victor Liu

Hilbert eğri sırası ve rastgele üçgen yürüyüşü kullanarak bunu matlab'da uygulamayı bitirdim. Bu araştırma kodu: optimize değil, belgelenmemiş, vb, ama yine de oldukça hızlı - Eğer ilgileniyorsanız size kod verebilirim.
Nick Alger

2
Hakkında: "" "kenar atlamalı olmalıdır O (logN)" "" Görmüyorum. Örneğin, büyük bir uzun üçgen şeridin patolojik durumunda (sadece üçgen genişliğinde dar bir kanal gibi), en kötü durumda, bir üçgenden diğerine sonuna kadar atlamanız gerekir. Ortalama durumda, yarı yolda. Üçgen sayısını ikiye katlarsanız, O (N) olur. Daha normal bir üçgen şeklindeki üçgen düzenlemesinde, O (sqrt (N)) beklerdim. Yoksa bir şey mi kaçırıyorum? -Chris
Chris Barker

@Chris - scicomp'a hoş geldiniz! Scicomp'ın temizlik işlerinin bir parçası olarak, cevaplarınızı ve sonraki konuşmayı Victor'un cevabı hakkında yorum olarak taşıdım. Siteye katılımınızı dört gözle bekliyoruz.
Aron Ahmadia

8

Çözümünüzün gerçekten doğru olduğuna ikna olmadım. Bu düğümlere sahip olduğunuz durumu düşünün:

  • A: (-3, 1)
  • B: (0, 2)
  • C: (3, 1)
  • D: (0, -5)

ABC ve ACD üçgenleri var. Şimdi B başlangıç ​​noktasına en yakın noktadır, ancak başlangıç ​​noktası B içermeyen ACD üçgenindedir.

Ö(N-M)

Üçgenleri içeren bir dörtlü inşa etme seçeneğini düşünürdüm . Yani, her bir düğümde (sınırlayıcı bir kutuya karşılık gelen) depolayan bir kuaterner ağacınız var:

  • Kutunun bölündüğü koordinatlar veya alternatif olarak dört alt ağacın sınırlayıcı kutuları;
  • Alt ağaçlara işaretçiler;
  • Tamamen bu dikdörtgenin sınırlayıcı kutusuna giren, ancak dört alt ağacın hiçbirine girmeyen üçgenler kümesi. Başka bir deyişle, dörtgenin alt bölümlere ayırmış iki çizgi parçasından biriyle kesişen üçgenler.

Bir P noktası verildiğinde, dörtlü ağacın kökünden P içeren en küçük kutuya giden yoldaki tüm düğümleri çaprazlayın. Bu düğümlerde karşılaştığınız tüm üçgenleri incelemeniz gerekir. 'İyi kalpli' bir üçgenleme için sadece gibi bir şey olmalıdır.nngünlüknÖ(N-M)


Hmm haklısın. Diğer yandan, üçgenleme Delaunay olsaydı, en yakın komşunun işe yarayacağını düşünüyorum. Yapmaya çalıştığım şey için çok kısıtlayıcı, ancak Delaunay durumunda çift Voronoi diyagramını düşünün - Voronoi hücreleri bir düğüme en yakın nokta kümesidir ve delaunay üçgenlerinin kenarları Voronoi'nin kenarlarını karşılar hücreleri dik açılarda, bu yüzden herhangi bir nokta en yakın düğümüne bağlı bir üçgen içinde olmalıdır. Acaba bu matlab'ın pointLocation işlevi kaputun altında çalışır mı?
Nick Alger

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.