Saat ini saya sedang menggunakan algoritma garis Bresenham untuk saling berhadapan. Masalahnya adalah saya telah menemukan kasus tepi di mana pemain dapat melihat menembus dinding. Terjadi ketika pemain melihat antara dua sudut dinding dengan celah di sisi lain pada sudut tertentu.
Hasil yang saya inginkan adalah ubin di antara dua dinding ditandai tidak valid.
Apa cara tercepat untuk memodifikasi algoritma garis Bresenham untuk menyelesaikan ini? Jika tidak ada solusi yang baik, apakah ada algoritma yang lebih cocok? Setiap ide dipersilakan. Harap dicatat solusinya juga harus mampu mendukung 3d.
Sunting: Solusi sederhana saya adalah memeriksa apakah kedua sudut ditutup ketika koordinat x dan y garis berubah. Untuk kode sumber yang berfungsi dan demo interaktif dari produk yang telah selesai, lihat http://ashblue.github.io/javascript-pathfinding/
sumber
Jawaban:
Eric Lippert menulis seri yang sangat baik tentang menghasilkan line-of-sight dalam C # dengan Shadow Casting pada kotak planar persegi panjang ..
Di antara masalah lain, Eric berurusan dengan berbagai pertanyaan yang harus dijawab tentang persyaratan garis pandang, yang memberikan hasil yang berbeda, dan memberikan contoh dari beberapa hasil yang berbeda. Salah satu artikel membahas secara mendalam dengan keadaan "melihat sekeliling" yang terjadi dalam versi awal algoritmanya.
Saya telah mengadaptasi algoritma Eric ke kisi heksagonal di sini , dan berhasil menggunakannya pada kisi heksagonal besar (> 400 x 700) dengan radius visibilitas yang luas (> 60 heks). Implementasi ini menghitung dan menampilkan bidang pandang lengkap secepat saya bisa berkedip, menggunakan CPU i7 tunggal. Ini tentu saja cukup cepat untuk penggunaan apa pun yang saya harapkan.
Pembaruan - Line-of-sight dengan elevasi:
Implementasi hex-grid yang terhubung ke atas menghitung line-of-sight dengan elevasi, bukan hanya hambatan. Catatan dokumentasi juga membahas keputusan tambahan yang harus dibuat sehubungan dengan perhitungan ketinggian: Tinggi target dan tinggi pengamat. Pilihan default adalah untuk membuat keduanya sama, yang menciptakan bidang pandang simetris, tetapi ground-to-ground dan pengamat-mata ke tanah juga dapat dipilih. (Kode ini Open Source di bawah Lisensi MIT)
sumber
Bagaimana jika untuk perhitungan LOS Anda memiliki kisi "resolusi lebih tinggi" terpisah yang mengisi celah sudut. Saya sedang memikirkan sesuatu seperti ini:
Kiri adalah bagian blok asli dari 4 kotak.
Yang benar adalah versi "resolusi tinggi", karena Anda dapat melihat setiap kotak asli dibagi menjadi empat quaters dan salah satu sudut telah diisi. Saya tidak yakin begitu saja algoritma untuk menghasilkan itu, tetapi dapat dihitung sebelumnya dari peta saat ini.
Itu berarti ruang koordinat empat kali lipat tapi saya tidak membayangkan itu menjadi masalah kinerja yang signifikan.
sumber
0.5
untuk sel beresolusi tinggi yang harus diisi atau tidak. Jadi, menggunakan grid beresolusi tinggi terasa cukup aneh bagiku.