السلام عليكم و رحمة الله و بركاته
ارجو منكم مساعدتي في توضيح طريقة flood fil algorithm
لو شرح بسيط بالعربي قرأت ولكن لم تتضح الفكرة لدي جيدا
كما اتمنى معرفو مساوئها و مساوئ boundary fill algorithm
ارجوكم بأسرع وقت وفقكم الله
السلام عليكم و رحمة الله و بركاته
ارجو منكم مساعدتي في توضيح طريقة flood fil algorithm
لو شرح بسيط بالعربي قرأت ولكن لم تتضح الفكرة لدي جيدا
كما اتمنى معرفو مساوئها و مساوئ boundary fill algorithm
ارجوكم بأسرع وقت وفقكم الله
وعليكم السلام ورحمة الله وبركاته .
الخوارزمية لتعبئة مجموعة بكسلات متصلة ..
حيث أنه وبمجرد اختيار بكسل معين ذو لون أزرق مثلاً .. تبحث الخوارزمية عن كل بكسل مجاور لهذا البكسل ( يمين - يسار - فوق - تحت ) .
اذا وجدت اللون المجاور ذو لون أزرق .. فانها تغير لونه الى لون اخر مثل الاحمر .. ثم تطبق عليه الخوارزمية مرة أخرى .
هذه الصورة من الويكي :

الخوارزمية سهلة وبسيطة وتعتمد اما على 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
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
بارك الله فيك على الافادة و اجزل لك المثوبة
و هذا يعني اني عند استخدام طريقة flood filf
ربما تظل بعض المساحات غير ملونه يعني التلوين لايعتبر دقيق
لأنه اذا كانت النقاط المجاورة نفس اللون للنقطة الحالية سيتجاهل تلوينها
صحيح؟؟
وكيف يتم تلوين بهذه الطريقة اذا كانت المساحة تشمل اكثر من لون؟؟
اتمنى ان تضرب لي مثال على boundary و flood
حين استخدامي للفوتوشوب حتى اوضحه لأني اريد معلومات اضافية لعمل عرض بوربوينت
ارجو ان تساعدني
وشكرا لك
flood fill تملأ جميع البكسلات المتصلة والتي لها نفس اللون .. وتقوم بذلك بنجاح .
boundary fill حسب ما أذكر ( لست متأكد تماماً ) ، تملأ منطقة معينة يحددها المستخدم .. ممكن تحوي هذه المنطقة على بكسلات ذات ألوان متعددة ، المهم أنه يملأ المنطقة المحددة بلون معين .
سأضيف موضوع عن خوارزميات flood التي أعرفها ، ان شاء الله خلال اليومين القادمين .
المشكلة أن هذا الموضوع ناسيه بصراحة .. ولكن أذكر أنه سهل ، باستثناء خوارزمية واحدة كانت صعبة قليلاُ .
عملت الليلة برنامج تعليمي عن flood fill ولكن يحتاج مزيد من التنقيح سأضيفه لاحقا بحول الله .
ترقبونا :dry:
تم تعديل هذه المشاركة بواسطة الشمري في 26 نوفمبر 2009 في 00:40
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
جزاك الله خيرا