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

عندي مشكلة في الرسم

مغلق
بدأه ريما الحربي في 22 مارس 2007 · 2 رد · 1,407 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لي كم يوم وأنا أخذ من الدروس اللي من عندكم عن OPEN GL

والله يعطيكم الصحة والعافيه .. ماقصرتوا ماشاء الله ..

عندنا تطبيق لآخر محاضرة .. في الجامعه .. وهو رسم دائرة بنقاط ..

كل شيء عندي تمام الكود ناسخته من الكتاب وعايدة عليه مية مررره

جننننني ... وماكان يطلع لي Out put يطلع الشاشه فااااااضية .. :angry:

====

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

int round(const float a ){return int (a + 0.5);}

void ellipsePlotPoints(int x , int y)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0,0.0,0.0);
	glBegin(GL_POINTS);
		glVertex2i(x,y);
		glVertex2i(-x,y);
		glVertex2i(x,-y);
		glVertex2i(-x,-y);
	glEnd();

	glFlush();
}

void ellipseMidpoint(void)
{
	int Rx=80;
	int Ry=60;
	int xCenter=0;
	int yCenter=0;
	int Rx2 = Rx * Rx;
	int Ry2 = Ry * Ry;
	int twoRx2 = 2 * Rx2;
	int twoRy2 = 2 * Ry2;
	int p;
	int x = 0; 
	int y = Ry;
	int px = 0;
	int py = twoRx2 * y;

	ellipsePlotPoints(x,y);

	p=round ( Ry2 - (Rx2 * Ry) + (0.25 * Rx2));
	while (px < py){
		x++;
		px+=twoRy2;
		if(p < 0)
			p+= Ry2 + px;
		else {
			y--;
			py -=twoRx2;
			 p+= Ry2 + px - py;
		}
		ellipsePlotPoints(x,y);
	}
		p = round (Ry2 * (x+0.5) * (x+0.5)+ Rx2 * (y-1)*(y-1)- Rx2 * Ry2);
		while ( y > 0 ){
			y--;
		py -=twoRx2; 
		if (p > 0)
			p += Rx2 - py;
		else {
			x++;
			px += twoRy2;
			p += Rx2 - py + px;
		}
	 ellipsePlotPoints(x , y);
	}
}
void main(int argc, char** argv)
{
	glutInit(&argc, argv);		  
	glutInitWindowSize(640,480);	 
	glutInitWindowPosition(100, 150);
	glutCreateWindow("test");

	glClearColor(1.0,1.0,1.0,1.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-120.0,120.0,-90.0,90.0);

	glutDisplayFunc(ellipseMidpoint);	 
	glutMainLoop();			 
}

تم تعديل هذه المشاركة بواسطة الشمري في 23 مارس 2007 في 19:21 — السبب: بطلب من العضو .

#2

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

عندك خطأين .. منطقيين ..

1 -

في OpenGL يوجد ثلاثة أنواع من المصفوفات ... مصفوفة PROJECTION وهي الخاصة بتعيين الاحداثيات وامور أخرى .

وقد قام صاحب الموضوع بكتابتها بشكل سليم .

 glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-120.0,120.0,-90.0,90.0);

الان وحتى يتم عرض أي رسم على الشاشة يجب أن تعود مرة أخرى لمصفوفة MODELVIEW وهي المصفوفة التي يتم فيها العمليات التي بالنهاية تمثل قيم المصفوفة التي يتم ضربها في المصفوفة الموجودة في الstack

يجب أن تكتب

glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

هذه المشكلة الاولى .. بعدها سوف تشاهد وجود أربع نقاط تظهر على الشاشة ...

أين بقية النقاط التي تمثل الدائرة ... هنا المشكلة الثانية

2- المشكلة الثانية هي أنك ترسم أربع نقاط ثم تمسح الشاشة باستدعائك للامر

glClear(GL_COLOR_BUFFER_BIT);

ثم ترسم اربع نقاط .. ثم تمسح .. وهذا أمر خاطئ .

الحل .. لا تمسح الا مرة واحدة في كل Frame ..

لاحظ الكود بشكله النهائي

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

int round(const float a ){return int (a + 0.5);}

void ellipsePlotPoints(int x , int y)
{
	glColor3f(1.0,0.0,0.0);
	glBegin(GL_POINTS);
		glVertex2i(x,y);
		glVertex2i(-x,y);
		glVertex2i(x,-y);
		glVertex2i(-x,-y);
	glEnd();

}

void ellipseMidpoint(void)
{
	int Rx=80;
	int Ry=60;
	int xCenter=0;
	int yCenter=0;
	int Rx2 = Rx * Rx;
	int Ry2 = Ry * Ry;
	int twoRx2 = 2 * Rx2;
	int twoRy2 = 2 * Ry2;
	int p;
	int x = 0; 
	int y = Ry;
	int px = 0;
	int py = twoRx2 * y;
	ellipsePlotPoints(x,y);

	p=round ( Ry2 - (Rx2 * Ry) + (0.25 * Rx2));
	while (px < py){
		x++;
		px+=twoRy2;
		if(p < 0)
			p+= Ry2 + px;
		else {
			y--;
			py -=twoRx2;
			 p+= Ry2 + px - py;
		}
		ellipsePlotPoints(x,y);
	}
		p = round (Ry2 * (x+0.5) * (x+0.5)+ Rx2 * (y-1)*(y-1)- Rx2 * Ry2);
		while ( y > 0 ){
			y--;
		py -=twoRx2; 
		if (p > 0)
			p += Rx2 - py;
		else {
			x++;
			px += twoRy2;
			p += Rx2 - py + px;
		}


		ellipsePlotPoints(x , y);
	}
}
//------------------------------
void render()// New New New
{
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(0,0,0);
	ellipseMidpoint();// New New New
	glFlush();
}
//------------------------------


void main(int argc, char** argv)
{
	glutInit(&argc, argv);	  
	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
	glutInitWindowSize(640,480);	 
	glutInitWindowPosition(100, 150);
	glutCreateWindow("test");

	glClearColor(1.0,1.0,1.0,1.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-120.0,120.0,-90.0,90.0);
	////////////////////////////////////////
 	glMatrixMode(GL_MODELVIEW);// New New New
	glLoadIdentity();// New New New
	glutDisplayFunc(render); // New New New  
	///////////////////////////////////////

	glutMainLoop();			 
}

أتمنى لك التوفيق .

تم تعديل هذه المشاركة بواسطة الشمري في 23 مارس 2007 في 19:22

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

مشكور اخوي

يعطيك العافيه

هذا الموضوع مغلق.

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