Bir çizginin noktaları ve kuadratik bir bezier eğrisi göz önüne alındığında, en yakın noktalarını nasıl hesaplarsınız? .... Benzer şekilde, 2 eğrinin noktaları göz önüne alındığında, en yakın noktayı nasıl elde edersiniz?
Bir çizginin noktaları ve kuadratik bir bezier eğrisi göz önüne alındığında, en yakın noktalarını nasıl hesaplarsınız? .... Benzer şekilde, 2 eğrinin noktaları göz önüne alındığında, en yakın noktayı nasıl elde edersiniz?
Yanıtlar:
İşte benim denemem. Aşağıdaki algoritmalar mükemmel olmaktan uzaktır , ancak basittirler ve bununla başlamanız, durumunuzda çalışıp çalışmadıklarını kontrol etmeniz ve daha sonra daha hızlı ve / veya daha doğru bir şeye geçmeniz gerektiğine inanıyorum.
Fikir şudur:
Bézier eğrisi, F(t)
bir dizi kontrol noktası ve değişken bir parametre kullanan bir fonksiyonla parametrelenir t
. Üretim noktası sayısı önemsizdir.
Çizgi iki nokta ile parametrelenir A
ve B
.
İzin Vermek SAMPLES = 10
örneğin
İle başla t0 = 0
vet1 = 1
İzin Vermek dt = (t1 - t0) / SAMPLES
Eğer dt < 1e-10
(uygun gördüğünüz başka doğruluk koşul ya), algoritma bitti ve cevabıF(t0)
.
SAMPLES + 1
Bézier eğrisindeki noktaların bir listesini hesaplayın :
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
L
İndeks ile hangi noktanın i
çizgiye en yakın olduğunu bulun . Herhangi bir kullanım noktası / çizgi uzaklık yöntemi , örneğin, kare mesafe biliyor çapraz ürün anlamına gelir ve||AB^L[i]A||² / ||AB||²
^
||…||
mesafedir.
Eğer i == 0
, ayarlayın i = 1
; Eğeri == SAMPLES
, ayarlai = SAMPLES - 1
Bırakın t1 = t0 + (i + 1) * dt
vet0 = t0 + (i - 1) * dt
3. adıma geri dönün.
Bu sefer F(t)
ve ile parametrelenen iki Bézier eğrisimiz var G(t)
.
Let SAMPLES = 10
örneğin
İle başlayın t0 = 0
, t1 = 1
, s0 = 0
ves1 = 1
İzin Vermek dt = (t1 - t0) / SAMPLES
İzin Vermek ds = (s1 - s0) / SAMPLES
Eğer dt < 1e-10
(uygun gördüğünüz başka doğruluk koşul ya), algoritma bitti ve cevapF(t0)
.
EĞER bu döngüdeki ilk çalıştırma ise:
6.1. SAMPLES + 1
Üzerinde bir nokta listesi hesaplayın F
( yukarıya bakın ).
6.2. SAMPLES + 1
Üzerinde bir puan listesi hesaplayın G
.
6.3. Hangi noktaların birbirine en yakın olduğunu bulun.
6.4. Güncelleme t0
, t1
, s0
, s1
yukarıda görüldüğü gibi.
ELSE : alternatif olarak F
VEYA üzerindeki bir nokta listesini hesaplayın G
, ardından hangi noktanın F
en yakın olduğunu bulun G(s0)
ve güncelleyint0
ve t1
, OR noktasına G
en yakın olan F(t0)
ve güncelleme s0
ve s1
.
3. adıma geri dönün.
Tasarım gereği, bu algoritmalar her zaman yerel bir minimuma yakınlaşacaktır. Ancak, en iyi çözüme ulaşacaklarına dair bir garanti yoktur. Özellikle, Bézier eğrisi algoritması hiç de iyi değil ve iki eğrinin birçok yerde birbirine yakın olması durumunda, maalesef uzun bir atışla çözümü özleyebilirsiniz.
Ama dediğim gibi, daha sağlam çözümler düşünmeye başlamadan önce, ilk önce bu basit çözümleri denemelisiniz.
1) Her şeyi bir eksene çevirin, böylece bir noktanın uzunluğunu hesaplamak yerine 'çizgiye', 'çizgiye' Y-Eksenidir.
Sonra, bir bezier eğrisi verildiğinde, kontrol noktalarının sayısına kadar olduğunu söyleyebilirim.
Üç tane varsa (başlangıç, 'kontrol' ve son) Bir çeşit tarama yapardım (her birini yüzde birkaç olarak söyleyin ve sonra en yakın olanlar arasında ('ikili' yaklaşımla) düzeltin.
Daha fazla puan (tercüme Y-Ekseni) en yakın çift denemek istiyorum.
Bir matematikçinin size kesin çözümü (matematikte) verebileceğinden eminim, ancak bir video oyununda / bir çözüm bulmak istiyorsanız, gerçek çözüm birkaç cevap içerebileceğinden biraz iyi bir çözümle daha iyi olabilirsiniz ( İşlem gücünden bile bahsetmiyorum).
Bazı cevaplar Algoritma blog sayfasındanVerilen ikinci dereceden çerçeve eğrisi üzerindeki en yakın noktayı doğru bir şekilde bulan .
Demo .
Bezier eğrisi - düz çizgi durumunda, cevabı bulmanın en doğru yolu aşağıdakileri yapmaktır: