PDA

View Full Version : هدر های لازم برای برنامه نویسی گرافیک در Visual C++



eyelash
یک شنبه 27 اسفند 1385, 11:36 صبح
با عرض سلام و وقت به خیر خدمت دوستان
من قبلا توی turbo C برنامه نویسیس گرافیکی انجام داده بودم و مشکلی نداشتم ولی الان می خوام باVisual C++ برنامه نویسی گرافیکی انجام بدم.
راستش هر چی MSDN و تاپیک های سایت را بررسی کردم چیز درست و حسابی دستگیرم نشد و نتونستم هدر های لازم که باید به برنامه معرفی بشن را پیدا کنم.
از دوستانی که در این زمینه تجربه دارن ممنون می شم راهنمایی کنن.

Arash_j13
یک شنبه 27 اسفند 1385, 13:47 عصر
گرافیکی که شما کار می کردید BGI بوده وای تو ویندوز شما نتونید از اون استفاده کنید مجبورید از کتبخانه هایی مثل opengl یا directx استفاده کنید

eyelash
دوشنبه 28 اسفند 1385, 17:25 عصر
گرافیکی که شما کار می کردید BGI بوده وای تو ویندوز شما نتونید از اون استفاده کنید مجبورید از کتبخانه هایی مثل opengl یا directx استفاده کنید

می شه بیشتر توضیح بدین

farzad2121
شنبه 13 فروردین 1390, 23:10 عصر
سلام
اینم آموزش گرافیک در visual studio c++ 2010
اگر با نرم افزار turbo c++ کار کرده باشید در آنجا برای کار با گرافیگ از یک header file به نام graphics.h استفاده می کردیم و با تغییر linker به روی graphic این قابلیت برای ما فراهم می شد.اما در visual studio 2010 و دیگر ورژن ها header file به نام graphics.h نداریم اما به جای آن می توان از open GL که به مراتب قدرتمند تر است استفاده کنیم.
برای این کار ابتدا لازم است فایل ضمیمه را که header file لازم برای استفاده از open GL هست را دانلود کرده و در مسیرهایی که گفته خواهد شد قرار دهید.

