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

خوارزميات التعبئة(التلوين) .. Filling Algorithms .

بدأه Abdullah.Alshammeri في 2 ديسمبر 2009 · 13 رد · 7,427 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الهدف من المقال :

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

post-42837-12597169853289_thumb.png

post-42837-12597170223318_thumb.png

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

خوارزمية Fill Flood :

Recursive_Flood_Fill_4_%28aka%29.gif

صورة من الويكي.

تعتمد الخوارزمية على فكرة بسيطة ، وهي التعبئة باستخدام مفهوم الفيضان Flood ، ببساطة ، تلوين بكسل معين ، ثم الانتقال إلى كل بكسل مجاور له ، وهنا لدينا طريقتين في توضيع مفهوم التجاور ، اما باستخدام مفهوم 4-connected أو 8-connected .

4-connected : عملية تلوين أربع بكسلات مجاورة للبكسل الحالي ان امكن وفق الجهات التالية :

left - right - top - bottom ( طبعا بدون ترتيب ) .

صورة توضيحية :

post-42837-12597182360952_thumb.png

8-connected : عملية تلوين ثمان بكسلات مجاورة للبكسل الحالي ان امكن وفق الجهات التالية :

left - right - top - bottom - upper left - upper right - lower left - lower right

صورة توضيحية :

post-42837-12597182368889_thumb.png

الخوارزمية :

خوارزمية Flood Filling هي كالتالي :

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

floodFill(x + 1 , y , oldColor,newColor); // right

floodFill(x , y + 1 , oldColor,newColor); // top

floodFill(x , y - 1 , oldColor,newColor); // bottom


}


}

سيناريو :

لنفرض أن لدينا الصورة التالية :

post-42837-12597184412401_thumb.png

ونريد تلوين بكسل معين وفق المعلومات التالية :

1- البكسل الذي سننطلق منه هو البكسل الذي سيختاره المستخدم بالنقر عليه بالفأرة مثلاً ، ونسمية البذرة seed .

2- لون البكسل البذرة هو اللون الأبيض .

3- اللون الجديد هو اللون الذي سيختاره المستخدم وليكن الأخضر .

4- الخوارزمية تعمل بنسخة 4-connected .

5- الخوارزمية ستتوقف اذا وصلت الى بكسل لايحمل اللون الأبيض .

وفق المعلومات السابقة ، ستبدو البكسلات بهذا الشكل :

post-42837-12597190152295_thumb.png

والذي حدث هو التالي :

بدأت الخوارزمية بالبكسل رقم 1 ( البذرة ) ، وجدت أن لونه هو لون أبيض ، وبالتالي صار اللون الذي يجب تغييره في المراحل القادمة هو اللون الأبيض ، لونت البكسل باللون الاخضر ، اللون الجديد ، الان في البكسل 2 ، لكن لاحظ أن البسكل رقم 1 ، لم يفحص كل الجهات ، حيث تبقى البكسل العلوي + الأيمن + الأسفل .

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

الان من البكسل رقم 3 ، ستعيد تطبيق نفسها ، الى اليسار ، ثم الاعلى وكلاهما لايحملان اللون الابيض ، ثم الى اليمين ، لتلونه باللون الاخضر وتنتقل الى البكسل رقم 4 ، لاحظ أنه بقي الجهة السفلى سنرجه لها لاحقا .

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

تعود الى البكسل السابق - رقم 3 - ..تجد أن اخر جهة لم تفحصها هي الجهة السفلى .. وبعد فحصها تجد أن اللون ليس أبيض .

تعود للبكسل رقم 2 ، وتجد أن جميع الجهات تم فحصها .

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

البكسل 5 : لايوجد يساره بكسل أبيض ، ثم الى الاعلى تجد بكسل أبيض ذو رقم 6 ، تلونه بالاخضر تنتقل اليه ( بقي الجهة اليمنى والسفلى ستعود لها ) .

البسكل 6 : بعد فحص جميع الجهات لاتجد بكسل أبيض اللون .

تعود إلى البكسل 5 : بعد فحص الجهات المتبقية ، لاتجد شيء .

تعود للبكسل 1 : بعد فحص جميع الجهات لاتجد بكسل أبيض اللون .

تنتهي الخوارزمية .

محاكاة الخوارزمية - تطبيق :

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

قمت بكتابة برنامج يحاكي هذه الخوارزمية البسيطة ، حيث يمكنك تصميم الصورة التي تريد ، باللون الذي تريد من القائمة المنبثقة عند النقر على الزر الايمن ، ثم اذا انتهيت تختار الخيار Test Mode ، لتجرب الخوارزمية بشكل مرئي ، طبعا تختار البكسل البذرة الذي ستنطلق منه بالنقر عليه ، بعد اختيار اللون الذي تريد .

