İki Bezier eğrisinin kesişimi için güvenilir test


9

İki düzlemsel Bezier eğrisinin kesişip kesişmediğini nasıl güvenilir bir şekilde öğrenebilirim? "Güvenilir bir şekilde" kastediyorum, test sadece eğriler kesiştiğinde "evet", sadece kesişmediğinde "hayır" cevabını verecektir. Kavşağın hangi parametrelerde bulunduğunu bilmeme gerek yok. Uygulamada kayan noktalı sayıları da kullanmak istiyorum.

Test için eğrilerin sınırlayıcı kutularını kullanan StackOverflow'da birkaç cevap buldum: bu kadar sonra değilim, çünkü bu tür testler eğriler kesişmese bile kesişim rapor edebilir.

Şimdiye kadar bulduğum en yakın şey Sederberg ve Meyers tarafından " sınırlayıcı kama " ama "sadece" en fazla bir ve iki veya daha fazla kavşak arasında ayrım yaparken, en fazla sıfırın olup olmadığını bilmek istiyorum ve bir veya daha fazla kavşak.


Bunun gibi var olduğundan emin değilim, wetehr'in belirlenmesi veya 0-1 veya 2 veya daha fazlası için bir olasılık oldukça önemsizdir, ancak formülasyon gerçekten kontrol etmeden 0 veya 1 olduğundan emin olmak için kolay değildir.
joojaa

Çalışma zamanı gereksinimleri nedir? Oldukça doğru sonuçlar üretmesi gereken bir çözüm, her iki eğriyi çok sayıda kısa düz segmentle yaklaşık olarak tahmin etmek ve daha sonra bunları ikili bir şekilde kesmektir. Ama bu çok zaman ve hafıza gerektiriyor.
Dragonseel

@Dragonseel Gerçekten, herhangi bir çözüm için mutlu olurdum, ama O (1) 'in iyi olacağını sorduğunuzdan beri. Ancak eğrileri çizgi parçalarıyla yaklaşıklaştırmak, sınırlayıcı kutu çakışması testi ile aynı sorunlara yol açar ...
Ecir Hana

İlginç bir sorun. Kolay bir cevap olduğunu düşünmüyorum ama yanılmak istiyorum. Sederberg ve Meyers gazetesi için bir bağlantınız var mı?
Daniel M Gessel

@DanielMGessel Evet, yukarıdaki düzenlemeye bakın.
Ecir Hana

Yanıtlar:


6

Sorunu formüle etmenin alternatif bir yolu, eğrilerin parametrelerinin bir fonksiyonu olarak, iki eğrideki noktalar arasındaki mesafeyi veren bir işlevi tanımlamaktır. Sonra bu fonksiyonun küresel minimumunu bulmaya çalışın. Eğriler kesişirse, minimum sıfır olacaktır; aksi takdirde minimum pozitif bir mesafe olacaktır.

Açık olmak tarafından tanımlanan bir çift 2D eğri , mesafe karesi olarak tanımlayınc1,c2:[0,1]R2

f(u,v):[0,1]2R0|c2(v)c1(u)|2

Kübik eğriler için işlevi , iki değişkente altıncı dereceden bir polinomdur. Daha sonra simpleks yöntemi veya eşlenik gradyan inişi gibi sayısal optimizasyon tekniklerini uygulayabilirsiniz . Ne yazık ki işlev birkaç yerel minimaya sahip olabilir (dışbükey değil), bu nedenle optimizasyon kolay değildir. Polinomlar için daha uzmanlaşmış optimizasyon yöntemleri olabilir, ancak bu benim için bir uzmanlık alanı değil.f


Kübik Beziers hakkında konuşuyorsak neden 3. değil, 6. derece polinom? Ve bağlandığınız iki yöntem , tüm yerine sadece içinde çözüm bulmaya uygun mu? [0,1]2R2
Ecir Hana

