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

Triangle Sierpinski Gasket- أرجو مراجعة الكود المكتوب لدي

بدأه lug في 4 ديسمبر 2008 · 8 رد · 1,797 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أنا عضو جديد في هذا المنتدى وقد عرفت أن هذا المنتدى من أفضل المواقع العربية التي تثرينا بالعلم، فأرجو منكم مساعدتي في هذه المشكلة

أنا طالب مبتدئ في ال OpenGL ، طلب مني كتابة برنامج ال

Triangle Sierpinski Gasket وتنفيذه وكتبت الكود لكن يوجد لدي خطأ وحيد لم أستطع معالجته فأرجو ممن لديه الخبرة مساعدتي كما أرجو منكم مراجعة الإحداثيات للرسم هل ستظهر بشكل صحيح أي هل ستظهر الرسمة كاملة أو سيظهر جزء معين منها فإذا كانت خاطئة أرجو تعديلها ولكم جزيل الشكر، طبعاً البرنامج مكتوب بال visual c++ ومكتوب داخل ال console win32وإليكم الكود:

#include "stdafx.h"

 #include "windows.h"

 #include "GL/glut.h"





 class GLintPoint

 {

 public: GLint x, y;

 };



 int random(int m) { return rand() % m; }



 void myInit(void)

 {

 glClearColor(9.0,7.0,8.0,0.0);

 glColor3f(5.0f,0.0f,0.0f);

 glPointSize(4.0);

 glMatrixMode(GL_PROJECTION);

 glLoadIdentity();

 gluOrtho2D(0.0,640.0,0.0,480.0);

 }



 void drawDot(GLint x, GLint y)

 {

 // draw dot at integer point (x, y)

 glBegin(GL_POINTS);

 glVertex2i(x, y);

 glEnd();

 }



 void Sierpinski(void)

 {

 GLintPoint T[3]= {{10,10},{300,30},{200, 300}};

 int index = random(3); // 0, 1, or 2 equally likely

 GLintPoint point = T[index]; // initial point

 drawDot(point.x, point.y); // draw initial point

 for(int i = 0; i < 1000; i++) // draw 1000 dots

 {

 index = random(3);

 point.x = (point.x + T[index].x) / 2;

 point.y = (point.y + T[index].y) / 2;

 drawDot(point.x,point.y);

 }



 glFlush();

 }









 void main(int argc,char**argv)

 {



 glutInit(&argc, argv); // initialize the toolkit

 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // set display mode

 glutInitWindowSize(640,480); // set window size

 glutInitWindowPosition(100, 150); // set window position on screen

 glutCreateWindow("Triangle Sierpinski Gasket "); // open the screen window

 glutDisplayFunc(Sierpinski); // register redraw function

 myInit();

 //Sierpinski();

 glutMainLoop(); // go into a perpetual Loop


 }

تم تعديل هذه المشاركة بواسطة الشمري في 4 ديسمبر 2008 في 16:00

#2

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

لا أعرف شيء عن الخوارزمية , ولكن قرأت عنها .

اقتباس
لكن يوجد لدي خطأ وحيد لم أستطع معالجته فأرجو ممن لديه الخبرة مساعدتي كما أرجو منكم مراجعة الإحداثيات للرسم هل ستظهر بشكل صحيح أي هل ستظهر الرسمة كاملة أو سيظهر جزء معين منها فإذا كانت خاطئة أرجو تعديلها ولكم جزيل الشكر

- ماهو الخطأ .

- يمكنك تنفيذ البرنامج .. وسترى النتيجة أمامك أخي الكريم ,

على العموم لاحظت أنك لا تقوم بمسح الBuffer قبل أن ترسم .

glClear(GL_BUFFER_BIT)

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

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

أولاً : أشكركم لتفاعلكم معي

ثانياً :الخطأ هوبالنص كالتالي:

j:\cg\triangle\triangle\triangle.cpp(13) : error C3861: 'rand': identifier not found

مافهمته أن rand غير معروفة لكني لا أدري كيف أقوم بتعريفها هل أضمن مثلاً مكتبة معينة تحوي هذه الدالة أم ماذا، كذلك لدي سؤال أين أضع الأمرالذي يقوم بمسح ال buffer هذا وأشكركم جزيل الشكر

#4

قمت بتنفيذ برنامجك , وهو يعمل .. ما شاء الله عليك ,

لكن فيه مشكلة .. اللي قلت لك عليها ..

عدل على الدالة .. زي كذا :

void Sierpinski(void)

{
glClear(GL_COLOR_BUFFER_BIT);
GLintPoint T[3]= {{10,10},{300,30},{200, 300}};

int index = random(3); // 0, 1, or 2 equally likely

GLintPoint point = T[index]; // initial point

drawDot(point.x, point.y); // draw initial point

for(int i = 0; i < 1000; i++) // draw 1000 dots

{

index = random(3);

point.x = (point.x + T[index].x) / 2;

point.y = (point.y + T[index].y) / 2;

drawDot(point.x,point.y);

}



glFlush();

}

بالنسبة للخطأ الخاص بالدالة rand .. فهو لأنك ما ربطت الملف الرأسي المطلوب , ضع هذه الاسطر في بداية برنامجك .

#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>

بالمناسبة , مافائدة هذه الخوارزمية ..Triangle Sierpinski Gasket (يعني فيم تستخدم) اذا كان لديك خلفية عنها ؟

