Saya sudah menatap masalah ini selama beberapa hari sekarang. Saya memasang grafik ini untuk membantu saya memvisualisasikan masalah: (dari grafik, kita tahu bahwa garis berpotongan [1, 1], [1, 2], [2, 2], [2, 3], berakhir dengan [ 3,3])
Saya ingin melangkah sepanjang garis ke setiap ruang kotak dan memeriksa untuk melihat apakah bahan ruang kotak solid. Saya merasa sudah tahu matematika yang terlibat, tetapi saya belum bisa merangkai semuanya. Saya menggunakan ini untuk menguji garis pandang dan menghilangkan node setelah jalan ditemukan melalui algoritma pathfinding saya - agen saya tidak dapat melihat melalui blok padat, oleh karena itu mereka tidak dapat bergerak melalui satu, oleh karena itu simpul tidak dihilangkan dari jalan karena itu diperlukan untuk menavigasi sudut.
Jadi, saya membutuhkan algoritma yang akan melangkah sepanjang garis ke setiap ruang kotak yang bersinggungan. Ada ide?
Saya telah melihat banyak algoritma umum, seperti Bresenham, dan algoritma yang melangkah pada interval yang telah ditentukan sebelumnya (sayangnya, metode ini melewatkan ubin jika mereka berpotongan dengan irisan yang lebih kecil daripada ukuran langkah).
Saya mengisi papan tulis saya sekarang dengan massa fungsi floor () dan ceil () - tapi itu menjadi terlalu rumit dan saya khawatir itu bisa menyebabkan perlambatan.
sumber
Jawaban:
Jika Anda tahu blok awal (Anda tahu titik X dan Anda tidak memasukkan blok [0,1] dalam daftar blok, jadi saya kira Anda juga tahu blok awal), saya pikir Anda harus menggunakan algoritma Bresenham. Anda menulis, Anda melihatnya.
Ini algoritma yang cocok untuk masalah ini. Dapat juga ditulis dengan cara, hanya menghitung dengan bilangan bulat. Anda dapat menemukan banyak implementasi di web.
EDIT:
Maaf, saya belum menyadari bahwa Bresenham tidak akan menemukan semua blok. Jadi saya menemukan solusi yang lebih baik . Ada juga kode yang ditulis dalam C ++, tapi saya pikir seharusnya tidak sulit untuk dimengerti :)
sumber
Kode pada contoh yang digunakan tautan jawaban yang diterima memerlukan beberapa penyesuaian untuk garis diagonal sempurna. Berikut ini adalah aplikasi demo lengkap yang ditulis dengan Qt (C ++ dan QML).
Kode C ++ yang relevan:
sumber