2 eğrideki en yakın noktayı nasıl hesaplarsınız?


15

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?

resim açıklamasını buraya girin


2
Bu sorunun iyi bir başlangıç olduğuna inanıyorum .
sam hocevar

Yanıtlar:


3

İş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ğrisini örnekleyin, o örnek üzerindeki en yakın noktayı bulun
  • Bulunan noktanın etrafındaki bir mahalleyi örnekleyin, en yakın yeni noktayı bulun
  • Nokta artık fazla değişmeyene kadar devam edin

Bézier eğrisinden çizgiye uzaklık için algoritma

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.

  1. İzin Vermek SAMPLES = 10örneğin

  2. İle başla t0 = 0 vet1 = 1

  3. İzin Vermek dt = (t1 - t0) / SAMPLES

  4. Eğer dt < 1e-10(uygun gördüğünüz başka doğruluk koşul ya), algoritma bitti ve cevabıF(t0) .

  5. SAMPLES + 1Bé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)
  6. 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.

  7. Eğer i == 0, ayarlayın i = 1; Eğeri == SAMPLES , ayarlai = SAMPLES - 1

  8. Bırakın t1 = t0 + (i + 1) * dtvet0 = t0 + (i - 1) * dt

  9. 3. adıma geri dönün.

Bézier eğrisinden Bézier eğrisine uzaklık için algoritma

Bu sefer F(t)ve ile parametrelenen iki Bézier eğrisimiz var G(t).

  1. Let SAMPLES = 10örneğin

  2. İle başlayın t0 = 0, t1 = 1, s0 = 0ves1 = 1

  3. İzin Vermek dt = (t1 - t0) / SAMPLES

  4. İzin Vermek ds = (s1 - s0) / SAMPLES

  5. Eğer dt < 1e-10(uygun gördüğünüz başka doğruluk koşul ya), algoritma bitti ve cevapF(t0) .

  6. 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, s1yukarıda görüldüğü gibi.

  7. ELSE : alternatif olarak F VEYA üzerindeki bir nokta listesini hesaplayın G, ardından hangi noktanın Fen yakın olduğunu bulun G(s0)ve güncelleyint0 ve t1, OR noktasına Gen yakın olan F(t0)ve güncelleme s0ve s1.

  8. 3. adıma geri dönün.

Sorunlar

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.


0

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).


ps. 2 eğri, bunu düşünmeyin bile (kontrol noktalarının sayısına göre (en azından ... olduğu gibi) bir şey elde edebilirsiniz)
Valmond


0

Bezier eğrisi - düz çizgi durumunda, cevabı bulmanın en doğru yolu aşağıdakileri yapmaktır:

  1. Sorunu, düz çizgi her zaman Y = 0'da yatay olacak şekilde dönüştürün. Bu, tüm kontrol noktalarının uygun bir afinite matrisi ile çarpılmasıyla yapılır. (3 sabit girişli 3x3 matris ile uçağın afin dönüşümlerini temsil ettiğinizi varsayıyorum.)
  2. Kontrol noktalarının Y koordinatlarını inceleyin. Hepsinin aynı işareti yoksa, çizgi ile bir kavşak olabilir. Bezier eğrisinin Y bölümünün köklerini hesaplayın. Polinomlar için herhangi bir kök bulma yöntemini kullanabilirsiniz, literatürde bol miktarda vardır. Örneğin, google "dışbükey gövde yürüyüşü" - Bezier eğrilerinde kullanılan polinomlar için oldukça iyi bir yöntemdir. Bulduğunuz her kök, mesafenin sıfır olduğu - işinizin yapıldığı çizgi ile kesişmenin zaman değeridir.
  3. Tüm Y koordinatları aynı işarete sahipse, Bezier eğrisinin Y kısmının türevini hesaplayın. Noktaların X koordinatlarını göz ardı edebilirsiniz, çünkü fark etmezler - hedef çizgi yataydır. Bu türevin köklerini bulun. Bunlar, eğrinin yerel olarak çizgiye en yakın olduğu zaman değerleridir.
  4. Önceki adımda bulduğunuz tüm kökler için Bezier eğrisini açıkça değerlendirin ve çizgiden en küçük mesafeyi veren kökü bildirin. Ayrıca uç noktaları kontrol etmeniz gerekir - herhangi bir kökten daha küçük bir mesafe verebilirler.
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.