1
@EcirHana 6. derece çünkü kare mesafesi. (Karekök yapabilirsiniz, ancak artık polinom değildir ve sıfırlarda pürüzsüz olmayacaktır.)[0,1]parametre alanıdır, spline'ların yaşadığı alan değildir, yani bunlar uç noktalı splinelardır. Her durumda, yöntemlerR2, ancak yalnızca ilk tahminden "yokuş aşağı seyahat ederler" ve yerel bir minimum bulurlar; tüm parametre bölgesini incelemek ve küresel minimum değeri bulmak için daha fazlasına ihtiyaç vardır . Parametre alanını kısıtlamak muhtemelen yardımcı olacaktır.
Nathan Reed

1
Nathan - güzel formülasyon! Paslıyım, ama: Her bir bezier eğrisini en fazla 5 segmente ayırabilirsiniz,x veya y eğri yönünü değiştir. x, bir fonksiyonu olarak ci eğriyi 3 bölüme ayırarak en fazla iki kez (türevin kökleri) yönü değiştirir, bunların 2'si tekrar yönündeki değişikliklerle bölünebilir y. Artık düz segmentler değil, "çok fazla eğri olmayan" segmentler var. Aramanıza segment çiftleri tarafından seçilen 25 noktada başlarsanız, her zaman küresel minimi bulabilirsiniz, ancak bunu nasıl kanıtlayacağınızı (veya çürüteceğinizi) göremiyorum.
Daniel M Gessel

@Nathan: Bunu düşündüm ama doku sıkıştırma formatlarında minima bulmak için kod yazmak için çok zaman harcadıktan sonra, hepsi biraz iğrenç görünüyordu.
Simon F

5

[Feragatname: Aşağıdakilerin çalışması gerektiğini düşünüyorum ama aslında kendim kodlamamış]

Evet / hayır yanıtı üretmek için "önemsiz" bir yöntem düşünemedim, ancak aşağıdaki soruya pratik bir çözüm için makul bir yaklaşım olacaktır.

Eğrilerimizin sırasıyla { A0, A1..An } ve { B0, .. Bm } kontrol noktalarına sahip A (s) ve B (t) olduğunu varsayalım .

Bana öyle geliyor ki, kesişmek ya da kesişmek istemediğimiz bir çift 2D Bezier göz önüne alındığında, dikkate alınması gereken altı vaka var:

  1. Biz "trivially" yaptıkları belirleyebilir Olgu değil kesiştiği.

  2. Sonlu sayıda kez kesiştikleri ve kesinlikle en az bir kez kesiştiklerini "kolayca" belirleyebileceğimiz durum (ama aslında bu kesişmelerin nerede gerçekleştiği umurumda değil)

  3. Beziers'lerden biri dejenere, yani bir nokta (tüm kontrol noktaları aynı ise ortaya çıkar). Her ikisinin de puan olduğu durumu zaten ele aldığımızı varsayabiliriz.

  4. Eğrilerin biri veya daha fazlası kapalı, örn. A0 == bir. Hayatı kolaylaştırmak için, bu tür eğrileri alt bölümlere ayıracağız ve tekrar başlayacağız.

  5. Her biri bir "ana" Bezier alt kümesi olduğundan ve üst üste geldiklerinden sonsuz sayıda kesişme noktası vardır.

  6. Yukarıdaki vakalardan emin değiliz ve daha fazla araştırmaya ihtiyacımız var

Şu an için 3 ve 4'ü görmezden geleceğiz, ancak daha sonra onlara geri döneceğiz.

Dava 1

