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

مشكله في برنامج" للرسم "

بدأه love begin في 4 ديسمبر 2010 · 2 رد · 815 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا بالأعضاء الكرام

الجميع شاف موضوع بخصوص برنامج الرسم والرجاء اتا عملت كود رسمت في ال اساس وخليت يرسم مربع اذا ضغطت في الماوس

لكن واجهتني مشكله لم اعرف حلها الرجاء المساعد وبأسرع وقت

المشكله اني اريد عندما اضغط على صورة المثلث يصير لونه سكني انه مفعل

واذا ضغطت على كلمة text تصبح هي المفعله ويذهب التفعيل عن المربع وهكذا

والمشكله الثانيه اني لا اريد عندما اضغط فوق الأزرار ان يرسم لأنه ما يزال يرسم

هاد الكود والرجاء تعديل عليه

#include <glut.h>  // automatically includes GL.h and glu.h
#include <GL/glut.h>
#include <iostream.h>  // so we can do some output to the console
int nWidth=500;
int nHeight=500;
void myinit(void)
{

/* Set up attributes */

glClearColor(1.0, 1.0, 1.0, 0.0); /* black background */


/* set up viewing projection*/
/* 500 x 500 window with origin lower left */

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);

}
   void drawSquare(int x, int y)
{


	glClearColor(1.0,1.0,1.0,0.0);



    y=nHeight-y; /* invert y position */
    glColor3f( 1.0,0.0, 0.0); /* a random color */

	glTranslatef(x,y,0);
	glRecti (0,0, 50, 50); 
	glTranslatef(-x,-y,0);

     glFlush();

}



   void mymouse(int btn, int state, int x, int y)
{ 
   if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
   	exit(0);
  	if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
		drawSquare(x, y);
}

void display( void ) 

{

glClear(GL_COLOR_BUFFER_BIT);  //clear the window 
glColor3f(1.0, 1.0, 1.0); 

// Set up model/viewing transformation
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Draw whatever primitives are desired

glBegin(GL_LINES);
glColor3f(0.0, 0.0, 0.0); 

        glVertex2f(0, 100); 
        glVertex2f(600,100);// ÇáÎØ ÇáÑÆíÓí ÝæÞ
		glVertex2f(120, 100); // ÇáÎØ ÇáÃæá ÊÈÚ ÇáãËáË
        glVertex2f(120,0);
		glVertex2f(240, 100);// ÇáÎØ ÇáËÇäí ÊÈÚ ÇáßÊÇÈÉ 
        glVertex2f(240,0);
		glVertex2f(360, 100); 
        glVertex2f(360,0);// ÇáÎØ ÇáËÇáË ÊÈÚ ÇáÈæÑÏÑ
		glVertex2f(0, 30); 
        glVertex2f(120,30);// ÇáÎØ ÇáÑÇÈÚ ÊÈÚ ÍÌã ÇáãËáË
		glVertex2f(360, 30); 
        glVertex2f(600,30);// ÇáÎØ ÊÈÚ CLEAR ALL
		glVertex2f(60,30); 
        glVertex2f(60,0);// ÇáÎØ Çáí ÈäÕ Èíä ÇáäÕ æ 2
		glVertex2f(450,100); 
        glVertex2f(450,30);//ÇáÎØ ÇáÚãæÏí ÊÈÚ ÍÌã ÇáãÍÇí
		glVertex2f(450,65); 
        glVertex2f(600,65);//ÇáÎØ Çáí ÈÝÕá ÇáããÍÇÊíä




glEnd();
glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0); 

        glVertex2f(30, 90); 
        glVertex2f(80,90);
		glVertex2f(80, 40);
		glVertex2f(30, 40);
		glEnd();// ÇáãËáË Çáí Ýí ÇáÎíÇÑÇÊ ÊÍÊ
		glBegin(GL_QUADS);		
glColor3f(0.0, 0.0, 0.0);
        glVertex2f(460, 95); 
        glVertex2f(490,95);
		glVertex2f(490, 70); 
		glVertex2f(460, 70); 
	    	glVertex2f(465, 60); 
        glVertex2f(483,60);
		glVertex2f(483, 40); 
		glVertex2f(465, 40);
		glEnd();//ÇáãÑÈÚíä áÍÌã ÇáããÍÇå

	int i;
	char stringn[]="Text";

	glRasterPos2f(160.0,50.0);
	for (i = 0; i < 4; i++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)stringn);
	}//áßÊÇÈÉ ßáãÉ txt

	int m;
	char string[]="border";

	glRasterPos2f(260.0,50.0);
	for (m = 0; m < 6; m++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)string[m]);
	}// border áßÊÇÈÉ ßáãÉ
		int j;
	char strig[]="eraser";

	glRasterPos2f(380.0,60.0);
	for (j = 0; j < 6; j++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)strig[j]);
	}// eraser áßÊÇÈÉ ßáãÉ
		int k;
	char str[]="clear all";

	glRasterPos2f(400.0,10.0);
	for (k = 0; k < 9; k++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)str[k]);
	}// clear all áßÊÇÈÉ ÌãáÉ

			int h;
	char st[]="0.5";

	glRasterPos2f(20.0,10.0);
	for (h = 0; h < 3; h++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)st[h]);
	}// áßÊÇÈÉ ÇáäÕ

			int t;
	char sm[]="2";

	glRasterPos2f(80.0,10.0);
	for (t = 0; t < 1; t++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)sm[t]);
	}// áßÊÇÈÉ 2

	glPointSize(5);
	glBegin(GL_POINTS);


        glVertex2f(330.0, 60.0); 
        glVertex2f(335.0,60.0);
	         glVertex2f(332.5,55.0);
		      	glVertex2f(330.5,50.0);
			           glVertex2f(335.0,50.0);