البرنامج بسيط وسهل ، وهو لتفهم الخوارزمية فقط ، وليس لشيء اخر ، حيث الكود لايفيدك بشيء .

post-42837-12597205077855_thumb.png

كتابة الكود بسيط :

لكتابة الكود يمكن استخدام مبدأ Recursion أو Stack أو اي طريقة أخرى مناسبة ، في المرفقات مثال على هذه الخوارزمية ، المثال مكتوب بلغة السي بلس وباستخدام OpenGL/GLUT .

في المرفقات المثال - أرجو تحميل الملف الموجود باسم new and simple حيث هو أفضل من الملف القديم ، انظر للمشاركة رقم 12 لتعرف السبب

الخوارزمية التالية ستكون Boundary Fill ان شاء الله .

يتبع ...

FloodFill.zip

Flood Fill Example.zip

Boundary Flood Example __ new and simple.zip

تم تعديل هذه المشاركة بواسطة الشمري في 10 ديسمبر 2009 في 06:58

6

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

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

بشوق للقادم

رعاك الله و جعل جنان الخلد مثواك

#3

شكرا جزيلا لك موضوع جدا مفيد

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#4

بالانتظار رعاك الله

#5

شرح رائع والخوارزميه بسيطه ومفيده :)

ياريت بما إنك في موضوع الرسوميات تكمل شرح أدوات في الفوتوشوف مثل البلور كيف يتم وماهي الخوارزميه الخاصه به وعمل negative وغيرها من الأمور

إذا كانت هاي الأمور موجوده في القسم فماتواخذوني :) دوبي لقيت هيك مواضيع فتحمست

جزاك الله خير

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#6

حياكم الله يا أخوان ، ( تم رفع المثال البسيط الخاص بالخوارزمية السابقة Flood Fill - في المشاركة الاولى )

اقتباس
ياريت بما إنك في موضوع الرسوميات تكمل شرح أدوات في الفوتوشوف مثل البلور كيف يتم وماهي الخوارزميه الخاصه به وعمل negative وغيرها من الأمور

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

الخوارزمية الثانية : Boundary Fill

ملاحظة : ما سأكتبه ، دوّنته على عجل ودون مراجعة المراجع ببشكل جيد ، انما بما أعرفه واذكره من قراءات قديمة ، سأعيد تحرير المشاركة لاحقاً ان شاء الله ، للتوضيح بشكل أفضل .

الخوارزمية بسيطة
، وهي شبيهة بالخوارزمية Flood Fill ، وبالتالي ينبغي أن تفهم الخوارزمية السابقة قبل أن تدرس هذه الخوارزمية . الفكرة من هذه الخوارزمية هي تلوين مجموعة بكسلات حتى الوصول الى حد معين ، فمثلاً في الصورة التالية :

post-42837-12598247411592_thumb.png

الحد هو اللون الأسود ، بالتالي اذا نقرت على أي بيكسل فستقوم الخوارزمية بتلوين كل البكسلات الواقعة داخل الحدود السوداء ، ( اذا نقرت على احد المربعات البيضاء أو المربع الاحمر ) ، بالتالي لو قلت :

اصبغ أي بيسكل يقع داخل الحد الاسود باللون الازرق ، فالنتيجة :

post-42837-12598247417733_thumb.png

بسيطة ؟

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

post-42837-12598253350957_thumb.png

أي باختصار : الخوارزمية ستفشل اذا كان new color == boundary color

الخوارزمية :

void boundaryFill(int x,int y,int borderColor,int newColor)

{

// Do not move outside image dimension ( our image is array/vector )

if(x<0 || x>= IMAGE_WIDTH || y<0 || y >= IMAGE_HEIGHT)

return ;



if(getPixel(x,y) != borderColor && getPixel(x,y)!= newColor)

{

setPixel(x,y,newColor);

boundaryFill(x - 1 , y , borderColor,newColor); // left

boundaryFill(x + 1 , y , borderColor,newColor); // right

boundaryFill(x , y + 1 , borderColor,newColor); // top

boundaryFill(x , y - 1 , borderColor,newColor); // bottom


}

}

التطبيق بالمرفقات .

Boundary Flood Example.zip

تم تعديل هذه المشاركة بواسطة الشمري في 3 ديسمبر 2009 في 10:48

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

رائع بارك الله فيك

قرأت أن الأفضل من تلك الخوارزميتين

هي تعبئة البكسلات التي تقع على scan line

اذا ممكن توضيح الفكرة

ولي عودة بإذن الله

#8

نعم ، لكن لاأعرف هل scan line هي أفضل الخوارزميات ، لكن هي أفضل من الخوارزميتين السابقتين عموماً ،

درست هذه الخوارزمية تحت اسم اخر ، باسم runs of pixels ، أعتقد هي نفسها scan line ،

لم أعمل تجربة " كود " لهذه الخوارزمية ، من قبل ، فقط دراسة نظرية ، حيث أنها ليست بالمعقدة " نظرياً على الاقل " ،

ممكن أكتب عنها ، ان لم يتبرع أحد ويقوم بالمهمة :-) .

تم تعديل هذه المشاركة بواسطة الشمري في 3 ديسمبر 2009 في 20:15

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#9

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

حاولت فهم الكود و التجربه اكثر من مره و لكن يوجد بعض الاشياء اتمنى توضيحها حيث اني مبتدئة في الرسم بالحاسب

اتمنى التوضيح لي عاجلا رعاك الله

أرفقت البرنامج و و بداخله كتبت استفساراتي boundary-fill.rar

هل SEED ALGORITHM يطلق فقط على FLOOD FILL

قرأت انها تطلق فقط على FLOOD

و البعض يعتبر ان BOUNDARY و FLOOD يطلق عليهم SEED ALGORITHM

-----------

وكان لدي ملاحظة هنا

كنت أنت تبدأ اللوب من قيم Y و لكني وجدتها تطبع قيمة مختلفة لمكان المربع الاسود الداخلي

فعدلته بالبدء من X

void display()

{

//glClearColor(0.8,0.8,0.8,1);

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();

//glTranslatef(0,0,0);

drawImage();

// debug

for(int x=0;x<CELL_NUMBER;x++)

{

for(int y=0;y<CELL_NUMBER;y++)

{

cout << image[x][y] <<" ";

}

cout << endl;

}

cout << endl;

glutSwapBuffers();

}

تم تعديل هذه المشاركة بواسطة المشتاقة للرحمن في 4 ديسمبر 2009 في 17:51

#10

@ بالنسبة للسؤال : هل تعتبر boundary fill هي seed algorithm ، سؤال أكاديمي لا أعرف له جواب ، لكن واضح أن boundary fill هي قريبة من flood fill حيث كلاهما يبدآن من seed معيّن ( بذرة ) ، ولكن الفرق بينهما هو شرط التوقف فقط .

@ شكراً على التصحيح ( حيث كتبته على عجل ، لكن المهم أن التطبيق يعمل ، بالنسبة لطباعة المصفوفة فهي غير مهمة وللتوضيح فقط ) .

الأسئلة في المرفقات كانت عن هذه الدوال :

void reshape(int w,int h)//شرح بسيط للدالة
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0,w,0,h);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

هذه من أساسيات OpenGL ، يتم استدعائها عند تغير حجم النافذة ( وعند انشاء النافذة) ، حيث نحدد ثلاثة أمور :

1- منفذ الرؤية ، View port ، أي أين سنرسم ، وقد طلبت أن أرسم على كامل النافذة ( من الزاوية اليسرى السفلية الى الزاوية العلوية اليمنى ) حيث w تعني عرض النافذة و h تعني طول النافذة .

2- نحدد مصفوفة الاسقاط عن طريق GL_PROJECTION ، بحيث أي تغييرات نجريها ستؤثر على مصفوفة الاسقاط ، المصفوفة التي أنشأتها هي مصفوفة اسقاط عمودية باستخدام gluOrtho2D ، حيث هذا النوع من الاسقاط يصلح للتطبيقات ثنائية البعد .

3- حددت مصفوفة MODELVIEW وبالتالي أي تغييرات نجريها ستؤثر على MODELVIEW ، وهي تؤثر على View ( أي الكاميرا ان صح التعبير ) و Model أي المجسم ، أنا جعلت المصفوفة ، مصفوفة وحدة ، وبالتالي سيدأ الرسم من الزاوية اليسرى السفلية ( صفر ، صفر ) ، وهي نقطة الأصل بالنسبة لـ OpenGL ، ويمكن تغيير هذه النقطة من خلال gluOrtho2D.

راجعوا قسم OpenGL للمزيد .

الدالة الثانية :