Sorunuzla ilgili ipucu verirken, A ve B ) kontrol noktalarının ilgili sınırlayıcı kutuları kesişmiyorsa, eğriler kesişemez. Açıkçası bu hızlı bir reddetme testi ama aşırı muhafazakar. Muhtemelen bildiğiniz gibi, bir Bezier eğrisi ile, kontrol noktalarının dışbükey gövdesi eğriye bağlı bir (daha sıkı) oluşturur. Böylece, A ve B gövdelerinin kesişip kesişmediğine karar vermek için ayırma ekseni tekniğini kullanabiliriz . (örneğin Wikipedia'da gösterildiği gibi :)

resim açıklamasını buraya girin

Durum 2

Durum 1 testi başarısız olursa, bir kavşağın "önemsiz" olup olmadığını kontrol edebilirsiniz. Şimdi bunu yapmanın muhtemelen daha iyi yolları var, ancak aşağıdaki nispeten ucuz bir yaklaşım bana geldi:

Sadece A eğrisini düşünün:

Bir Bezier'in "yağ çizgisi" sınırları

Eğrinin başlayacağını biliyoruz A0, tarihinde sona erer Anve dışbükey gövdenin içinde yer alacaktır. Basitlik için çizgi parçasının yönünü hesaplayalımA0An¯ ve her iki taraftaki sınırları hesaplayın (yani, geri kalan kontrol noktalarının nokta ürünlerini A0An¯).

Aynı şeyi B eğrisi ile yaparsak, aşağıdaki (olası) durumu elde ederiz: resim açıklamasını buraya girin

Eğer bulursak A0 ve AnB dışındaki diğer sınırlardır ve buB0 ve Bm A'nın sınırlarının dışında, daha sonra Beziers'in sürekliliği ile en az bir kavşak olmalı.

Durum 6

Yukarıdaki durumlardan herhangi birini hemen gösteremezsek, Bezier'lerin her birini iki "yarıya", yani A1,A2,B1,B2. Bu nispeten basittir (okuyucuya bir egzersiz olarak bırakılır), ancak ikinci dereceden Beziers için özellikle önemsizdir :

4 kombinasyonu tekrar tekrar karşılaştırın: (A1,B1),(A2,B1)...(A2,B2). Açıkça tüm vaka 1'i geçerse, kesişme yoktur. Herhangi bir hata 1 varsa, bu azaltılmış alt kümeyle testlerin geri kalanına devam edin.

Vaka 3 ve 5

Burası biraz daha sıkıcı hale geliyor.

"Vaka 3", "Vaka 1" testini geçerse, bana gerçek bir kavşak için çözmeniz gerektiği anlaşılıyor. Bir Bezier, A (s) 'ın N kontrol noktalarını, 1. türevini temsil eden Bezier, A' (s) 'in N-1 noktalarına eşlemek için basit bir işlem olduğu göz önüne alındığında ( 1. türevin sıfıra gittiği nispeten nadir, sözde "dejenere" durumlar, daha sonra potansiyel çözümleri bulmak için Newton iterasyonu (bir boyutta) kullanılabilir.
Ayrıca, A 'ların kontrol noktaları türev değerlerine bağlı olduğundan, bazı vakaların erken ortadan kaldırılma potansiyeli olduğuna dikkat edin.

Vaka 5 nispeten olası görünmüyor, bu yüzden belki sadece birkaç tekrarlamadan sonra kesin bir kanıt yoksa, A'nın her bir uç noktasını B eğrisine karşı deneyebilir ya da tam tersi. Bu sadece kavşak kanıtı verir - kavşak kanıtı değil.


Evet, ama kişisel olarak daha fazla Bm ve / veya B0'ın A'nın maksimum ve minimum bağlı hacminde olduğu ancak delmediği durumlarda alt bölümlere ayırmanız ve en kötü durumda senaryo kavşağını hesaplamanız nokta. Daha iyi yollar, kalın çizgi yaklaşımı olarak da bilinen minimum sınırlama kutusunu kullanmak olabilir.
16:16, joojaa

Her ikili altbölümde, eğri ve uç noktaları birleştiren segment arasındaki fark makul bir faktör tarafından azalır (ve başımın üstünden, kuadratikler için 4x olabilir) kesinlikle sınırlar gidiyor "ince" bir şeride oldukça hızlı bir şekilde yaklaşmak.
Simon F

Evet ama en kötü senaryo, diğer çerçevenin diğerinde başlamasıdır.
16:15, joojaa

Örneğin, An == B0 demek istediniz . Bunu bir kavşak olarak mı tanımlıyorsunuz?
Simon F

Artık B0 gibi değil eğrinin bir yerinde. Ya da sadece minimal bir geçiş
joojaa
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.