من برای کامپایل شدنش تو صفحات اولیه توضیح دادم که glut رو شما باید تو فولدر سیستم ویندوزتون کپی کنید تا اجرا بشه و هدر ها و سر فایل ها رو اضافه کند من دیگه سپردم به زوک اینم توضیح سورس اول
#include <math.h> //سر فایل برای توابع سینوس و کسینون
#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
float i=0; // متغیری کلی برای ایجاد حالت انیمیشن
class scrPt { //یک کلاس ساده که متخصات را نگهداری می کند
public: // متغیر ها از نوع پابلیک هستند و همه اجازه دستررسی به آنها را دارند
GLint x, y; // اکس و وای از نوع متغیر ها اصلی اپن جی ال تعریف شده اند
};
void setPixel (GLint x, GLint y) // برای تعیین و رس یک پیکسل از این تابع استفاده می کنیم
{glPointSize (1); // اندازه پیکسل را برابر 1 قرار می دهیم
glBegin (GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
glVertex2i (x, y); // رسم هر پیکسل
glEnd ( ); // پایان رسم
}
void circleMidpoint (scrPt circCtr, GLint radius) // تابعی برای رسم دایره به روش نقطه میانی
{
scrPt circPt; // تعریف یک متغیر از نوع کلاس مختصات هر نقطه
GLint p = 1 - radius; // Initial value of midpoint parameter. این مرحله اول در الگوریتم نقطه میانی برای تعیین اولین علامت پی است
circPt.x = 0; // Set coordinates for top point of circle. ایندو خط طبق الگوریتم مختصات را روی نقطه بالای دایره با شعاع رادیوس تنظیم می کنند.
circPt.y = radius;
void circlePlotPoints (scrPt, scrPt); // این خط به کامپایلر می گوید که ما در اینجا به تعریف این تابع نیاز داریم
/* Plot the initial point in each circle quadrant. */
circlePlotPoints (circCtr, circPt); // رسم نقطه اولیه در تمام 8 اکتانت دایره
/* Calculate next points and plot in each octant. این قسمت برای محاسبه نقاط بعدی دایره در کل 8 اکتانت می باشد*/
while (circPt.x < circPt.y) {
circPt.x++; // ایکس در هر مرحله باید افزایش پیدا کند
if (p < 0) // طبق الگوریتم برای پی های مثبت و منفی دو فرمول داریم که با این شرط پیاده سازی می شوند
p += 2 * circPt.x + 1; // تعیین علامت پی وقتی پی قبلی منفی است
else {
circPt.y--; //دو حالت دارد در بعضی مراحل بسته به علامت پی اگر مثبت باشد باید کاهش پیدا کند وگرنه تغییری نمی کند y
p += 2 * (circPt.x - circPt.y) + 1; // تعیین علامت پی وقتی پی قبلی مثبت است
}
circlePlotPoints (circCtr, circPt); // بعد از تعیین ایکس و وای پیکسل در 8 اکتانت دیگر ترسیم می شود
}
}
void circlePlotPoints (scrPt circCtr, scrPt circPt) // تابع برای رسم پیکسل در تمام اکتانت های دایره
{
setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
}
void circle (GLint x, GLint y)//رسم یک پیکسل به صورت درشت که گوشه های آن نرم شده و شبیه به یک دایره تو پر به نظر می رسد
{glColor3f(1.0, 0.0, 1.0); // تعیین رنگ پیکسل
glEnable (GL_POINT_SMOOTH); //
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// این دو خط برای نرم کردن گوشه های پیکسل هستند
glPointSize (120); // تعیین درشتی پیکسل
glBegin (GL_POINTS);glVertex2i (x, y);glEnd ( ); // رسم پیکسل
glDisable (GL_POINT_SMOOTH); // غیر فعال کردن نرم کردن اطراف برای ترسیم های بعدی
}
void init(void){ // تابع نصب مقادیر اولیه بک گراند بافر ها و تعیین ماتریس و مختصاتی که می خواهیم در آن کار کنیم
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent
}
void dis(void) // تابع اصلی نمایش
{
glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
glColor3f(0.0, 1.0, 1.0);
scrPt xy; // تعریف متغیر از نوع کلاس مختصات
i+=0.1; // افزایش i برای حرکت دایره کوچک
xy.x=100; // تعیین مختصات ایکس دایره اصلی
xy.y=75; // تعیین مختصات وای دایره اصلی
circleMidpoint (xy, 35); // رسم دایره اصلی در نقطه مختصات با شعاع 35
circle((35*cos((M_PI/180)*(i)))+100,(35*sin((M_PI/180)*(i)))+75);//این تابع کار اصلی به حرکت در آوردن دایره کوچک را انجم می دهد و در هر مر حله مختصات دایره کوچک را روی محیط دایره ایی با شعاع 35 در مختصات 100 و 75 صفحه نمایش تعیین می کند و چون متغیر آی در حال افزایش است هر مر حله در موقعیت جدیدی دایره کوچک رسم می شود.
if(i>360) i=0; // برای وقتی که دایره کوچک یک دور کامل زد بوسیله این شرط به آی با صفر مقدار دهی می شود که از سر ریز شده آی جلوگیری شود.
glFlush(); // این تابع به هسته اپن جی ال دستور می دهد که محاسبات را به صورت پایان پذیر انجام دهد
glutSwapBuffers(); // این تابع جای بافر ها را برای نمایش بدون پرش یا فلیکر عوض می کند
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); //initialise GLUT
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //sets display mode
glutInitWindowPosition(50, 100); //top left display window pos
glutInitWindowSize(400, 300); //display win width and height in pixel coords
glutCreateWindow("Example01 - Circle"); //now create display win
glClearColor(1.0,1.0,1.0,0.0); //display window set to white
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent
glutDisplayFunc(dis); //call drawing func
glutIdleFunc(dis); // اجرای مکرر تابع نمایش اصلی
glutMainLoop(); //display all and wait
return 0;
}