void drawImage()//لم افهم الدالة جيدا
{
	int width = (IMAGE_WIDTH/CELL_NUMBER);//العرض للبكسل تبع الحد؟
	int height= (IMAGE_HEIGHT/CELL_NUMBER);//الطول للبكسل تبع الحد؟
	int xPos = 0, yPos = IMAGE_HEIGHT- (height-CELL_NUMBER);//لماذا افترضنا هذه القيم؟؟


	for(int x=0;x<CELL_NUMBER;x++)
	{
		for(int y=0;y<CELL_NUMBER;y++)
		{
			if(getPixel(x,y)==BLACK)

				glColor3f(0,0,0);
			else if(getPixel(x,y)==WHITE)
				glColor3f(1,1,1);
			else if(getPixel(x,y)==RED)
				glColor3f(1,0,0);
			else
				glColor3f(0.1f,0.1f,0.7f);
// الغرض من اللوب 
			glRectf(xPos,yPos,xPos+width,yPos + height);//اتمنى تشرح هذه النقطة و التي تليها
			xPos+= width + 1;

		}
		xPos= 0;
		yPos-= (height + 1);
	}
}

الغرض منها طباعة المربعات ( البكسلات ) ،

حيث نعمل loop على مصفوفة ، وبما أن المصفوفة مصفوفة ثنائية ، عملت loop داخل loop ، للتسهيل فقط .

المتغيرات والثوابت هي كالتالي :

IMAGE_WIDTH : عرض النافذة == عرض الصورة ، أنا سميتها صورة فقط للتوضيح ، يعني ممكن تسميتها WINDOW_WIDTH ، ونفس الكلام ينطبق على IMAGE_HEIGHT

CELL_NUMBER : عدد المربعات في طل صف وعمود ، أنا جعلتها 10 مربعات .. يمكن تغييرها .

width : عرض كل مربع بالبكسل ، يمكن أن تختاري أي عرض ، لكن وحتى أملأ النافذة بالمربعات ولاتظهر فراغات ، عملت معادلة بسيطة :

بقسمة
عرض النافذة
على
عدد المربعات
= 400 ÷ 10 = 40 بكسل .

بالتالي نحتاج لرسم 10 مربعات ، كل مربع عرضه 40 بكسل والمجموع 400 بكسل ، أي أننا ملأنا النافذة مربعات .. وهذا مانريده :) .

height : نفس الكلام مع width ولكن هنا طول المربع ، وبما أن طول النافذة مثل عرضها ، وعدد المربعات العرضية مثل عدد المرعات الطولية ، فالنتيجة واحدة وهي 40 بكسل.

xPos: الحد الأيسر للمربع .

yPos : الحد السفلي للمربع .

بالتالي ، يتضح أن البرنامج يعتمد على الزاوية السفلية لتحديد نقطة بداية كل مربع ، وبما أن النقطة ( صفر ، صفر ) تقع في الزاوية اليسرى السفلية للنافذة في OpenGL -> بينما أنا أريد أن أبدأ من الزاوية العلوية اليسرى تقريبا ، أي المشكلة في yPos .

باختصار : OpenGL تعتبر الزاوية اليسرى السفلية هي نقطة الأصل ( يمكن تغيير ذلك ، لكن أنا لم أقوم بذلك .. لأني اعتدت على هذا ) ، بينما أنا أريد أن أبدأ من الزاوية اليسرى العلوية ، لسبب واحد ، هو أن يظهر تماما ماهو موجود بالمصفوفة ، بالترتيب .. بالنظر لهذه الصورة :

post-42837-12599627054574_thumb.png

أخيراً نعمل loop على المصفوفة ( حيث x يبدأ من صفر الى 9 ، اي عشر لفّات) ونفس الامر مع y ، وكل مرة نغير اللون بناء على قيمة كل عنصر من المصفوفة : أسود - أبيض - أحمر ، وهي مجرد ثوابت للتسهيل .

ونرسم المربع باستخدام glRect ، حيث أول بارمترين هما النقطة السلفية للمربع xPos,yPos ، والبارمترين الاخيرين طول وعرض المربع .

ثم في كل loop داخلي : أزيد xPos بقيمة تساوي عرض المربع + 1 وذلك حتى نرسم المربع المقبل على يمين المربع الحالي ويكون هناك فراغ بسيط بينهما .. بتغيير القيمة سيتضح الهدف.

ثم عندما ننتهي من كل صف ، أي ننتهي من اللوب الداخلي ، نبدأ سطر جديد yPos -= height + 1 ، و xPos=0 ، أي ننتقل الى السطر التالي ابتداء من أعلى النافذة .

بتغيير القيم سيتضح الهدف ، كما قلت .

