Dengan asumsi bahwa sprite Anda menempati set ubin yang persegi panjang (jika mereka menempati set sewenang-wenang, maka Anda tidak dapat menggambar dengan benar sama sekali dalam kasus umum), masalahnya adalah bahwa tidak ada hubungan urutan total antara elemen, sehingga Anda tidak dapat mengurutkan mereka menggunakan semacam yang akan menghasilkan perbandingan O (nlogn).
Perhatikan bahwa untuk dua objek A dan B, baik A harus digambar sebelum B (A <- B), B harus digambar sebelum A (B <- A) atau mereka dapat digambar dalam urutan apa pun. Mereka membentuk urutan parsial. Jika Anda menggambar sendiri beberapa contoh dengan 3 objek yang tumpang tindih, Anda mungkin memperhatikan bahwa meskipun objek 1 dan 3 mungkin tidak tumpang tindih, sehingga tidak memiliki ketergantungan langsung, urutan gambar mereka tergantung pada objek ke-2 yang ada di antara mereka - tergantung bagaimana Anda menempatkannya, Anda akan mendapatkan pesanan menggambar yang berbeda. Intinya - jenis tradisional tidak berfungsi di sini.
Salah satu solusinya adalah dengan menggunakan perbandingan (disebutkan oleh Dani) dan membandingkan setiap objek dengan masing-masing objek lainnya untuk menentukan dependensi mereka dan membentuk grafik dependensi (yang akan menjadi DAG). Kemudian lakukan pengurutan topologi pada grafik untuk menentukan urutan gambar. Jika tidak ada terlalu banyak objek, ini mungkin cukup cepat O(n^2)
.
Solusi lain adalah dengan menggunakan pohon quad (untuk menyeimbangkan - semu ) dan menyimpan persegi panjang dari semua objek ke dalamnya.
Kemudian beralih ke semua objek X, dan gunakan pohon quad untuk memeriksa apakah ada objek Y di garis di atas objek X yang dimulai dengan paling kiri dan berakhir dengan sudut paling kanan dari objek X - untuk semua Y, Y < - X. Seperti ini, Anda masih harus membentuk grafik dan mengurutkannya secara topologis.
Tapi Anda bisa menghindarinya. Anda menggunakan daftar objek Q, dan tabel objek T. Anda mengulangi semua slot yang terlihat dari yang lebih kecil ke nilai yang lebih besar pada sumbu x (satu baris), berjalan baris demi baris pada sumbu y. Jika ada sudut bawah objek di slot itu, lakukan prosedur di atas untuk menentukan dependensi. Jika suatu objek X tergantung pada beberapa objek Y lainnya yang sebagian di atasnya (Y <- X), dan setiap Y tersebut sudah ada di Q, tambahkan X ke Q. Jika ada beberapa Y yang tidak ada di Q, tambahkan X ke T dan menyatakan bahwa Y <- X. Setiap kali Anda menambahkan objek ke Q, Anda menghapus dependensi objek yang tertunda di T. Jika semua dependensi dihapus, objek dari T dipindahkan ke Q.
Kami mengasumsikan bahwa sprite objek tidak mengintip dari slot mereka di bagian bawah, kiri atau kanan (hanya di atas, seperti pohon di gambar Anda). Ini harus meningkatkan kinerja untuk sejumlah besar objek. Pendekatan ini akan kembali O(n^2)
, tetapi hanya dalam kasus terburuk yang mencakup objek berukuran aneh dan / atau konfigurasi objek aneh. Dalam kebanyakan kasus, itu O(n * logn * sqrt(n))
. Mengetahui ketinggian sprite Anda dapat menghilangkannya sqrt(n)
, karena Anda tidak perlu memeriksa seluruh strip di atas. Bergantung pada jumlah objek di layar, Anda dapat mencoba mengganti pohon quad dengan array yang menunjukkan slot mana yang diambil (masuk akal jika ada banyak objek).
Akhirnya, jangan ragu untuk memeriksa kode sumber ini untuk beberapa ide: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala