Saya belum mengerjakan persamaan lengkap untuk ini, tapi di sini ada beberapa visual untuk membantu mengatasi masalah ini. Itu bermuara pada beberapa geometri:
( Ikon mobil melalui Kenney )
Dari titik awal dan orientasi mana pun, kita dapat menggambar dua lingkaran dengan jari-jari belok minimum - satu di kiri, satu di kanan. Ini menggambarkan titik-titik di awal seketat mungkin menuju jalan kita.
Kita dapat melakukan hal yang sama untuk posisi akhir dan orientasi yang diinginkan. Lingkaran-lingkaran ini menggambarkan ujung seketat mungkin untuk jalan kita.
Sekarang masalahnya berkurang menjadi menemukan jalan yang bergabung dengan salah satu lingkaran mulai ke salah satu lingkaran akhir, mencium masing-masing sepanjang garis singgung.
(Ini dengan asumsi kita tidak perlu mencari-cari kendala di antara, yang tidak disebutkan dalam pertanyaan. Jawaban Stormwind masuk ke bagaimana kita dapat menggunakan informasi grafik navigasi untuk jenis masalah ini. Setelah kita memiliki urutan node untuk melewati, kita dapat menerapkan metode di bawah ini untuk setiap segmen dari rencana.)
Jika, untuk kesederhanaan, kami menggunakan garis lurus, kami mendapatkan sesuatu seperti ini:
Ini memberi kita kasus pembatas. Setelah Anda menemukan jalur dengan metode ini, Anda dapat mengembang satu atau keduanya secara otomatis mulai & akhiri lingkaran untuk mendapatkan jalur yang lebih langsung namun lebih halus, hingga titik di mana kedua lingkaran mencium.
Hitung jalur ini
Mari kita selesaikan case untuk satu arah belokan - katakan kita memulai jalan kita dengan belok kanan.
Pusat lingkaran kanan kita adalah:
startRightCenter = carStart.position + carStart.right * minRadius
Mari kita sebut sudut bagian lurus dari lintasan kita (diukur dari sumbu x positif) pathAngle
Jika kita menggambar vektor dari rightCenter
ke titik di mana kita meninggalkan lingkaran berputar (pada titik mana kita harus menghadapi pathAngle), maka vektor itu adalah ...
startOffset = minRadius * (-cos(pathAngle), sin(pathAngle))
Itu berarti titik di mana kita meninggalkan lingkaran harus ...
departure = startRightCenter + startOffset
Titik di mana kita masuk kembali ke lingkaran berputar tergantung pada apakah kita bertujuan untuk mengakhiri dengan belokan kiri atau kanan:
// To end with a right turn:
reentry = endRightCenter + startOffset
// To end with a left turn: (crossover)
reentry = endLeftCenter - startOffset
Sekarang, jika kita sudah melakukan tugas kita benar, garis bergabung departure
ke reentry
seharusnya menjadi tegak lurus ke startOffset
:
dot(reentry - departure, startOffset) = 0
Dan memecahkan persamaan ini akan memberi kita sudut pandang yang benar. (Saya menggunakan jamak di sini karena secara teknis ada dua sudut seperti itu, tetapi salah satunya melibatkan mengemudi secara terbalik yang biasanya tidak seperti yang kita inginkan)
Mari gantilah belokan kanan ke belok kanan sebagai contoh:
dot(endRightCenter + startOffset - startRightCenter - startOffset, startOffset) = 0
dot(endRightCenter - startRightCenter, startOffset) = 0
pathAngle = atan2(endRightCenter - startRightCenter)
Kasus crossover lebih rumit - itu yang saya belum mengerjakan semua matematika untuk saat ini. Saya akan memposting jawabannya tanpa untuk saat ini, kalau-kalau itu berguna bagi Anda saat saya mengerjakan rincian yang tersisa.
Sunting: Tujuan di dalam radius putaran minimum
Ternyata, metode ini sering bekerja di luar kotak bahkan ketika tujuannya lebih dekat dari jarak belokan minimum kami. Setidaknya beberapa bagian dari salah satu lingkaran masuk kembali berakhir di luar radius belokan, membiarkan kami menemukan jalur yang layak selama kami tidak keberatan mendapatkan sedikit seperti pretzel ...
Jika kita tidak menyukai jalan yang kita dapatkan seperti itu (atau jika ada yang tidak layak - saya belum memeriksa setiap kasus secara menyeluruh - mungkin ada yang mustahil), kita selalu dapat mengemudi lurus ke depan atau ke belakang sampai kita mendapatkan yang sesuai mencium kontak antara lingkaran awal & akhir, seperti yang digambarkan di atas.