(http://dc242.4shared.com/download/287833478/13844cd7/glut-376-bin_wwwtu-it88tk_.zip?tsid=20100513-093556-2ace9848)
ابتدا فایل دانلود شده را extract کنید ودر داخل آن فایل های glut32.lib,glut32.dll,glut.h را خواهید یافت.
فایل glut.h را در مسیری که visual studio 2010 نصب هست به پوشه زیر انتقال دهید.
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
و فایل glut32.lib را در مسیر زیر کپی کنید.
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib
و در آخر فایل glut32.dll را در دو پوشه زیر قرار دهید.
C:\Windows\SYSTEM
و
C:\Windows\system32
حالا یکبار ویندوز خود را restart کنید تا تغییرات اعمال شود.
حالا visual studio 2010 شما برای کار با open GL ست شده است.
ابتدا توابع لازم برای رسم اشکال را براتون می گم:
1- برای رسم نقطه در صفحه از دستور زیر استفاده می کنیم:


glVertex{2,3,4}(double or int or float or short)(coordinate)
اعداد 2و3و4 بعد های صفحه مختصات ما را مشخص می کنند که در حالت 4 پارمتر 4 میزان بزرگنمایی راس را مشخص می کند. و double,int,float,short نوع مختصات ما را مشخص می کنند با یک مثال ساده درک این موضوع را واستون راحت می کنم:


glVertex2i(5,-4); -1


glVertex3f(0.5,2,-1.25); -2


glVertex4d(1.25,2.75,-8,4);-3
در مثال شماره یک نقطه مورد نظر ما در فضای دو بعدی که مختصات نقطه مورد نظر ما از نوع int هست.
در مثال شماره دو نقطه مورد نظر ما در فضای سه بعدی که مختصات نقطه مورد نظر ما از نوع float هست.
در مثال شماره سه نقطه مورد نظر ما در فضای سه بعدی با پارامتر بزرگنمایی که مختصات نقطه مورد نظر ما از نوع double هست.
2- برای رسم یک خط ما نیاز به مختصات دو نقطه داریم که به صورت زیر تعریف می شود:
ما می توانیم سه نوع خط رسم کنیم:
1- رسم پاره خط های جدا ازهم (GL_LINES)
2- رسم پاره خط های به هم پیوسته با 2 سر انتها باز (GL_LINE_STRIP)
3- رسم پاره خط های به هم پیوسته با 2 انتها بسته (GL_LINE_LOOP)
اکنون برای هر کدام مثالی می آورم:

glBegin(GL_LINES);

glVertex2f(-0.2, -0.5);

glVertex2f(0.3, 0.8);

glVertex2f(-0.8, -0.8);

glVertex2f(0.8, -0.8);


glEnd();
نکته: هر تابعی که ما در open GL استفاده می کنیم بین دو دستور glBegin(type of function) وglEnd() قرار می گیرند.
در مثال بالا دو خط جدا از هم خواهیم داشت.

glBegin(GL_LINE_STRIP);

glVertex2f(-0.2, -0.5);

glVertex2f(0.3, 0.8);

glVertex2f(0.4, 0.1);

glVertex2f(-0.8, 0.0);


glEnd();
درمثال بالا ما دوخط داریم که از ابتدا به هم وصل شده اند.

glBegin(GL_LINE_LOOP);

glVertex2f(-0.2, -0.5);

glVertex2f(0.3, 0.8);

glVertex2f(0.4, 0.1);

glVertex2f(-0.8, 0.0);


glEnd();
در مثال آخر نیز ما دو خط داریم که از هر دو طرف به هم وصل شده اند.
برای ایجاد ضخامت در خط از دستور زیر استفاده می کنیم:


glLineWidth(float);
برای دادن رنگ به خط یا نقطه از دستور زیر استفاده می کنیم:


glColor3f(2.0,0.0,2.0);//or glColor4f(2.0,0.0,2.0,0.2) 4th parameter for transparencyoption


رسم مثلث با استفاده از open GL:
برای رسم یک مثلث نیاز به داشتن مختصات سه نقطه داریم.
انواع مثاث های قابل ترسیم:
1- مثلث های جدا از هم
2- مثلث های دو به دو مشترک در یک ضلع
3- مثلث های مشترک در یک راس واحد
برای ترسیم مثلث نوع اول به شکل زیر عمل می کنیم:

glBegin(GL_TRIANGLES);

glVertex2f(-0.8, -0.8);

glVertex2f(-0.6, -0.4);

glVertex2f(-0.3, -0.8);

glVertex2f(0.8, 0.8);

glVertex2f(0.6, 0.4);

glVertex2f(0.3, 0.8);

glVertex2f(-0.4, 0.0);

glVertex2f(0.0, 0.5);

glVertex2f(0.4, 0.0);


glEnd();
که در مثال بالا سه مثلث جدا از هم را نشان می دهد.
برای ترسیم مثلث نوع دوم به شکل زیر عمل خواهیم کرد:


glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_TRIANGLE_STRIP);

glVertex2f(-0.4, -0.5);

glVertex2f(-0.4, -0.1);

glVertex2f(0.0, -0.5);

glVertex2f(0.0, -0.1);

glVertex2f(0.4, -0.5);


glEnd();
در مثال بالا سه مثلث داریم که دو به دو دارای ضلع مشترک هستند برای اینکه جدا از هم تشخیص داده شوند از دستور glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); استفاده کردیم.

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


glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);


glBegin(GL_TRIANGLE_FAN);


glVertex2f(-0.0, 0.0);


glVertex2f(-0.7, 0.0);


glVertex2f(-0.7, 0.7);


glVertex2f(0.0, 0.7);


glVertex2f(0.7, 0.7);


glVertex2f(0.7, 0.0);


glVertex2f(0.7, -0.7);


glVertex2f(0.0, -0.7);


glVertex2f(-0.7, -0.7);


glEnd();

که در مثال بالا هفت مثلث را نشان می دهد که در یک راس مشترک هستند.

یک مثال را به طور کامل برایتان توضیح می دم.

رسم مثال قبل :


include<glut.h>


#pragma comment(lib,"glut32.lib")


#pragma comment(lib,"opengl32.lib")


int width=480,hight=640;


void display(void)/* all of our code that need to see in screen should write in this function and between glClear(GL_color_BUFFER_BIT) and glutSwapBuffers()*/


{


glClear(GL_COLOR_BUFFER_BIT);


glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);


glColor3f(2.0,0.0,2.0);//or glColor4f(2.0,0.0,2.0,0.2) 4th parameter for transparencyoption


glBegin(GL_TRIANGLE_FAN);


glVertex2f(-0.0, 0.0);


glVertex2f(-0.7, 0.0);


glVertex2f(-0.7, 0.7);


glVertex2f(0.0, 0.7);


glVertex2f(0.7, 0.7);


glVertex2f(0.7, 0.0);


glVertex2f(0.7, -0.7);


glVertex2f(0.0, -0.7);


glVertex2f(-0.7, -0.7);


glEnd();


glutSwapBuffers();


}


