PDA

View Full Version : سوال: مشکل در پیاده سازی بازگشتی الگوریتم FloodFill4



13601360
سه شنبه 27 مهر 1389, 10:25 صبح
سلام به همه دوستان
من برای پرکردن سطوع تصویر از رنگ دلخواه از الگوریتم FloodFill4 استفاده می کنم
این پیاده سازی من هست



void floodFill4(Bitmap bmp, int x, int y, Color fillColor, Color interiorColor)
{

if ((x < 0) || (x >= bmp.Width)) return;

if ((y < 0) || (y >= bmp.Height)) return;

if (bmp.GetPixel(x, y) == interiorColor)
{
bmp.SetPixel(x, y, fillColor);
floodFill4(bmp, x + 1, y, fillColor, interiorColor);
floodFill4(bmp, x - 1, y, fillColor, interiorColor);
floodFill4(bmp, x, y + 1, fillColor, interiorColor);
floodFill4(bmp, x, y - 1, fillColor, interiorColor);
}

this.Invalidate();

}


ولی مشکل اینکه اصلی کار نمی کنه
انگار اصلا دستور if هیچ وقت true نمیشه ، حتی متغییر interiorColor رو حذف کردم و مساوی رنگ مورد نظر گذاشتم ولی نشد
کسی از دوستان پیاده سازی درستی از این الگوریتم به صورت بازگشتی داره
ممنون میشم

water_lily_2012
سه شنبه 27 مهر 1389, 17:54 عصر
به این صورت بنویس ببین کار میده.

Color pixelColor = myBitmap.GetPixel(i, 0);
if (pixelColor == Color.White)

13601360
سه شنبه 27 مهر 1389, 21:41 عصر
ممنون دوست عزیز
قبلا این کار رو انجام دادم، ولی مشکل حل نشد
یکی از دوستان گفت باید از Bitmap.LockBits استفاده کنم
ولی نشد

13601360
پنج شنبه 29 مهر 1389, 11:57 صبح
دوستان مشکلم حل شد


public void floodFill4(Bitmap bmp, int x, int y, Color fillColor, Color interiorColor)
{
if ((x < 0) || (x >= bmp.Width)) return;
if ((y < 0) || (y >= bmp.Height)) return;
if (bmp.GetPixel(x, y).ToArgb() == interiorColor.ToArgb())
{
bmp.SetPixel(x, y, fillColor);
floodFill4(bmp, x, y + 1, fillColor, interiorColor);
floodFill4(bmp, x + 1, y, fillColor, interiorColor);
floodFill4(bmp, x - 1, y, fillColor, interiorColor);
floodFill4(bmp, x, y - 1, fillColor, interiorColor);
}
}

فقط نمی دونم چرا خطای

An unhandled exception o
f type 'System.StackOverflowException' occurred in System.Windows.Forms.dll
میده
برای رفعش چیکار کنم

cardano7
جمعه 30 مهر 1389, 05:54 صبح
دوستان مشکلم حل شد

فقط نمی دونم چرا خطای

An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll
میده
برای رفعش چیکار کنم

دلیلش کاملا روشنه.
حلقه داه توی لوپ میفته.

13601360
جمعه 30 مهر 1389, 09:30 صبح
من که تو برنامه خودم حلقه ندارم
خطا از این پیاده سازی بازگشتی هست به غیر بازگشتی با صف و پشته این الگوریتم رو پیاده سازی می کنن ولی من می خوام مشکل همین روش رو حل کنم
جالا این پیاده سازی من با 4 فراخوانی هست نوع دیگرش ، تابع 8 بار خودش رو فراخوانی می کنه (floodFill8)
خطا سرریز که مسلما به خاطر همون 4 فراوانی هست
برای رفعش شما راه حل بدبد
اینجا رو هم ببینید

http://en.wikipedia.org/wiki/Flood_fill

cardano7
جمعه 30 مهر 1389, 20:54 عصر
درست میگید
یک راه سراغ دارم که ساده ترین راه هست ولی لازم هست که امتحان بشه تا بشه صحتش رو تایید کرد. به نظر من بهتره که یک لیست از نقاط را درست کنی و هر نقطه را که پر کردی، چهار نقطه ی اطراف اون را در صورت واجد شرایط بودن در لیست قرار بدی(البته به شرط تکراری نبودن. این شرط برای توی لوپ نیفتادن لازمه). بعد بری ببینی که در لیست چه نقاطی قرار دارند و باید ترتیب اثر داده بشند.
البته سرعت این روش رو خدا می دونه!

13601360
دوشنبه 10 آبان 1389, 12:24 عصر
دوستان مشکلم حل شد


public void floodFill4(Bitmap bmp, int x, int y, Color fillColor, Color interiorColor)
{
if ((x < 0) || (x >= bmp.Width)) return;
if ((y < 0) || (y >= bmp.Height)) return;
if (bmp.GetPixel(x, y).ToArgb() == interiorColor.ToArgb())
{
bmp.SetPixel(x, y, fillColor);
floodFill4(bmp, x, y + 1, fillColor, interiorColor);
floodFill4(bmp, x + 1, y, fillColor, interiorColor);
floodFill4(bmp, x - 1, y, fillColor, interiorColor);
floodFill4(bmp, x, y - 1, fillColor, interiorColor);
}
}

فقط نمی دونم چرا خطای

An unhandled exception o
f type 'System.StackOverflowException' occurred in System.Windows.Forms.dll
میده
برای رفعش چیکار کنم

دوستان برای حل این مشکل راه حلی ندارن :افسرده:

13601360
سه شنبه 25 آبان 1389, 10:02 صبح
دوستان برای حل این مشکل راه حلی ندارن :افسرده:

جالبه وقتی یکی از بازگشتی ها رو حذف می کنم ، کار میکنه :متفکر:
دوستان من هنوز در انتظار یک پاسخ هستم چرا این پیاده سازی مشکل داره :عصبانی++: