السلام عليكم . هو طبعا مو خاص او حاجة فريدة .. ولكن انجزت هذا الكود دون أن انظر الى مثال جاهز .. لهذا هو انجاز و Exclusive . وهذا الموضوع قمت باعداده من فترة طويلة يوم كنت فاضي.. لكن للتو وجدته في كومة مستندات نصية .. نبدأ : .. opengl لاتوفر طريقة مباشرة لرسم دائرة . . لذلك سنستفيد من الدوال المثلثية لانجاز الكود . " سأتكلم عن الدوال المثلثية ... في موضوع قادم ان شاء الله . " باختصار : باستخدام طريقة الرسم GL_POLYGON .. والتي تقوم بوصل النقطة بالنقطة التي تليها ثم يتم اغلاق الشكل .. فمثلا شاهد الصورة .. ستجد اننا رسمنا نقاط .. وسيتم تحويل هذه النقاط الى شكل.. حسب الطريقة GL_POLYGON . اذا أمامنا مشكلة .. وهي رسم دائرة . عرفنا جزء من الحل وهو رسم نقاط بشكل دائري وفق احداثيات معينة .. واخيرا نحول طريقة الرسم الى GL_POLYGON . كل شيء سهل الا رسم النقاط بشكل دائري .. هنا يبرز دور الدوال المثلثية . الحل : نخزن 360 نقطة ( دورة كاملة ) . . هكذا :
void Init(){ int degree =0; for(;degree<=360;degree++) { double d=(degree*(3.14/180)); cp[degree].x=sin(d); cp[degree].y=cos(d); }}
void Render(){ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); glTranslatef(0,0,-12); glBegin(GL_POLYGON); for(int i=0;i<360;i+=10) glVertex2f(cp[i].x * 3,cp[i].y*3); glEnd();}
struct CPOINT { float x,y;};CPOINT cp[360]; //--------------- Draw Circle ----------------- void glCircle(int radian,unsigned int softness,CPOINT cp[]) { glBegin(GL_POLYGON); for(int i=0;i<360;i+=softness) glVertex2f(cp[i].x * radian,cp[i].y*radian); glEnd(); }//--------------- Init Points---------------void Init(){ for( int degree =0;degree<360;degree++) { double d=(degree*(3.14/180)); cp[degree].x=sin(d); cp[degree].y=cos(d); }}/**************** Important *********************/ void Render(){ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );////2 glLoadIdentity(); glTranslatef(0,0,-12); glCircle(1,10,cp);////1 glLoadIdentity(); glTranslatef(3,0,-12); glCircle(2,40,cp);}
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);