int main(int argc,char **argv)


{


glutInit(&argc, argv);


glutInitDisplayMode(GLUT_DOUBLE);


glutInitWindowSize(width, hight);// the resolution of screen


glutCreateWindow("Hello OpenGL World");//name of screen


glutDisplayFunc(display);// go to display function


glutMainLoop();


}



رسم چند ضلعی(GL_POLYGON):
با استفاده از ویژگی چند ضلعی ها می توان انواع چند ضلعی ها را رسم کرد.مثلث ها نیز در واقع از چند ضلعی ها مشتق گرفته شده اند، اما به دلیل اینکه مثلث ها دارای تنوع سه گانه جالبی هستند و همواره محدب هستند و رئوس یک مثلث نمی توانند یک دیگر را قطع کنند، برای رسم مثلث هرگز از چند ضلعی استفاده نمی شود. بنابراین برای رسم چند ضلعی های بیشتر از 4 راس از این شیوه استفاده می کنند.
چند ضلعی ها به طور پیش فرض توپر رسم می شوند اما با دستور زیر می توان تغییراتی را اعمال کرد:


glPolygonMode(GLenum face,GLenum mode);
آرگومانی که به پارامتر face ارسال می شود می تواند به صورت GL_BACK,GL_FRONT,GL_FRONT_AND_BACK باشد.که نحوه تاثیر پارامتر mode بر چند ضلعی را مشخص می کند که این مباحث تاثیر خود را بیشتر در فضای 3بعدی که در قسمتهای بعد توضیح داده خواهد شد نمایان می کنند اما لازم به ذکر است که در فضای 3بعدی اشکال دارای سه قسمت جلو،کناره و پشت هستند که می توانیم آنها را ببینیم و هر کدام ازین قسمت ها می توانند توپر یا توخالی باشند.پارامتر mode می تواند 3 مقدار GL_LINE,GL_POINT,GL_FILL را بگیرد که در آن GL_FILLبه معنای رسم توپر شکل،GL_POINT باعث رسم نقاط ابتدایی وانتهایی خطوط نمایش داده می شود ودر آخر GL_LINE که باعث می شود تنها خطوط متصل به هم دیده شوند(حالت تو خالی).
با یک مثال درک طلب را ساده تر می کنم:
در مثال زیر یک هشت ضلعی به صورت تو خالی رسم شده است:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_POLYGON);

glVertex2f(-0.7, -0.4);

glVertex2f(-0.7, 0.4);

glVertex2f(-0.4, 0.7);

glVertex2f(0.4, 0.7);

glVertex2f(0.7, 0.4);

glVertex2f(0.7, -0.4);

glVertex2f(0.4, -0.7);

glVertex2f(-0.4, -0.7);


glEnd();
رسم 4 ضلعی :
برای رسم 4 ضلعی نیز با دو نوع مختلف روبه رو هستیم:
1- 4ضلعی های جدا از هم((GL_QUADS
2- 4ضلعی های به هم پیوسته (GL_QUAD_STRIP)
برای رسم 4ضلعی جدا از هم کافیست که 4 راس را به OPEN GL دهیم تا برای ما یک 4 ضلعی به شکل مربع یا مستطیل یا لوزی یا هر 4 ضلهی دیگر را رسم کند.
در مثال زیر یک لوزی ویک متوازی الاضلاع توپر کشیده شده است:

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glBegin(GL_QUADS);

glVertex2f(-0.8, 0);

glVertex2f(-0.4, 0.4);

glVertex2f(0.0, 0.0);

glVertex2f(-0.4, -0.4);

glVertex2f(0.9, 0.5);

glVertex2f(0.2, 0.5);

glVertex2f(0.1, 0.0);

glVertex2f(0.8, 0.0);


glEnd();
برای رسم 4 ضلعی های به هم پیوسته باید دقت بیشتری به کاردهیم. ابتدا 4 راس 4ضلعی اصلی را می نویسیم دقت می کنیم که 4ضلعی بعدی برروی آخرین ضلع 4ضلعی قبلی رسم می شود ترتیب نوشتن رئوس در این نوع بسیار مهم است.
برای مثال در کد زیر 3 مستطیل به هم پیوسته را کشیده ایم:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_QUAD_STRIP);

glVertex2f(-0.8, 0.4);

glVertex2f(-0.8, -0.4);

glVertex2f(0.0, 0.4);

glVertex2f(0.0, -0.4);

glVertex2f(0.2, 0.4);

glVertex2f(0.2, -0.4);

glVertex2f(0.5, 0.4);

glVertex2f(0.5, -0.4);


glEnd();