[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:
Biz "trivially" yaptıkları belirleyebilir Olgu değil kesiştiği.
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)
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.
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.
Her biri bir "ana" Bezier alt kümesi olduğundan ve üst üste geldiklerinden sonsuz sayıda kesişme noktası vardır.
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 :)
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:
Eğrinin başlayacağını biliyoruz bir0, tarihinde sona erer birnve dışbükey gövdenin içinde yer alacaktır. Basitlik için çizgi parçasının yönünü hesaplayalımbir0birn¯¯¯¯¯¯¯¯¯¯¯¯ ve her iki taraftaki sınırları hesaplayın (yani, geri kalan kontrol noktalarının nokta ürünlerini bir0birn¯¯¯¯¯¯¯¯¯¯¯¯).
Aynı şeyi B eğrisi ile yaparsak, aşağıdaki (olası) durumu elde ederiz:
Eğer bulursak bir0 ve birnB 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.