อัลกอริทึม "bucket-fill" ที่ดีที่สุดคืออะไร?


16

ฉันค่อนข้างใหม่กับการประมวลผลภาพและตอนนี้ฉันกำลังทำงานกับแอพพลิเคชั่นที่คล้ายสีที่จะมีการเติมเต็มถัง อย่างไรก็ตามฉันไม่ทราบว่าอัลกอริทึมที่ดีที่สุดสำหรับที่เก็บข้อมูลเติมคืออะไร

ฉันนำตัวอย่างที่ฉันพบจากไซต์นี้มาใช้ แต่พบปัญหาลูปไม่สิ้นสุดเมื่อผู้ใช้พยายามที่จะทำการเติมพื้นที่ที่เต็มถังแล้วด้วยสีเดียวกัน

ขณะนี้ฉันกำลังแก้ไขปัญหาโดยการเติมซ้ายขวาขึ้นและลง; อย่างไรก็ตามฉันทำเพื่อที่ว่าเมื่อพิกเซลได้รับการกรอกในด้านซ้ายก็ไม่สามารถเติมไปทางขวาซึ่งหมายถึงรูปร่างเช่น:

ตัวอย่าง

จะไม่ถูกกรอกอย่างถูกต้องหากมีการใช้เครื่องมือฝากข้อมูลที่จุดสีแดง

ดังนั้นฉันหวังว่าจะมีบางคนรู้อัลกอริทึมหรือลิงค์ไปยังที่จะแก้ไขปัญหาเหล่านี้ทั้งหมด

ข้อมูลเพิ่มเติม:สิ่งนี้จะดำเนินการโดยใช้ Javascript เป็นเครื่องมือทาสี มันจะถูกใช้ออนไลน์โดยใช้องค์ประกอบ Canvas


เป็นเวกเตอร์หรือบิตแมปนี้หรือไม่ ฉันสมมติบิตแมปจากภาพ แต่เพียงการทำให้แน่ใจว่า ..
Demian เบรชต์

1
ฉันคิดว่าคุณใช้งานบางอย่างไม่ถูกต้อง ฉันอ่านเอกสารและตามตัวอย่างของภาพสิ่งนี้ควรเติมภาพเหมือนภาพด้านบน คุณคัดลอกและวางรหัสของเขาหรือคุณเขียนใหม่หรือไม่
RLH

คิดว่าการสำรวจกราฟ
Bwmat

@RLH: ฉันคัดลอกและวางรหัสของเขาด้วยการเปลี่ยนแปลงเล็กน้อยเพื่อให้มันทำงานกับการตั้งค่าของฉัน
Ivan

@Ivan: อย่าเริ่มค้นหา algo ใหม่ก่อนที่คุณจะแก้ปัญหา "infinite loop" ของคุณ หากไม่สามารถแก้ไขได้สำหรับการใช้งานที่มีอยู่คุณจะพบปัญหามากขึ้นเมื่อคุณจะเขียนสิ่งใหม่ทั้งหมดตั้งแต่ต้น
Doc Brown

คำตอบ:


21

ดูเหมือนว่าคุณกำลังมองหาสิ่งที่เรียกว่าอัลกอริธึมเติมน้ำท่วม นั่นอาจเป็นเหตุผลว่าทำไมคุณไม่พบตัวอย่างมากมาย มีหลายวิธีเติมน้ำท่วมจดทะเบียนในเป็นหน้าวิกิพีเดียอัลกอริทึม ฉันขอแนะนำวิธีการ 'รอคิว' ที่ไม่ใช่แบบเรียกซ้ำ


I highly recommend one of the non-recursive, 'queued' methods.- คุณช่วยอธิบายได้ไหม
Elfayer

1
@Elfayer ทุกครั้งที่ฟังก์ชั่นถูกเรียก (พูดว่า "X ()" มีการเรียกไปที่ "Y ()") พารามิเตอร์และตำแหน่งหน่วยความจำจากฟังก์ชั่นเริ่มต้น ("X ()") จะถูกเก็บไว้ในสแต็ค ดังนั้นหากคุณเติมพื้นที่ขนาดใหญ่และซับซ้อนแล้วจะมีการเรียกใช้ฟังก์ชันแบบเรียกซ้ำจำนวนมาก ขึ้นอยู่กับคอมไพเลอร์และภาษาของคุณสิ่งนี้สามารถนำไปสู่การโอเวอร์โฟลว์สแต็กหรือการใช้หน่วยความจำมากเกินไป
boxcartenant

-1

ฉันกำลังทำสิ่งเดียวกัน อย่างไรก็ตามเมื่อฉันพบปัญหาที่คุณชี้ให้เห็นฉันเลือกที่จะจบฟังก์ชั่นถ้าเครื่องมือถูกคลิกไปที่พื้นที่ที่มีสีเดียวกันกับที่คุณพยายามทาสี (นี่ก็ดูเหมือนว่าจะเป็นพฤติกรรมของ ms-paint) .

วิธีการเข้าคิวควรใช้งานง่ายมากสำหรับทุกคนที่มีประสบการณ์การเขียนโปรแกรม

หากการทาสีบริเวณรอบ ๆ จุดที่มีสีเดียวกันกับสีของคุณนั้นเป็นเรื่องที่น่ากังวลคุณสามารถ:

  • ตรวจสอบสีพื้นหลัง
  • ค้นหาขอบของจุดสีเดียวกับที่คุณคลิก
  • จัดคิวจุดที่อยู่รอบ ๆ จุด
  • ดำเนินการกับการเรียกใช้งานปกติโดยใช้สิ่งนี้ (ในกรณีนี้) white-dot filled queue

ถ้าคุณต้องการคุณสามารถดูที่ (ค่อนข้าง embarrasing) รหัสของฉัน ที่นี่

มันไกลจากความรวดเร็ว แต่ใช้งานได้ดี ...


ทำไมต้องลงคะแนน? :( ฉันรู้ว่าวิธีการนี้ไม่ได้ "เร็ว" โดยเฉพาะ แต่ใช้งานได้และยังใช้วิธีแก้ปัญหาที่เสนอ :(
Juan Pablo Alvarez Alfaro

1
โพสต์นี้ค่อนข้างอ่านยาก (ผนังข้อความ) คุณจะช่วยแก้ไขมันให้เป็นรูปร่างที่ดีขึ้นได้ไหม
ริ้น

2
อย่างจริงจัง? ผู้คนจำนวนมากลงคะแนนให้ฟังเพราะอ่านยาก? ทำไมไม่เลือกที่จะแก้ไข? ไม่เหมือนเนื้อหามีปัญหา
l46kok

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.