Inilah solusi berbasis vektor. Saya belum mencobanya, tetapi tampaknya baik secara konseptual.
Teori
Saya kira Anda telah menyimpan bentuk sebagai segmen garis. Inilah huruf A yang diwakili dengan tiga segmen garis.
Saya berasumsi bahwa jalur dalam gambar pengguna disimpan sebagai daftar poin.
Kami dapat "mengembang" segmen garis tersebut untuk memungkinkan margin kesalahan saat memeriksa kedekatan : apakah jalur yang ditarik pengguna berada di dekat margin kesalahan garis yang benar.
Namun, itu saja tidak cukup. Kami juga harus memeriksa cakupan : apakah gambar pengguna "menutupi" sebagian besar dari bentuk. Gambar-gambar ini buruk, karena meskipun sesuai dengan margin kesalahan, mereka kehilangan beberapa bagian surat:
Jika kami memeriksa kedua hal itu, kami dapat memperkirakan apakah hasil undian pemain bagus.
Penerapan
Memeriksa kedekatan hanya berarti untuk setiap titik jalur pengguna, menemukan jarak antara itu dan setiap baris yang membentuk huruf, mengambil yang terendah dan memeriksa itu kurang dari margin kesalahan.
Memeriksa cakupan lebih rumit, tetapi Anda bisa mendapatkan perkiraan yang sangat baik dengan matematika vektor jika untuk setiap segmen garis, Anda menemukan jalur yang ditarik pengguna terdekat (hijau) dan memproyeksikan bagiannya (hijau gelap) ke segmen garis itu (hitam), kemudian periksa seberapa baik vektor yang diproyeksikan (biru) menutupnya:
Untuk memproyeksikan vektor a
ke vektor lain b
, lakukan
projection = dotProduct(a, b) / lengthSquared(b) * b
di mana dotProduct
menghitung titik produk dari dua vektor dan seperti lengthSquared
apa suaranya. Pada dasarnya, ini menemukan nilai skalar dari berapa banyak a
berjalan dalam b
arah dan dikalikan b
dengan itu untuk mendapatkan vektor dalam arah yang sama. ( Tutorial pendeteksian tabrakan Metanet Software A memiliki visualisasi yang bagus tentang ini dalam Lampiran A proyeksi § .)
Arah vektor yang diproyeksikan mungkin sebenarnya tidak penting. Jika Anda hanya menjumlahkan panjang dari vektor yang diproyeksikan dan membandingkannya dengan total panjang segmen garis, itu akan memberi tahu Anda apa bagian dari itu tercakup. (Kecuali dalam kasus aneh — lihat § Batasan di bawah).
Pada gambar di atas, jalan akan mencakup sekitar setengah dari segmen. Anda dapat memilih nilai toleransi apa pun yang Anda inginkan.
Keterbatasan
Huruf melengkung
Segmen baris kurang ideal: Banyak huruf melengkung! Bagaimana Anda mewakili 'P' atau 'O'?
Anda dapat menggunakan banyak segmen garis (mungkin dengan margin kesalahan lebih besar).
Anda juga bisa mulai menggunakan kurva Bezier bukan garis untuk cocok lebih dekat, tetapi catatan bahwa menemukan titik terdekat pada Bezier adalah jauh lebih kompleks-seperti banyak operasi pengukuran lain.
Ketidakcocokan
Margin toleransi yang terlalu longgar untuk jarak dari garis dan cakupan surat itu bisa memiliki konsekuensi yang tidak diinginkan.
Misalnya, pemain mungkin mencoba menggambar huruf 'H' di sini.
Loop dan tumpang tindih
Loop atau tumpang tindih di jalur yang digambar pemain dapat mengakibatkan beberapa bagian dari gambar dihitung dua kali saat memproyeksikannya ke segmen garis terdekat.
Ini dapat dikerjakan dengan melakukan pemrosesan yang lebih bagus pada vektor yang diproyeksikan, mungkin menyimpan tepat di mana vektor yang diproyeksikan berada (menyimpan arah proyeksi juga, dan titik terdekat pada segmen garis ke titik pada garis yang dibuat pemain) , lalu menolak yang baru yang tumpang tindih.
Jika pemain menggambar jalur tunggal dan diproses mulai dari ujung yang ditandai dengan lingkaran biru, bagian hijau dari jalur itu akan diterima dan yang merah ditolak, karena proyeksi mereka akan tumpang tindih dengan beberapa bagian yang diproses sebelumnya.
Implementasinya memiliki banyak seluk-beluk teknis yang mungkin masuk dalam pertanyaan yang berbeda.
Pemain petualang yang tidak terduga
Seorang pemain mungkin menggambar sesuatu yang aneh yang masih berlalu .
Meskipun Anda bisa menyebutnya fitur! :)