glEnd();

 cout<<"executing display()"<<endl; //just to show when display() is called


 glFlush(); /* clear buffers */
 }

void main(int argc, char** argv)
{

/* Standard GLUT initialization */

    glutInit(&argc,argv); //initialize GLUT
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(600,600); 
    glutInitWindowPosition(50,100); 
    glutCreateWindow("Ahmad Majid World"); 
    glutDisplayFunc(display); 


    myinit(); 
			glutMouseFunc(mymouse);

    glutMainLoop(); // enter event loop 
}
#2

- يجب اكتشاف هل النقطة داخل " الشكل الرباعي أم لا " ، لديك عدة مستطيلات مثل ( الأزرار - لوحة الرسم ) ، يجب اكتشاف مكان النقرة ، وبعدها يتم تغيير حالة البرنامج بناءً على مكان الفأرة ، مثال :

يتم الإعلان عن متغير عادي ، يحمل الاسم state مثلاً ، يتغير بتغير حالة البرنامج .

1- المستخدم ينقر على زر رسم مربع .. فتتغير قيمة المتغير state إلى 1 .

2- في دالة الرسم ، عندما نجد القيمة رقم 1 ، نرسم الزر بطريقة مختلفة كأن نغير لون الخلفية .

3- عند النقر على لوحة الرسم ، ننظر إلى قيمة state .. فإذا كانت == 1 ، فهذا يعني أننا نريد رسم مربع ( لوحة الرسم هي أبعاد نحددها مسبقاً ونكتشف التصادم بين النقطة وهذا الشكل ) .

4- عند النقر على المثلث .. تصبح قيمة المتغير state بتساوي 2 .

5- عند النقر على لوحة الرسم يختبر البرنامج قيمة المتغير state .. إن وجدها 2 يرسم مثلث .

وهكذا ..

بهذه الطريقة يمكن العمل مع بقية البرنامج .

هناك أمور أخرى يجب فعلها .. فمثلاً ، عملية السحب والافلات لرسم " شكل ما " ..

عملية إدخال النص المراد رسمه .,

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

الكود الذي وضعته غير منظم .. فمثلاً أنت تقوم بنسخ ولصق العملية التي تقوم برسم النص ؟ لماذا لا تضعها في دالة مستقلة مثلا ً ؟

مشروع كهذا كبير .. ويحتاج لتنظيم وليس تكديس للأوامر .. والا فإن تنظيمها رح يكون صعب ..

الشيء الثاني :

لا تكتب أرقام هكذا .. خزنها في متغيرات ، بأسماء واضحة .. حتى تستخدمها لاحقاً .. مثال :

لا تكتب أبعاد الأزرار مباشرة ..

خزنها في تركيب structure .. مثلاً ، ثم استخدمها لاحقاً لترى إن كانت الماوس داخل هذا الزر .

أيضاً :

خزن الرسوم في مصفوفة ثم ارسمها دفعة واحدة ، حتى تبقى في الشاشة ولا يتم مسحها بمجرد تصغير النافذة أو تحريكها .

هذا كود بعد التعديل ، تتسطيع البناء عليه :

#include <windows.h>  // automatically includes GL.h and glu.h
#include <gl/glut.h>  // automatically includes GL.h and glu.h
#include <GL/glut.h>
#include <vector>
#include <iostream>  // so we can do some output to the console
using namespace std;
int nWidth=500;
int nHeight=500;
int xPos = 0;
int yPos = 0;

int current_state = 0;

struct Rect
{
	int left;
	int right;
	int top;
	int bottom;
};

struct Point
{
	int x,y;
};

Rect panel;
Rect squareButton;

std::vector<Rect> squares;


bool isPointInsideRect(Rect rect,Point point)
{
	return (point.x>rect.left && point.x < rect.right && point.y > rect.bottom && point.y < rect.top);
}

void myinit(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0); /* black background */
	// Drawing Panel Dimension
	panel.left = 5;
	panel.right = nWidth-5;
	panel.top = nHeight-5;
	panel.bottom = 200;

	// Sqaure Button Dimension
	squareButton.left = 30;
	squareButton.right = 80;
	squareButton.top = 90;
	squareButton.bottom =40;



}
void drawPanelBorder(Rect panel)
{
	glColor3f(0.9,0.9,0.9);
	glRectf(panel.left,panel.bottom,panel.right,panel.top);
}
void drawSquare(Rect rect)
{
	glColor3f( 1.0,0.0, 0.0); /* a random color */

	glRecti (rect.left,rect.bottom,rect.right,rect.top); 
}





