Apa algoritma "bucket-fill" terbaik?


16

Saya cukup baru dalam pemrosesan gambar, dan saat ini saya sedang mengerjakan aplikasi mirip cat yang akan menampilkan isi ember. Namun, saya tidak tahu apa algoritma terbaik untuk bucket-fill.

Saya menerapkan contoh yang saya temukan dari situs ini , namun, ia mengalami masalah loop tak terbatas ketika pengguna mencoba mengisi area yang sudah diisi dengan warna yang sama.

Saat ini saya sedang mengatasi masalah itu dengan mengisi kiri, kanan, atas dan bawah; namun, saya membuatnya sehingga setelah piksel diisi ke kiri, tidak dapat mengisi ke kanan, yang berarti bentuk seperti:

Contoh

tidak akan diisi dengan benar jika alat ember digunakan pada titik merah.

Oleh karena itu, saya berharap seseorang mengetahui suatu algoritma atau tautan ke salah satu yang akan menyelesaikan semua masalah ini.

Informasi Tambahan: Ini akan diimplementasikan menggunakan Javascript sebagai alat cat. Ini akan digunakan secara online menggunakan elemen Canvas.


Apakah ini berbasis vektor atau bitmap? Saya mengasumsikan bitmap oleh gambar, tetapi hanya memastikan ..
Demian Brecht

1
Saya pikir Anda telah mengimplementasikan sesuatu yang salah. Saya membaca sekilas dokumen dan menurut contoh gambar, ini harus mengisi gambar seperti yang di atas. Apakah Anda menyalin dan menempelkan kodenya, atau apakah Anda menulis ulang?
RLH

Pikirkan traversal grafik.
Bwmat

@RLH: Saya menyalin dan menempelkan kodenya dengan beberapa perubahan untuk membuatnya berfungsi dengan pengaturan saya.
Ivan

@Van: jangan mulai mencari algo baru sebelum masalah "infinite loop" Anda terpecahkan. Jika bahkan tidak dapat memperbaikinya untuk implementasi yang ada, Anda pasti akan mengalami lebih banyak masalah ketika Anda akan menulis ulang semuanya dari awal.
Doc Brown

Jawaban:


21

Sepertinya Anda benar-benar mencari apa yang disebut algoritma Flood Fill. Mungkin itulah sebabnya Anda tidak menemukan banyak contoh untuk itu. Ada beberapa metode Flood Fill yang tercantum di halaman Wikipedia untuk algoritme . Saya sangat merekomendasikan salah satu metode 'antrian' non-rekursif.


I highly recommend one of the non-recursive, 'queued' methods.- Bisakah Anda menjelaskan mengapa?
Elfayer

1
@ Elfayer Setiap kali fungsi dipanggil (katakan "X ()" memiliki panggilan ke "Y ()"), parameter dan lokasi memori dari fungsi asal ("X ()") disimpan di tumpukan. Jadi, jika Anda mengisi ruang yang besar dan rumit, maka akan ada banyak panggilan fungsi rekursif. Bergantung pada kompiler dan bahasa Anda, ini dapat menyebabkan stack overflow atau konsumsi memori yang berlebihan.
Boxcartenant

-1

Saat ini saya sedang melakukan hal yang sama. Namun, ketika saya mengalami masalah yang Anda tunjukkan, saya memilih untuk hanya mengakhiri fungsi jika alat diklik pada area dengan warna yang sama yang Anda coba lukis (ini juga tampaknya merupakan perilaku ms-paint) .

Metode yang antri harus sangat intuitif bagi siapa pun yang memiliki pengalaman pemrograman.

Jika mengecat area di sekitar titik dengan warna yang sama dengan cat Anda, Anda bisa:

  • periksa warna latar belakang.
  • cari tepi tempat dengan warna yang sama dengan yang Anda klik.
  • antrian titik sekitarnya ke tempat itu.
  • lanjutkan dengan eksekusi normal menggunakan antrian diisi titik putih ini (dalam hal ini).

Jika mau, Anda dapat melihat kode saya (cukup memalukan) di sini .

Jauh dari cepat tetapi bekerja dengan baik ...


Mengapa downvotes? :( Saya tahu metode ini tidak terlalu "cepat", tetapi bekerja, dan juga melakukan solusi yang diusulkan :(
Juan Pablo Alvarez Alfaro

1
posting ini agak sulit dibaca (dinding teks). Maukah Anda mengeditnya menjadi bentuk yang lebih baik?
nyamuk

2
Serius? Orang banyak memilih karena sulit dibaca? Mengapa tidak memilih untuk mengedit? Bukannya kontennya bermasalah.
l46kok

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.