تم تعديل هذه المشاركة بواسطة الشمري في 7 ديسمبر 2008 في 02:36

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

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

أولاً أهنئ الأخوة جميعا في منتدى الفريق العربي للبرمجة بمناسبة عيد الأضحى المبارك أعاده الله على الأمة الإسلامية بالخير والبركات وكل عام والجميع بخير

ثانيا أوجه الشكر الجزيل لمشرف المنتدى لتفاعله معي

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

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

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

j:\cg\triangle\triangle\triangle.cpp(17) : error C3861: 'rand': identifier not found

j:\cg\triangle\triangle\triangle.cpp(71) : error C2065: 'GL_BUFFER_BIT' : undeclared identifier

وعندما أضمن المكتبة (stdlib.h) ، تظهر لي الأخطاء التالية:

c:\program files\microsoft visual studio 8\vc\include\stdlib.h(406) : error C2381: 'exit' : redefinition; __declspec(noreturn) differs

c:\program files\microsoft visual studio 8\vc\platformsdk\include\gl\glut.h(146) : see declaration of 'exit'

j:\cg\triangle\triangle\triangle.cpp(71) : error C2065: 'GL_BUFFER_BIT' : undeclared identifier

فلا أعرف ماهو الخطأ هل هناك ملفات ناقصة عندي في البرنامج، فإن كانت لدي ملفات ناقصة تسببت في هذه الأخطاء أرجو إرسالها إن كانت لديك أو تدلني على موقع يوجد فيه جميع ملفات ال (open GL)

وأشكرك جزيل الشكر

#6

- الثابت 'GL_BUFFER_BIT' أخطأت في كتابته .. وصححت الخطأ في المشاركة التالية .. الكتابة الصحيحة هي :

void Sierpinski(void)

{
glClear(GL_COLOR_BUFFER_BIT);
GLintPoint T[3]= {{10,10},{300,30},{200, 300}};
.
.
.

- المشكلة الثانية هي تظهر عندي أيضا وحلها هو باستدعاء الملف windows.h في أول سطر ثم تستدعي الملفات الاخرى هكذا

#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>

اذا عملت هكذا ستختفي مشكلة exit التي تظهر

- اذا واجهت أي مشكلة ولم يعمل .. اذكر اسم المترجم compiler الذي تعمل عليه .. ورقم النسخة .. حتى نعطيك البرنامج بشكل كامل ..

لا أظن أنك تحتاج ملفات اضافية أو مكتبات

تم تعديل هذه المشاركة بواسطة الشمري في 11 ديسمبر 2008 في 19:58

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

السلام عليكم

بداية أأسف على إزعاجك لكني محتاج جدا لمعلوماتك القيمة

لقد عرفت معلومات كثيرة جدا من خلال مشاركتي في هذا المنتدى، عرفت أن ترتيب المكتبات مهم جدا، كما عرفت أن اختيار نوع الملف الذي يكتب فيه كذلك مهم، مشكلتي كانت أنني أنفذ في ال console Application win32 وعندما أختار هذا النوع يتوجب علي تضمين مكتبة بدونها لا يعم البرنامج هذه المكتبة هي (stdafx.h)، لكن عندما أخبرتني بأن المكتبة الأولى التي يجب كتابتها هي ال windows.h لم أعرف بأيهما أبدأ وفي كل الحالات سواء بدأت بالwindows أو ال stdafx يظهر لي نفس الخطأ، وعندما غيرت نوع الملف الذي أنفذ فيه إلى general/empty project ظهر لدي التنفيذ لكن لاتزال هناك مشكلة يظهر أن هناك تنفيذ وتظهر النافذة في الشريط لكن عند الضغط عليها لاتظهر على الشاشة وتظهر مربع حوار يحتوي على الرسالة التالية:

Unhandled exception at 0x004010ed in lasttriagnle.exe: 0xC0000005: Access violation reading location 0x0014c4dc.

ويظهر لي خيارين إما أن أختار break أو continue فإذا اخترت continue يستمر ظهور مربع الحوار ولا يجدي نفعاً وإذا اخترت break يظهر عندي مربع الحوار التالي:

No symbols are loaded for any call stack frame. The source code cannot be displayed.

وهناك خيارين إما ok أو show disassembly فإذا اخترت ok يعلق ولا يظهر لدي أي تنفيذ لكن النافذة تظل في شريط المهام ولاتظهر على الشاشة وإذا اخترت الخيار الآخر فإنه ينقلني إلى ملف assembly

وأخيرا أن ال compiler الذي أستخدمه Microsoft visual studio 2005

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

#8

المثال بالمرفقات باستخدام Visual Studio 2005

- لايجب ان تستدعي stdafx .

- والمشروع يجب ان يكون console Application

Triangle_Sierpinski_Gasket.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#9

مشكووووووووووووووووووووووور جداً أخي، أسأل الله لك التوفيق وأن ينفع بعلمك، عمل راااااائع، البرنامج تم تنفيذه ولله الحمد

عرفت خطأي وسبب ظهور مربع الحوار اللي كلمتك عنه، هو كان سببه بالخطأ اني استدعيت الدالة

myInit(); بعد الدالة

glutDisplayFunc(Sierpinski);

طبعاً اكتشفت الخطأ بعد ماقارنت بين البرنامج اللي اعطيتني إياه وبين برنامجي

على العموم لك جزيييييييييل الشكر

تم تعديل هذه المشاركة بواسطة lug في 15 ديسمبر 2008 في 23:00

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…