void drawText(std::string str,float x,float y)
{
	int i;
	glRasterPos2f(x,y);
	for (i = 0; i < str.size(); i++)
	{
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)str);
	}	

}
void drawButtons()
{

	glLoadIdentity();

	// Draw whatever primitives are desired

	glBegin(GL_LINES);
	glColor3f(0.0, 0.0, 0.0); 

	glVertex2f(0, 100); 
	glVertex2f(600,100);// ÇáÎØ ÇáÑÆíÓí ÝæÞ
	glVertex2f(120, 100); // ÇáÎØ ÇáÃæá ÊÈÚ ÇáãËáË
	glVertex2f(120,0);
	glVertex2f(240, 100);// ÇáÎØ ÇáËÇäí ÊÈÚ ÇáßÊÇÈÉ 
	glVertex2f(240,0);
	glVertex2f(360, 100); 
	glVertex2f(360,0);// ÇáÎØ ÇáËÇáË ÊÈÚ ÇáÈæÑÏÑ
	glVertex2f(0, 30); 
	glVertex2f(120,30);// ÇáÎØ ÇáÑÇÈÚ ÊÈÚ ÍÌã ÇáãËáË
	glVertex2f(360, 30); 
	glVertex2f(600,30);// ÇáÎØ ÊÈÚ CLEAR ALL
	glVertex2f(60,30); 
	glVertex2f(60,0);// ÇáÎØ Çáí ÈäÕ Èíä ÇáäÕ æ 2
	glVertex2f(450,100); 
	glVertex2f(450,30);//ÇáÎØ ÇáÚãæÏí ÊÈÚ ÍÌã ÇáãÍÇí
	glVertex2f(450,65); 
	glVertex2f(600,65);//ÇáÎØ Çáí ÈÝÕá ÇáããÍÇÊíä




	glEnd();
	if(current_state == 1) // 
		glColor3f(0.9,0,0);
	else
		glColor3f(0.9,0.9,0.9);

	glBegin(GL_QUADS);
	glVertex2f(30, 40); 
	glVertex2f(80,40);
	glVertex2f(80, 90);
	glVertex2f(30, 90);
	glEnd();

	if(current_state == 2)
		glColor3f(0.9,0,0);
	else
		glColor3f(0.9,0.9,0.9);

	drawText("Text",160,50);

}
void display( void ) 
{
	glClear(GL_COLOR_BUFFER_BIT);  //clear the window 
	glLoadIdentity();
	glColor3f(1.0, 1.0, 1.0); 
	drawButtons();
	drawPanelBorder(panel);
	cout<<"executing display()"<<endl; //just to show when display() is called

	// draw all sqaures 
	for(int i=0;i<squares.size();i++)
	{
		drawSquare(squares);
	}

	glutSwapBuffers(); /* clear buffers */
}

void mymouse(int btn, int state, int x, int y)
{ 
	if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
		exit(0);
	if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
	{
		xPos = x;
		yPos = y;
		Point mousePoint;
		mousePoint.x = x;
		mousePoint.y = nHeight - y; // invert 
		bool b = isPointInsideRect(squareButton,mousePoint);
		if( b == true)
		{
			current_state = 1;
			cout<<" square button"<<endl;
		}
		else if(isPointInsideRect(panel,mousePoint))
		{
			Rect rect ; 
			rect.left  = mousePoint.x - 25;
			rect.right = mousePoint.x + 25;
			rect.top   = mousePoint.y + 25;
			rect.bottom = mousePoint.y - 25;
			squares.push_back(rect);
		}
		// if mouse point is inside other button , change state value .


	}
	glutPostRedisplay();
}


void reshape(int w,int h)
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, w, 0,h );
	glMatrixMode(GL_MODELVIEW);
	nHeight = h;
	nWidth = w;
}

void main(int argc, char** argv)
{

	/* Standard GLUT initialization */

	glutInit(&argc,argv); //initialize GLUT
	glutInitDisplayMode (GLUT_DOUBLE| GLUT_RGB); 
	glutInitWindowSize(nWidth,nHeight); 
	glutInitWindowPosition(50,100); 
	glutCreateWindow("Ahmad Majid World"); 
	glutDisplayFunc(display); 
	glutReshapeFunc(reshape);


	myinit(); 
	glutMouseFunc(mymouse);

	glutMainLoop(); // enter event loop 
}

نصيحة :

لا تركز على بناء القائمة والأزرار وأنت لم تهتم بلب البرنامج ، عملية الرسم ..

لا فائدة من عرض جميع الأزرار وهي لا تعمل ..

ابدأ بعمل كل زر وبرمجته لوحده ، حتى تنجح ، وانتقل بعدها لاضافة مزايا أخرى .

الواجهة مجرد شكل لا فائدة منه بدون عمل فعلي ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

يسلموووووووووو اخي لك جزيل الشكر على المساعده المفيده جدا

بالتوفيق للجميع

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