Bagaimana cara mendeteksi tabrakan antara sprite dan bentuk yang dibuat pengguna?


9

Cara mendeteksi tabrakan antara sprite dan bentuk yang dibuat pengguna.

Sebagai contoh. Ada beberapa objek di layar. Pengguna mengambil jari mereka dan menggambar bentuk lingkaran di sekitar objek (Aturan pemilihan adalah melukis lingkaran di sekitar sprite, tetapi bentuk lukisan mungkin beragam). Saya perlu mendeteksi objek mana yang dipilih, seperti:

(gambar demo): awalnya diposting sebagai http://i52.tinypic.com/28h0t1g.png


Bisakah Anda menjelaskan mengapa biru dipilih dan bukan merah dalam contoh terakhir Anda? Bisakah Anda juga menjelaskan apakah garis harus benar-benar menyentuh sprite? Contoh ketiga tidak menyentuh kotak merah tetapi dinyatakan sebagai dipilih. Contoh ke-5 sangat mirip tetapi tidak dipilih. Apa perbedaan yang Anda cari antara # 3 dan # 5?
Romen

Jawaban:


2

Jika bentuknya digambar terutama dengan segmen garis dari pengguna (atau kurva Bezier dengan titik kontrol), Anda dapat menerapkan algoritma yang cukup banyak digunakan yang dikenal sebagai Separating-Axis-Theorem . Sederhananya: jika ada sumbu (unit-vektor yang mewakili arah) di mana bentuk tidak tumpang tindih (nilai yang diproyeksikan tidak menghasilkan perbedaan positif), objek tidak tumpang tindih. Saya telah menggunakan ini di masa lalu dan itu berfungsi seperti pesona.


1

Jika bentuk digambar tangan seperti dalam Fisika Crayon , Anda dapat memegang larik garis lurus dan memeriksa tabrakan dengan masing-masing. Meskipun garis lurus Anda dapat menggunakan kurva Bezier atau semacamnya.


0
  • Buat buffer dengan ukuran yang sama seperti layar (atau permukaan di mana bentuk Anda). Pada setiap posisi mengandung boolean apakah ada sprite; kemudian, periksa semua "piksel" bentuk pengguna apakah pada posisi mereka adalah sprite (dengan memeriksa nilai boolean itu). Atau, Anda dapat membuat lebih banyak sprite di sana dengan menyimpan ID mereka alih-alih boolean; tetapi ini adalah kasus 1 sprite.
  • Jika bentuk yang dibuat pengguna dapat diwakili oleh urutan garis, maka Anda dapat memeriksa apakah setiap garis tersebut melintasi sprite. Karena sprite memiliki bentuk persegi panjang dan bentuk pengguna adalah sebuah garis. Carilah "garis persimpangan persegi panjang" ... (memisahkan algoritma sumbu dengan satu cara untuk melakukannya)

Pendekatan bergantung pada struktur data apa yang Anda pilih, apakah itu bitmap atau vektor.

Pendekatan pertama dapat menangani bentuk kompleks yang arbitrer, mudah diimplementasikan tetapi menggunakan lebih banyak memori. Sebenarnya Anda dapat mengurangi overhead memori dengan menggunakan kompresi dan mempercepatnya dengan menggunakan struktur data hierachical (octrees) ...

Pendekatan kedua, tidak begitu sederhana untuk diimplementasikan tetapi menggunakan lebih banyak kekuatan pemrosesan.

Dalam setiap kasus ukurlah jika itu penting. Saya akan mencoba melakukan yang pertama karena lebih mudah diimplementasikan. Semoga berhasil. :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.