void mouse(int b,int s,int x,int invY)//اريد شرح مبسط لداخل الداله
{

	if(b == GLUT_LEFT_BUTTON)
	{
		if(s == GLUT_DOWN)
		{
			int y = IMAGE_HEIGHT - invY;
			int X = min(ceil((float) x / (IMAGE_WIDTH/CELL_NUMBER) + 1),CELL_NUMBER+1);//مالغرض من تلك الدوال؟
			int Y = min(ceil((float) y / (IMAGE_HEIGHT/CELL_NUMBER) + 1),CELL_NUMBER+1);

			Y-=2;//why?
			X-=2;//WHY?
			if(X<0 || X> CELL_NUMBER || Y<0 || Y > CELL_NUMBER)
				return ;

			boundaryFill(X,CELL_NUMBER-1-Y,BLACK,BLUE);	//CELL_NUMBER-1-Yلماذا
		}
	}
	glutPostRedisplay();// هل تعيد العرض؟

}

- هنا نصطاد نقرة الفأرة ، فاذا نقر بالزر الايسر ، نحاول أن نكتشف أين حدثت النقرة ، على أي مربع .

وحيث أننا نعلم مكان النقرة من خلال x و yInv ،

طبعا يجب ملاحظة أن نظام ويندوز يعتبر نقطة الاصل هي النقطة العلوية اليسرى للنافذة وهذا عكس OpenGL ، لذلك وحتى يتوافق الامر مع OpenGL نكتب التالي :

			int y = IMAGE_HEIGHT - invY;

- الامر الاخر ، كيف نعرف أن المستخدم نقر على المربع الثاني العلوي مثلا /

الحل :

نحن نعرف موقع الماوس .. اين نقر ..

فنطبق عليه المعادلة :

int X = min(ceil((float) x / (IMAGE_WIDTH/CELL_NUMBER) + 1),CELL_NUMBER+1);

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

حيث يمكن أن نبسطها هكذا :

int X = x / (IMAGE_WIDTH/CELL_NUMBER) + 1;

الان نعود الى مثالنا ..

// اذا نقر على البيكسل ذو الاحداثي
// x = 120 , y = 240
myX = 120/ ( 400 / 10 ) = 120/40 = 3;
myY = 240/ ( 400/ 10 ) = 240/40 = 6;
// الان .. نعرف أي عنصر من المصفوفة تم اختياره
// وهو العنصر التالي :
// image[myX][myY] = image[3][6] = 1
// الان نستدعي الخوارزمية لتبدا من هذا العنصر كبذرة

بالنسبة للدالة glutPostRedisplay فهي لتحديث الرسم .. لو تم ازالتها لن تحدث النافذة الا اذا تم تحريكها فوق نافذة اخرى مثلا ..

يمكن استبدال glutPostRedisplay باستدعاء دالة الرسم مباشرة display ..

أتمنى أن الامور واضحة الان .

الحمدلله .

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#11

رعاك الله و وفقك

جربت ارسل قيمة Y

بدون boundaryFill(X,CELL_NUMBER-1-Y,BLACK,BLUE); //CELL_NUMBER-1-

لكن الداله لم تلون

فرج الله عنك رفع قدرك و منزلتك في عليين على هذه المساعدة الطيبة

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

#12

سأقول شيء للفائدة :

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

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

نعود :

سبب كل هذه المعادلات التي رأيتي ، هي مشكلة واحدة غبية ، كنت أحاول أن أتمسك بها .. وهي :

في OpenGL : نقطة الاصل في الزاوية اليسرى السفلية .

في Windows : نقطة الأصل في الزاوية اليسرى العلوية .

ولذلك رأيتي تلك المعادلات ووجع الرأس ..

الان قمت بتحويل نظام الاحداثيات في OpenGL الى النظام التقليدي في الويندوز :

//سابقا
	gluOrtho2D(0,w,0,h);
// الان
	gluOrtho2D(0,w,h,0);

وبسبب هذا التغيير البسيط .. لن يرا أحد أي معادلة أو وجع رأس .. اختفى كل شيء :) .

لا أعرف لماذا أحب أن أتفلسف حياناً .

المعذرة على الصداع الذي سببته :D .

في المرفقات نسخة جديدة ، سأحدث المشاركات السابقة أيضاً .. ان شاء الله .

Boundary Flood Example.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#13

الآن أصبخت المسألة جدا يسيرة

smile.gif

سدد الله خطاك

لدي استفسار بسيط بعض الاكواد تبدأ التلوين من اليسار و بعضها من اليمين

اعتقد جميعا تؤدي الى روما ولكن ترتيب التلوين للبكسلات يختلف

فما هو الأفضل نبدا من اليسار او اليمين؟؟

#14

لايوجد فرق كما أعرف

بالتوفيق ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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