Çokgen kafeslerde bir üçgen iç testi nasıl yapabilirim?


10

resim açıklamasını buraya girin(V1, V2, V3)Düzenli bir üçgen ağda rastgele seçilen 3 köşem var . Bu 3 köşe için, aralarındaki jeodezik mesafeyi ve yolu (Dijkstra kullanarak) hesapladım ve yukarıdaki şekilde olduğu gibi üçgen benzeri bir yüzey oluşturdum.

Şimdi, her bir yolda uzanan ve belirli bir tepe noktasından jeodezik mesafeleri hesaplayabilen köşelere sahibim.

Yapmak istediğim şey üçgen benzeri bir alanda bulunan köşeleri veya üçgenleri elde etmek. Bunu nasıl yapabilirim?


2
Barycentric yaklaşımın yaptığımı düşündüğünü yaptığını varsayarsak, büyük setlerle oldukça yavaş olur. İstenen sette sadece 9 köşeli 9 milyon köşe kümesi düşünün. V1, v2 ve v3 size ihtiyacınız olan tüm bilgileri verdiğinde neden tüm seti yineleyin. Taşkın dolgu cevabı en hızlı esnek çözüm olacaktır. Esnek olmasa da, şimdi geometride yaptığınız gibi çizgilere sahip olduğunuzu varsayabilirseniz, tarama çizgisi en hızlı yaklaşım olacaktır.
Andrew Wilson

Performans konusunda kesinlikle haklısınız. Bu yaklaşımı büyük kafeslerde kullanmak istiyorum, bu yüzden aradığım verimli bir yöntem. Aslında ne taşkın dolgu ne de tarama dolgusu algoritmalarına aşina değilim, onlara bir göz atacağım. Teşekkürler.
mkocabas

3
Bir grafiğe sahip bir sel dolgusu bir düğümde başlar, sınır koşulu karşılanır ve ziyaret edilmezse her komşu düğümü ziyaret eder, ziyaret edildi olarak işaretler ve tekrarlar (özyineleme). Değişiklik: Yoldaki her düğümü ziyaret edilmiş olarak işaretleyin ve kümenin içindeki bir düğümden başlayın. Ardından ziyaret koşul kontrolünü sınır koşulu olarak kullanın.
Andrew Wilson

Detaylı açıklama için teşekkürler. Sel doldurma algo'yu daha makul buluyorum, ancak hem sel doldurma hem de tarama çizgisini uygulamak, sonra performansları karşılaştırmak istiyorum.
mkocabas

Yanıtlar:


4

Taşkın dolgusuna dayanan alternatif bir yöntem vardır. Önce kenar verilerinizi, kenarların saat yönünün tersine bir halka oluşturduğu bir döngüye yerleştirin. Sonra döngü üzerinde rastgele bir noktada başlayın ve o noktaya katılan kenarları seçin. Giden sınır kenarını kullanın ve diğer giden kenarla çaprazlayın, eğer yüzün normal yönünü gösteriyorsa, atılmayacaksa dahil edilecek bir kenardır. Bu kenardan, dolguyu sonlandırdığınız bir sınır kenarına çarpana kadar devam edin. Henüz ziyaret edilmemiş bir sınır kenarı tepe noktasında devam edin.


Taşkın doldurma algoritmasına aşina değilim. Açıklamanız benim için biraz karmaşık görünüyor. Bakmak için iyi bir referans verebilir misiniz? Teşekkürler.
mkocabas

Biraz okuyarak çözüm buldum. Teşekkürler.
mkocabas

3

Taşkın dolgusunun kullanımı ve daha esnek olduğu için nasıl daha iyi olabileceği hakkında yorum yaptım, ancak başka bir olası çözüm tarama hattı. (Mümkün diyorum çünkü geometriniz hakkında birçok varsayım yapıyor ancak gösterilen belirli set ve benzerleri için işe yarayacak.)

3 noktalı örneğiniz için: v1, v2 segmentinden ve v3'ün bulunduğu çizgiden kesişim tepe noktasını bulun. (V2'nin sol üst kısmındaki köşe noktası) Bu tepe noktasına v4 adını vereceğiz.

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

resim açıklamasını buraya girin

Tarama çizgisi olarak adlandırılır, çünkü (yukarıdaki resimde) kırmızı ve yeşil çizgileri aynı anda aşağı inersiniz ve ardından kırmızı ve mavi çizgiler aynı anda çizgileri tararken tararsınız.

Bu çözüm genellikle bir indeks paterni varsa çok hızlı olacaktır. Aksi takdirde, hangi komşu tepe noktasının hat üzerinde olduğunu belirlemek için bir hesaplama gerekli olacaktır.

Komik olan şey tarama çizgisi, barycentric test (üçgen sınırlayıcı kutuda) ve taşkın dolgu, 3d renderde üçgen çizmenin tüm yollarıdır.


2

Sanırım yüzeydeki her nokta için yüzeye bağlı barycentric koordinatları hesaplayabilir ve daha sonra bunları üçgenin içinde veya dışında kontrol etmek için kullanabilirsiniz.

Elimde tam bir algoritma yok ama tam olarak bu tür koordinatları işleyen aşağıdaki makaleyi buldum.

Yüzeylerdeki Barycentric Koordinatlar


Cevap ve referans kağıdı için teşekkürler. Önerilen yöntemi uygulamaya çalışacağım.
mkocabas
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.