En iyi “kova doldurma” algoritması nedir?


16

Görüntü işleme konusunda oldukça yeniyim ve şu anda bir kova dolgusu içeren boya benzeri bir uygulama üzerinde çalışıyorum. Ancak, bir kova dolgusu için en iyi algoritmanın ne olduğu hakkında hiçbir fikrim yok.

Bu siteden bulduğum bir örneği uyguladım , ancak bir kullanıcı zaten aynı renkle kova dolu bir alanı kova doldurmaya çalıştığında sonsuz döngü sorunlarıyla karşılaştı.

Şu anda bu sorunu sola, sağa, yukarı ve aşağıya doldurarak çalışıyorum; Ancak, bir piksel sola doldurulduktan sonra sağa dolduramayacağı şekilde yaptım, bu da aşağıdaki gibi şekiller anlamına gelir:

Misal

kova aracı kırmızı noktada kullanılırsa düzgün doldurulmaz.

Bu nedenle, birisinin tüm bu sorunları çözecek bir algoritma veya bir bağlantı bildiğini umuyorum.

Ek Bilgi: Bu, boyama aracı olarak Javascript kullanılarak uygulanacaktır. Canvas öğesi kullanılarak çevrimiçi olarak kullanılacaktır.


Bu vektör veya bitmap tabanlı mı? Ben görüntü tarafından bitmap varsayıyorum, ama sadece emin olun ..
Demian Brecht

1
Sanırım bir şeyi yanlış uyguladınız. Belgeyi gözden kaçırdım ve görüntü örneklerine göre, yukarıdaki gibi görüntüleri doldurmalıdır. Kodunu kopyalayıp yapıştırdınız mı veya yeniden yazdınız mı?
RLH

Grafik geçişini düşünün.
Bwmat

@RLH: Kodumu, kurulumumla çalışmasını sağlamak için birkaç değişiklikle kopyalayıp yapıştırdım.
Ivan

@Ivan: "sonsuz döngü" sorunlarınız çözülmeden önce yeni bir algo aramaya başlamayın. Mevcut bir uygulama için bunu bile düzeltemezseniz, her şeyi sıfırdan yeniden yazacağınız zaman kesinlikle çok daha fazla sorunla karşılaşacaksınız.
Doc Brown

Yanıtlar:


21

Aslında bir Flood Fill algoritması olarak adlandırılan şeyi aradığınız anlaşılıyor. Bu yüzden bunun için tonlarca örnek bulmadınız. Algoritma için Wikipedia sayfasında birkaç Flood Fill yöntemi listelenmiştir . Özyinelemesiz, 'sıraya alınmış' yöntemlerden birini tavsiye ederim.


I highly recommend one of the non-recursive, 'queued' methods.- Nedenini açıklayabilir misin?
Elfayer

1
@Elfayer Bir işlev her çağrıldığında ("X ()" ifadesinin "Y ()" çağrısına sahip olduğu her durumda, başlangıç ​​işlevinden ("X ()") parametreler ve bellek konumu yığın üzerinde depolanır. Yani, büyük ve karmaşık bir alanı dolduruyorsanız, çok sayıda özyinelemeli işlev çağrısı olacaktır. Derleyicinize ve dilinize bağlı olarak, bu yığın yığınlarına veya aşırı bellek tüketimine neden olabilir.
boxcartenant

-1

Şu anda aynı şeyi yapıyorum. Ancak, belirttiğiniz sorunla karşılaştığımda, araç boyamaya çalıştığınız aynı renkteki bir alana tıklanırsa işlevi sonlandırmayı seçtim (bu aynı zamanda ms-paint davranışı gibi görünüyor) .

Sıraya alınan yöntem, bazı programlama deneyimi olan herkes için son derece sezgisel olmalıdır.

Boya ile aynı renkteki bir noktayı çevreleyen alanı boyamak endişe verici ise, şunları yapabilirsiniz:

  • arka plan rengini kontrol edin.
  • tıkladığınız aynı renkli noktanın kenarını arayın.
  • çevreleyen noktaları noktaya sıraya sokmak.
  • bu (bu örnekte) beyaz nokta dolu kuyruğu kullanarak normal yürütmeye devam edin.

İsterseniz burada (oldukça utanç verici) koduma bir göz atabilirsiniz .

Hızlı olmaktan uzak ama iyi çalışıyor ...


Neden inişler? :( Yöntemin özellikle "hızlı" olmadığını biliyorum, ama işe yarıyor ve aynı zamanda önerilen çözümü de yapıyor :(
Juan Pablo Alvarez Alfaro

1
bu yazıyı okumak oldukça zor (metnin duvarı). Sakıncası var düzenleyebilir daha iyi bir şekle ing?
tatarcık

2
Ciddi anlamda? Okumak zor olduğu için insanlar toplu halde oy kullandılar mı? Neden düzenlemeyi seçmiyorsunuz? İçeriğin sorunlu olduğu gibi değil.
l46kok

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.