Jawaban:
Ini usahaku. Algoritme berikut jauh dari sempurna , tetapi sederhana dan saya yakin Anda harus mulai dengan ini, memeriksa apakah mereka bekerja dalam situasi Anda, dan beralih ke sesuatu yang lebih cepat dan / atau lebih akurat nanti.
Idenya adalah sebagai berikut:
Kurva Bézier ditentukan oleh fungsi F(t)
menggunakan satu set titik kontrol dan parameter yang bervariasi t
. Jumlah poin pembangkit tidak penting.
Garis ditentukan oleh dua poin A
dan B
.
Biarkan SAMPLES = 10
misalnya
Mulai dengan t0 = 0
dant1 = 1
Membiarkan dt = (t1 - t0) / SAMPLES
Jika dt < 1e-10
(atau kondisi akurasi lainnya yang Anda inginkan), algoritma telah selesai dan jawabannya sudahF(t0)
.
Hitung daftar SAMPLES + 1
poin pada kurva Bézier:
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
Cari titik mana L
dengan indeks i
paling dekat dengan garis. Gunakan metode jarak titik / garis apa pun yang Anda tahu, misalnya jarak kuadrat di ||AB^L[i]A||² / ||AB||²
mana ^
menunjukkan produk silang dan ||…||
jarak.
Jika i == 0
, atur i = 1
; jika i == SAMPLES
, aturi = SAMPLES - 1
Biarkan t1 = t0 + (i + 1) * dt
dant0 = t0 + (i - 1) * dt
Kembali ke langkah 3.
Kali ini kami memiliki dua kurva Bézier, parametris oleh F(t)
dan G(t)
.
Biarkan SAMPLES = 10
misalnya
Mulailah dengan t0 = 0
, t1 = 1
, s0 = 0
dans1 = 1
Membiarkan dt = (t1 - t0) / SAMPLES
Membiarkan ds = (s1 - s0) / SAMPLES
Jika dt < 1e-10
(atau kondisi akurasi lainnya yang Anda inginkan), algoritma telah selesai dan jawabannya sudahF(t0)
.
JIKA ini menjalankan pertama dari loop:
6.1. Hitung daftar SAMPLES + 1
poin pada F
( lihat di atas ).
6.2. Hitung daftar SAMPLES + 1
poin aktif G
.
6.3. Temukan pasangan poin mana yang paling dekat satu sama lain.
6.4. Update t0
, t1
, s0
, s1
seperti yang terlihat di atas.
LAIN : sebagai alternatif, hitung daftar poin pada F
ATAU daftar poin aktif G
, kemudian cari titik mana yang F
paling dekat G(s0)
dan perbarui t0
dan t1
, ATAU titik mana yang G
paling dekat dengan F(t0)
dan perbarui s0
dan s1
.
Kembali ke langkah 3.
Secara desain, algoritma ini akan selalu konvergen ke minimum lokal. Namun, tidak ada jaminan bahwa mereka akan bertemu dengan solusi terbaik. Secara khusus, algoritma kurva Bézier tidak terlalu bagus sama sekali, dan dalam kasus dua kurva yang berdekatan satu sama lain di banyak tempat, sayangnya Anda mungkin melewatkan solusi dengan tembakan panjang.
Tetapi seperti yang saya katakan, sebelum Anda mulai memikirkan solusi yang lebih kuat, Anda harus terlebih dahulu bereksperimen dengan yang sederhana.
1) Terjemahkan semuanya ke satu sumbu, jadi alih-alih perlu menghitung panjang satu titik ke, 'garis', 'garis' adalah, katakanlah, sumbu-Y.
Lalu, eh, diberi kurva bezier saya akan mengatakan itu sampai dengan jumlah titik kontrol.
Jika ada tiga, (awal, 'kontrol' dan akhir) saya akan melakukan semacam pemindaian (katakan masing-masing beberapa persen dan kemudian perbaiki antara yang terdekat (dengan katakanlah pendekatan 'biner').
Lebih banyak poin saya akan mencoba pasangan yang paling dekat dengan (diterjemahkan Y-Axis).
Saya yakin seorang pria matematika dapat memberikan Anda solusi yang tepat (dalam matematika) tetapi jika Anda ingin menemukan / solusi dalam permainan video Anda mungkin lebih baik dengan solusi yang sedikit ok karena solusi sebenarnya mungkin berisi beberapa jawaban ( Saya bahkan tidak berbicara tentang kekuatan pemrosesan).
Beberapa jawaban dari halaman blog Algoritma , yang dengan benar menemukan titik terdekat pada kurva bezier kuadratik yang diberikan.
Demo .
Untuk kurva Bezier - garis lurus, cara paling akurat untuk menemukan jawabannya adalah dengan melakukan hal berikut: