الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استفسار حول flood fill & boundary fill

بدأه المشتاقة للرحمن في 25 نوفمبر 2009 · 4 رد · 3,208 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

ارجو منكم مساعدتي في توضيح طريقة flood fil algorithm

لو شرح بسيط بالعربي قرأت ولكن لم تتضح الفكرة لدي جيدا

كما اتمنى معرفو مساوئها و مساوئ boundary fill algorithm

ارجوكم بأسرع وقت وفقكم الله

#2

وعليكم السلام ورحمة الله وبركاته .

الخوارزمية لتعبئة مجموعة بكسلات متصلة ..

حيث أنه وبمجرد اختيار بكسل معين ذو لون أزرق مثلاً .. تبحث الخوارزمية عن كل بكسل مجاور لهذا البكسل ( يمين - يسار - فوق - تحت ) .

اذا وجدت اللون المجاور ذو لون أزرق .. فانها تغير لونه الى لون اخر مثل الاحمر .. ثم تطبق عليه الخوارزمية مرة أخرى .

هذه الصورة من الويكي :

Recursive_Flood_Fill_4_%28aka%29.gif

الخوارزمية سهلة وبسيطة وتعتمد اما على recursion أو stack ( في الاخير recursion هو stack ! ) .

هذه خوارزمية أراها سهلة وواضحة ، بشرط أن يكون لدى القارئ خلفية عن recursion ، يمكن تحويلها الى stack لو كان هناك سوء تفاهم مع مبدأ recursion

void floodFill(int x,int y,int oldColor,int newColor)
{
	// 4-connected version ( left right top bottom )
	// you can apply another version such as :
	// 8-connected version ( left , left-top , right ,top, right-top , bottom , right-bottom , left-bottom )
	if( getPixelColor(x,y) == oldColor)// هل البكسل الحالي هو البكسل المطلوب تغييره
	{
		setPixelColor(x,y,newColor); // غير لونه
		// الان .. انتقل الى البكسلات المجاورة لتطبيق نفس الفكرة
		floodFill(x - 1 , y  , oldColor,newColor); // left pixel
		floodFill(x + 1 , y  , oldColor,newColor); // right pixel
		floodFill(x  , y + 1 , oldColor,newColor); // top pixel
		floodFill(x  , y - 1 , oldColor,newColor); // bottom pixel

	}

}

هناك الكثير من الأمور التي يجب أن نحقنها في الخوارزمية حتى تكون صالحة ، مثل حدود التعبئة .. يعني حدود الصورة ، أضف الى ذلك مسألة سرعة الخوارزمية .

حيث الخوارزمية مكلفة جداً ، حيث سيكبر stack بشكل واضح بالاضافة الى تكلفة في عملية الاختبار testing

فمثلا :

نختبر البيكسل A

ثم نتوجه الى اليسار .. لنختبر البكسل B

الذي بدوره سيختبر A مرة أخرى ويجدها مختلفة اللون فيتجالها حتى يصل الى البكسل C

البكسل C سيختبر البكسلات المجاورة بما فيها البكسل B الذي اختبرناه قبل قليل

هل العيب واضح الان ؟

لتسريع الخوارزمية قليلاً ، يمكن وضع حدود ، ذات لون معين .. بحيث لو وصلنا الى بكسل بلون رمادي مثلاُ ، فندرك أننا تجاوزنا الحدود فنتوقف ، وهذا ما نسميه boundary fill algorithm

لكن حتى هذه فيها عيب وهو :

اذا كان لون الحد

boundary color

مطابق للـ

newColor

فستفشل الخوارزمية ..

الحل لهذه المشكلة من وجهة نظري المتواضعة ، هو أن نستخدم حدود ليست بألوان . . انما حدود رياضية ( مثل اذا تجاوز الخط الفلاني فتوقف ) ،

أو أن نستخدم خوارزمية أخرى مختلفة تماما مثل Coherence

هل الأمور واضحة الان ؟

ستتضح أكثر مع البرمجة ،

يمكن استخدام OpenGL للاستيعاب بشكل أكبر .. بعمل تتبع للخوارزمية ستتضح الامور ان شاء الله

تم تعديل هذه المشاركة بواسطة الشمري في 25 نوفمبر 2009 في 04:41

2

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

بارك الله فيك على الافادة و اجزل لك المثوبة

و هذا يعني اني عند استخدام طريقة flood filf

ربما تظل بعض المساحات غير ملونه يعني التلوين لايعتبر دقيق

لأنه اذا كانت النقاط المجاورة نفس اللون للنقطة الحالية سيتجاهل تلوينها

صحيح؟؟

وكيف يتم تلوين بهذه الطريقة اذا كانت المساحة تشمل اكثر من لون؟؟

اتمنى ان تضرب لي مثال على boundary و flood

حين استخدامي للفوتوشوب حتى اوضحه لأني اريد معلومات اضافية لعمل عرض بوربوينت

ارجو ان تساعدني

وشكرا لك

#4

flood fill تملأ جميع البكسلات المتصلة والتي لها نفس اللون .. وتقوم بذلك بنجاح .

boundary fill حسب ما أذكر ( لست متأكد تماماً ) ، تملأ منطقة معينة يحددها المستخدم .. ممكن تحوي هذه المنطقة على بكسلات ذات ألوان متعددة ، المهم أنه يملأ المنطقة المحددة بلون معين .

سأضيف موضوع عن خوارزميات flood التي أعرفها ، ان شاء الله خلال اليومين القادمين .

المشكلة أن هذا الموضوع ناسيه بصراحة .. ولكن أذكر أنه سهل ، باستثناء خوارزمية واحدة كانت صعبة قليلاُ .

عملت الليلة برنامج تعليمي عن flood fill ولكن يحتاج مزيد من التنقيح سأضيفه لاحقا بحول الله .

ترقبونا :dry:

تم تعديل هذه المشاركة بواسطة الشمري في 26 نوفمبر 2009 في 00:40

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

جزاك الله خيرا

مواضيع مشابهة