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

الرسام ، متى نرسم و متى نغير الاداة

بدأه صمت الفراشات في 16 ديسمبر 2011 · 15 رد · 3,075 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي برنامج كمحاكاة لبرنامج الرسام ، بحث انه بيعرض رسمات و من خلال الضغط عليها بقدر ارسم بالمنطقة المحددة للرسم

عملته على البورلاند c++

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

عملت فنكشن لفحص الاحداثيات check و الاحداثيات فيه بالنسبة لشريط الادوات على الجنب

لكن ما عرفت وين استخدمه !

يا ريت الي بيقدر يساعدني فيه ما يقصر ، بدي لو بينعمل لأول أداتين و انا بكمله

و لكم جزيل الشكر :)

البرنامج بالمرفقات

OPENPGLPP1.cpp

#2

السلام عليكم ..

  1. هذا كود الحدث الخاص بالماوس و الذي يقوم بالرسم :
    void polyline(GLint button,GLint action,GLint xMouse,GLint yMouse)
    {
    	//static scrPt endPt1,endPt2;
    
    	if(ptCtr==0)
    	{
    		if (button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
    		{
    
    			endPt1.x=xMouse;
    			endPt1.y= winHeight-yMouse;
    			ptCtr=1;
    			cout<<"11111";
    			check();
    		}
    		else if(button==GLUT_RIGHT_BUTTON)exit(0);
    	}
    	else if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
    	{
    		endPt2.x=xMouse;
    		endPt2.y=winHeight-yMouse;
    		ptCtr=0;
    		if(choise ==1)
    			drowLine(endPt1,endPt2);
    		if(choise == 2)
    			drowCircle(endPt1,endPt2);
    		else
    			if(choise == 3)
    			{
    			}
    			else if(choise == 4)
    				drowRect(endPt1 , endPt2);
    
    	}
    
    	else if(button==GLUT_RIGHT_BUTTON)
    		exit(0);
    	glFlush();
    }

  2. يجب معالجة أن الضغط على الأداة , لا يعني تحديد نقطة البداية لرسم الشكل , لأنه بهذا الشكل كل الأشكال سوف ترسم لأول مرة فوق الأدوات ..
  3. لاحظ انه لا داعي لتعريف المتحولات داخل الإجراء طالما هي معرفة داخل الملف ككل , و بالتالي نصل إليها من جميع الإجرائيات ..
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

شكرا لك اخي الكريم

سؤال آخر

هل بقدر أحدد منطقة تكون خاصة بمنطقة الرسم ، بمعنى ما اقدر ارسم شريط الادوات ؟

#4

السلام عليكم ..

اقتباس
هل بقدر أحدد منطقة تكون خاصة بمنطقة الرسم ، بمعنى ما اقدر ارسم شريط الادوات ؟
يمكن تحديد منطقة للرسم و منطقة للأدوات .. نفحص نقرة الماوس إذا كانت فوق أحد أزرار شريط الأدوات , إذاََ نحن نختار أداة و إلا نحن نرسم .. أتمنى أن أكون فهمت سؤالك بشكل صحيح .
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

لا سؤالي انه انا لما بدي ارسم بمنطقة قريبة من شريط الادوات فما تطلع الرسمة الا الي موجودة بالمنطقة الخاصة بالرسم

يعني الجزء الثاني الموجود بمنطقة الادوات ما يكون ظاهر !

#6

السلام عليكم ...

  1. اعتقد انه علينا تحديد منطقة كي يتم الرسم بها كمايلي :
    void drowRect(scrPt endPt1,scrPt endPt2){
    	glViewport(200,0,600 , 700);
    	glRectf(endPt1.x , endPt1.y , endPt2.x , endPt2.y );
    }

    لكن يجب تغيير الإحدائيات بطريقة ما لاننا صرنا نرسم ضمن منطقة داخلية و نأخذ إحداثيات الرسم من النافذة ككل ..لا أعرف كيف ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7
houssam11350_11350 كتب:

السلام عليكم ...

  1. اعتقد انه علينا تحديد منطقة كي يتم الرسم بها كمايلي :
    void drowRect(scrPt endPt1,scrPt endPt2){
    	glViewport(200,0,600 , 700);
    	glRectf(endPt1.x , endPt1.y , endPt2.x , endPt2.y );
    }

    لكن يجب تغيير الإحدائيات بطريقة ما لاننا صرنا نرسم ضمن منطقة داخلية و نأخذ إحداثيات الرسم من النافذة ككل ..لا أعرف كيف ..

السلام عليكم

حاولت بهذه الطريقة

لكن بتظهر مشاكل جديد

في فكرة انه بعد ما نرسم الشكل نعيد رسم شريط الادوات فقط

و هيك اذا ارسم شيء بمنطقة الشريط فانه رح يتغطى بعد ما يتم رسم الشريط مرة ثانية

تقريبا اعطتني الشيء الي بدي اياه

شكرا الك و لمجهوك معي اخي حسام :)

#8

أنا بقالي فترة بهرش في دماغي وبقول السطر ده بتاع إيه؟؟

double r = pow ( ( pow(dx,2) + pow(dy,2)) , 0.5 ) ;

ده أولاً....

ثانياً عندك خطأ في:

cout<"11111";

المفترض تكون:

cout << "11111";

ثالثاً تعريفك للمتغيرات غريب يعني زي أول سطر هو double للـ r بس pow إنت مش معرفه.....

رابعاً بالنسبة للناس إلي زي حالاتي بتستخدم Microsoft Visual Studio 2010 خلي مكتبة #include "iostream" بالشكل ده وإكتب بعد تعريفك للمكتبات using namespace std; علشان الإدخال والإخراج وطبعاً الكود برضو مشتغلش أتمنى من صاحب الكود إن كان عمل بعض التعديلات يعرضها رجاءًً.....

خامساً عندك خطأ إملائي لتعريفك مش أكتر :) في سطر:

glutCreateWindow("OPEN GL BROJECT");

المفترض تكون الكلمة Project يعني مشروع وربنا يوفقك يا أخي....

وشكراً....!

تم تعديل هذه المشاركة بواسطة أحمدالغريب في 21 ديسمبر 2011 في 07:15

صلي قبل ان يصلى عليك

#9
أحمدالغريب كتب:

أنا بقالي فترة بهرش في دماغي وبقول السطر ده بتاع إيه؟؟

double r = pow ( ( pow(dx,2) + pow(dy,2)) , 0.5 ) ;

// هذا لحتى احسب نصف قطر الدائرة ، و الي هو المسافة بين النقطة الاولى و النقطة الثاثنية

ده أولاً....

ثانياً عندك خطأ في:

cout<"11111";

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

المفترض تكون:

cout << "11111";

ثالثاً تعريفك للمتغيرات غريب يعني زي أول سطر هو double للـ r بس pow إنت مش معرفه.....

// معرض دبل لانه فرق بين نقطتين بطلعه بعملية حسابية و ممكن يكون فيها كسر !

رابعاً بالنسبة للناس إلي زي حالاتي بتستخدم Microsoft Visual Studio 2010 خلي مكتبة #include "iostream" بالشكل ده وإكتب بعد تعريفك للمكتبات using namespace std; علشان الإدخال والإخراج وطبعاً الكود برضو مشتغلش أتمنى من صاحب الكود إن كان عمل بعض التعديلات يعرضها رجاءًً.....

// البرنامج الي بشتغل عليه هو بورلاند c++ و ليس الفيجوال

خامساً عندك خطأ إملائي لتعريفك مش أكتر :) في سطر:

glutCreateWindow("OPEN GL BROJECT");

المفترض تكون الكلمة Project يعني مشروع وربنا يوفقك يا أخي....

بهذه معك حق ! ،،

وشكراً....!

بالنسبة للتعديلات الجديدة هناك بعض النقاط الي حليتها بالنسبة لعنوان السؤال

لكن في مشاكل ثانية !

ان إمكنك مساعدتي فيها

و شكرا لك :)

المشكلة الجديد .. عند تغيير اللون !

بنيت فنكشن سليكت للكلر و حسب مكان الضغطة بحدد قيم x,y,z الي هما البراميتر لكود اللون

بهذه الحالة المفروض ما يعتمد نقطة النقر هي النقطة لاي رسمة !

و يبلش ياخذ نقاط من جديد

و ما يرجع للون الاصلي الي هو الاخضر هنا !

مشكلة ثانية بنقاط المثلث

المفروض آخذ ثلاث نقاط و ليس نقطتين !

لكن ما قدرت غير اخذ نقطتين

ppp.cpp

#10

أها بتستخدم بورلاند علشان كده جملة الإخراج شكلها كده وكمان تعريف المتغيرات عندك غريب شوية بس سؤال كيف بتعمل كومبايل وأنت مش معرف أصلاً pow وكمان في مشكلة تاني في الجملة التالية:

double r = pow ( ( pow(dx,2) + pow(dy,2)) , 0.5 ) ;

مش المفترض تكون بتعمل عملية حسابية إذاً أين المعاملات بين الـ pow والقوس الي بعده ولا البورلاند بيحسب الفراغ ما بين الـ pow والقوس على أنه علامة ضرب يعني بالشكل ده لأنه في مشكلة عندي في VC++ لازم أعملها بالشكل ده:

ده إلي توصلت إليه بعد الهرش في دماغي فترة:

void drowCircle(scrPt endPt1,scrPt endPt2)
 {
  int dx , dy ;
  double pow;
  dx = endPt2.x - endPt1.x ;
  dy = endPt2.y - endPt1.y ;
  double r = pow*( ( pow*(dx,2) + pow*(dy,2)) , 0.5 ) ;
     int x = 0,radius= r , xCenter=endPt1.x , yCenter=endPt1.y;
	int y = radius;
	int f = 1-radius;


		while (x < y) {
			x++;
			if (f < 0)
				f += 2*x+1;
			else {
				y--;
				f += 2*(x-y)+1;
    	  }

صلي قبل ان يصلى عليك

#11

طبعاً أنا أول مرة أنجح اليوم في عمل كومبايل للبرنامج بعد محاولات وتعديلات لكي يعمل على VC++ وإعذرني يا أخي أنا بحاول أساعدك لكني بدرس مثلي مثلك ومبتديء برضو زي زيك :D :happy: عموما الكود بعد التعديل على الفيجوال سي++ 2010 ولازم تعمل Win32 Console Application علشان مكتبة stdafx وأيضاُ يشتغل البرنامج لأني حاول في Empty project ولم يعمل معي عموما كود البرنامج كله أهو....طبعاً ده للناس إلي شغاله فيجوال سي++...بالنسبة للبورلاند نزل السورس إلي فوق....بالنسبة للأخطاء هحاول فيها ولو وصلت لنتجية هقولك عليها....بس مش كان يفضل إنك تعمله برنامج على MFC وتعمل المربع ووو....إلخ أزرار وتختار ما بينهم بالأزارا وأيضاً مساحة الرسم تكون مثل برنامج الرسام.....

// OpenGL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include "iostream"
#include <math.h>
#include <gl/glut.h>

using namespace std;

GLsizei winWidth=1500, winHeight=705;
GLint ptCtr=0;
int choise = 10;
int s,c,PP , p11,p12;
boolean d = false;
double x,y,z ;
int color , co ;
class scrPt{
public: GLint x,y;
};
static scrPt endPt1,endPt2;
scrPt Pt1,Pt2,Pt3;
void init(void)
{
     glClearColor(1.0, 1.0, 1.0,1.0);
     glMatrixMode(GL_PROJECTION);
     gluOrtho2D(0.0, 200.0, 0.0, 150.0);
 }


  void dis(void)
  {
   // glClear(GL_COLOR_BUFFER_BIT);
    //Quads
      glColor3f(1.0, 1.0, 1.0);
   glBegin(GL_QUADS);
   glVertex2f(0,0);
   glVertex2f(200,0);
   glVertex2f(200,705);
   glVertex2f(0,705);
   glEnd();
   // line1
    glColor3f(0.5, 0.5, 0.5);
    glBegin (GL_LINES);
    glVertex2f (0, 50);
    glVertex2f (200, 50);
    glEnd();
  // line1

    glBegin (GL_LINES);
    glVertex2f (0, 150);
    glVertex2f (200, 150);
    glEnd();

     // line2
    glBegin (GL_LINES);
    glVertex2f (0, 300);
    glVertex2f (200, 300);
    glEnd();

     // line3
    glBegin (GL_LINES);
    glVertex2f (0, 450);
    glVertex2f (200, 450);
    glEnd();

     // line4
    glBegin (GL_LINES);
    glVertex2f (0, 600);
    glVertex2f (200, 600);
    glEnd();


      glColor3f(0.5, 0.3, 0.5);
     glBegin (GL_LINES);
     glVertex2f (50, 80);
     glVertex2f (150, 100);
     glEnd();
    //****
      glColor3f(0.5, 0.3, 0.6);
     glBegin (GL_LINE_LOOP);
     glVertex2f (50, 170);
     glVertex2f (50, 250);
     glVertex2f (150, 250);
     glVertex2f (150, 170);
     glEnd();
    //--------
      glColor3f(0.6, 0.3, 0.6);
     glBegin (GL_LINE_LOOP);
     glVertex2f (50, 350);
     glVertex2f (150, 350);
     glVertex2f (100, 400);
     glEnd();
      //*-*-*-*-*-*

       int x = 0,radius=50,xCenter=100, yCenter=520;
	int y = radius;
	int f = 1-radius;


		while (x < y) {
			x++;
			if (f < 0)
				f += 2*x+1;
			else {
				y--;
				f += 2*(x-y)+1;
    	  }

    	  glBegin(GL_POINTS);
				glVertex2i (xCenter+x, yCenter+y);
				glVertex2i (xCenter+y, yCenter+x);

            	glVertex2i (xCenter-x, yCenter+y);
				glVertex2i (xCenter+y, yCenter-x);

            	glVertex2i (xCenter+x, yCenter-y);
				glVertex2i (xCenter-y, yCenter+x);

            	glVertex2i (xCenter-x, yCenter-y);
				glVertex2i (xCenter-y, yCenter-x);


   	 glEnd();
		}
      //-*-+-+-+-+-+-+*/*/
      glColor3f(0.7, 0.8, 0.9);
      glBegin (GL_POLYGON);
      glVertex2f (50,610);
      glVertex2f (50,650);
      glVertex2f (150,650);
      glVertex2f (150, 610);
      glEnd();




     //*******color****
      //1
        glColor3f(1.0, 0.0, 0.0);
      glBegin (GL_POLYGON);
      glVertex2f (0,0);
      glVertex2f (0,25);
      glVertex2f (50,25);
      glVertex2f (50, 0);
      glEnd();
     //2
        glColor3f(0.0, 1.0, 0.0);
      glBegin (GL_POLYGON);
      glVertex2f (0,25);
      glVertex2f (0,50);
      glVertex2f (50,50);
      glVertex2f (50, 25);
      glEnd();
    //3
       glColor3f(0.0, 0.0, 1.0);
      glBegin (GL_POLYGON);
      glVertex2f (50,0);
      glVertex2f (50,25);
      glVertex2f (100,25);
      glVertex2f (100, 0);
      glEnd();
    //4
     glColor3f(0.8, 0.1, 0.4);
      glBegin (GL_POLYGON);
      glVertex2f (50,25);
      glVertex2f (50,50);
      glVertex2f (100,50);
      glVertex2f (100, 25);
      glEnd();
    //5
     glColor3f(1.0, 0.6, 0.1);
      glBegin (GL_POLYGON);
      glVertex2f (100,0);
      glVertex2f (100,25);
      glVertex2f (150,25);
      glVertex2f (150, 0);
      glEnd();
    //6
     glColor3f(0.6, 0.5, 1.0);
      glBegin (GL_POLYGON);
      glVertex2f (100,25);
      glVertex2f (100,50);
      glVertex2f (150,50);
      glVertex2f (150, 25);
      glEnd();
    //7
     glColor3f(1.0, 0.9, 0.0);
      glBegin (GL_POLYGON);
      glVertex2f (150,0);
      glVertex2f (150,25);
      glVertex2f (200,25);
      glVertex2f (200, 0);
      glEnd();
    //8
     glColor3f(0.2, 0.8, 0.4);
      glBegin (GL_POLYGON);
      glVertex2f (150,25);
      glVertex2f (150,50);
      glVertex2f (200,50);
      glVertex2f (200,25);
      glEnd();
    //end color***********



   glFlush();
  }
void displayFcn(void)
  {
    glClear(GL_COLOR_BUFFER_BIT);
    //Quads
      glColor3f(1.0, 1.0, 1.0);
      dis();
   glFlush();
  }


   void selectcolor( scrPt endPt1 )
{
   if(endPt1.x >0 && endPt1.x <50 && endPt1.y > 0 && endPt1.y < 25 )
        { co = 1 ;x=1.0; y=0.0; z=0.0; glColor3f(x, y, z); }
     else if(endPt1.x >0 && endPt1.x <50 && endPt1.y > 25 && endPt1.y <50 )
         { co = 1 ;x=0.0; y=1.0; z=0.0; glColor3f(x, y, z); }
     else if(endPt1.x >50 && endPt1.x <100 && endPt1.y > 0 && endPt1.y < 25 )
          {co = 1 ; x=0.0; y=0.0; z=1.0; glColor3f(x, y, z); }
     else if(endPt1.x >50 && endPt1.x <100 && endPt1.y > 25 && endPt1.y < 50 )
         { co = 1 ;x=0.8; y=0.1; z=0.4;  glColor3f(x, y, z);}
     else if(endPt1.x >0 && endPt1.x <100 && endPt1.y > 0 && endPt1.y < 25 )
         { co = 1 ;x=1.0; y=0.6; z=0.1;  glColor3f(x, y, z);}
     else if(endPt1.x >0 && endPt1.x <150 && endPt1.y > 25 && endPt1.y <50 )
         { co = 1 ;x=0.6; y=0.5; z=1.0;  glColor3f(x, y, z);}
     else if(endPt1.x >150 && endPt1.x <200 && endPt1.y > 0 && endPt1.y < 25 )
          { co = 1 ;x=1.0; y=0.9; z=0.0; glColor3f(x, y, z); }
     else if(endPt1.x >150 && endPt1.x <200 && endPt1.y > 25 && endPt1.y < 50 )
         { co = 1 ;x=0.2; y=0.8; z=0.4;  glColor3f(x, y, z);}
         else   co = 0 ;


}
void drowCircle(scrPt endPt1,scrPt endPt2)
 {
  int dx , dy ;
  double pow;
  dx = endPt2.x - endPt1.x ;
  dy = endPt2.y - endPt1.y ;
  double r = pow*( ( pow*(dx,2) + pow*(dy,2)) , 0.5 ) ;
     int x = 0,radius= r , xCenter=endPt1.x , yCenter=endPt1.y;
	int y = radius;
	int f = 1-radius;


		while (x < y) {
			x++;
			if (f < 0)
				f += 2*x+1;
			else {
				y--;
				f += 2*(x-y)+1;
    	  }

    	  glBegin(GL_POINTS);
				glVertex2i (xCenter+x, yCenter+y);
				glVertex2i (xCenter+y, yCenter+x);

            	glVertex2i (xCenter-x, yCenter+y);
				glVertex2i (xCenter+y, yCenter-x);

            	glVertex2i (xCenter+x, yCenter-y);
				glVertex2i (xCenter-y, yCenter+x);

            	glVertex2i (xCenter-x, yCenter-y);
				glVertex2i (xCenter-y, yCenter-x);


   	 glEnd();
		}
   }

 void drowQuads(scrPt endPt1,scrPt endPt2){
 glBegin (GL_LINE_LOOP);
      glVertex2f (endPt1.x,endPt1.y);
      glVertex2f (endPt1.x,endPt2.y);
      glVertex2f (endPt2.x,endPt2.y);
      glVertex2f (endPt2.x,endPt1.y);
      glEnd();
}
 void drowTt(scrPt endPt1,scrPt endPt2){
 glBegin (GL_TRIANGLES);
      glVertex2f (endPt2.x,endPt2.y);
      glVertex2f (endPt1.x-50,endPt1.y);
      glVertex2f (endPt1.x+50,endPt1.y);
      glEnd();
}

void drowRect(scrPt endPt1,scrPt endPt2){

glRectf(endPt1.x-5 , endPt1.y+5 , endPt2.x+5 , endPt2.y-5 );

}


void drowLine(scrPt endPt1,scrPt endPt2){
     glBegin (GL_LINES);
     glVertex2f (endPt1.x, endPt1.y);
     glVertex2f (endPt2.x, endPt2.y);
     glEnd();
}
 void check (scrPt p)
  {
     if( (p.x >0 && p.x <200) && (p.y > 600 && p.y < 705 ))
         choise = 1 ;
     else if(p.x >0 && p.x <200 && p.y > 450 && p.y < 600 )
       {  choise = 2 ; c = 0 ; }
     else if(p.x >0 && p.x <200 && p.y > 300 && p.y < 450 )
       {  choise = 3 ;  c = 0 ; }
     else if(p.x >0 && p.x <200 && p.y > 150 && p.y < 300 )
       {  choise = 4 ;   c= 0 ; }
     else if(p.x >0 && p.x <200 && p.y > 50 && p.y < 150 )
       {  choise = 5 ;   c = 0 ; }
     else if(p.x >0 && p.x <50 && p.y > 0 && p.y < 25 )
         {color = 6 ;   c = 0 ; }
     else if(p.x >0 && p.x <50 && p.y > 25 && p.y <50 )
         {color = 7 ;   c = 0 ; }
     else if(p.x >50 && p.x <100 && p.y > 0 && p.y < 25 )
          {color = 8 ;   c = 0 ; }
     else if(p.x >50 && p.x <100 && p.y > 25 && p.y < 50 )
         { color = 9 ;   c = 0 ;}
     else if(p.x >0 && p.x <100 && p.y > 0 && p.y < 25 )
         {color = 10 ;   c = 0 ; }
     else if(p.x >0 && p.x <150 && p.y > 25 && p.y <50 )
         {color = 11 ;   c = 0 ; }
     else if(p.x >150 && p.x <200 && p.y > 0 && p.y < 25 )
          {color = 12 ;   c = 0 ;  }
     else if(p.x >150 && p.x <200 && p.y > 25 && p.y < 50 )
         {color = 13 ;   c = 0 ; }

     else choise = 0 ;


  }


 void drow(int shape , scrPt Pt1 , scrPt Pt2)
   {
      switch (shape)
         {
            case 1 : drowRect ( Pt1,Pt2) ;
            break ;
            case 2 : drowCircle ( Pt1,Pt2) ;
            break ;
            case 3 : drowTt (Pt1,Pt2) ;
            break ;
            case 4 : drowQuads (Pt1 , Pt2 ) ;
            break ;
            case 5 : drowLine ( Pt1,Pt2) ;
            break ;
         }

   }


void polyline(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
 static scrPt endPt1,endPt2;
    if(ptCtr==0)
        {
            if (button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
                {
                  endPt1.x=xMouse;
                  endPt1.y=winHeight-yMouse;
                  ptCtr=1;
                  check(endPt1) ;
                  selectcolor(endPt1);
                  if (co==1) {
                    switch(color)
                           {
                             case 6 : selectcolor(endPt1);
                             break ;
                             case 7 : selectcolor(endPt1);
                             break ;
                             case 8 : selectcolor(endPt1);
                             break ;
                             case 9 : selectcolor(endPt1);
                             break ;
                             case 10 : selectcolor(endPt1);
                             break ;
                             case 11 : selectcolor(endPt1);
                             break ;
                             case 12 : selectcolor(endPt1);
                             break ;
                             case 13 : selectcolor(endPt1);
                             break ;
                           }
                    }

                   if (choise == 1)
                     {
                           if (d==false )
                            {
                              Pt1.x = endPt1.x ;
                              Pt1.y = endPt1.y ;
                              d = true ;
                              c = 1 ;
                              d = false ;
                            }
                     }

                  if (choise == 0) {
                           if (d==false )
                            {
                              Pt1.x = endPt1.x ;
                              Pt1.y = endPt1.y ;
                              d = true ;
                              if (c==1) { drow(1,endPt1,endPt1) ; d = false ; dis();}
                            }
                           else
                            {
                              Pt2.x = endPt1.x ;
                              Pt2.y = endPt1.y ;
                              d = false ;
                              switch(s)
                           {
                             case 2 : drow(2,Pt1,Pt2);dis();
                             break ;
                             case 3 : drow(3,Pt1,Pt2);dis();
                             break ;
                             case 4 : drow(4,Pt1,Pt2);dis();
                             break ;
                             case 5 : drow(5,Pt1,Pt2); dis();
                             break ;
                           }
                            }
                           }
                  else
                     {
                         s = choise ;

                     }




                }
            else if(button==GLUT_RIGHT_BUTTON)exit(0);
       }
    else if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
           {
              endPt2.x=xMouse;
              endPt2.y=winHeight-yMouse;
              ptCtr=0;
              check(endPt2) ;
              cout<<choise;
              check(endPt2) ;
              selectcolor(endPt2);
               if (co==1) {
                    switch(color)
                           {
                             case 6 : selectcolor(endPt2);
                             break ;
                             case 7 : selectcolor(endPt2);
                             break ;
                             case 8 : selectcolor(endPt2);
                             break ;
                             case 9 : selectcolor(endPt2);
                             break ;
                             case 10 : selectcolor(endPt2);
                             break ;
                             case 11 : selectcolor(endPt2);
                             break ;
                             case 12 : selectcolor(endPt2);
                             break ;
                             case 13 : selectcolor(endPt2);
                             break ;
                           }
                    }
                        if (choise == 1)
                     {
                           if (d==false )
                            {
                              Pt1.x = endPt2.x ;
                              Pt1.y = endPt2.y ;
                              d = false ;
                              c=1 ;
                            }
                     }

                  if (choise == 0) {
                           if (d==false )
                            {
                              Pt1.x = endPt2.x ;
                              Pt1.y = endPt2.y ;
                              d = true ;
                              if (c==1) { drow(1,endPt2,endPt2); d = false ; dis(); }
                            }
                           else
                            {
                              Pt2.x = endPt2.x ;
                              Pt2.y = endPt2.y ;
                              d = false ;
                            switch(s)
                           {
                             case 2 : drow(2,Pt1,Pt2); dis();
                             break ;
                             case 3 : drow(3,Pt1,Pt2);dis();
                             break ;
                             case 4 : drow(4,Pt1,Pt2); dis();
                             break ;
                             case 5 : drow(5,Pt1,Pt2); dis();
                             break ;
                           }

                            }
                           }
                  else
                     {
                         s = choise ;
                     }


                }



   else if(button==GLUT_RIGHT_BUTTON)exit(0);
   glFlush();
    }




void winReshapeFcn(GLint newWidth,GLint newHeight){

glViewport(0,0,newWidth,newHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, GLdouble (newWidth), 0.0, GLdouble (newHeight));
winWidth=newWidth;
winHeight=newHeight;

}



void main(int argc,char** argv)
{	   glutInit(&argc, argv);
  		glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );
  		glutInitWindowPosition(-900,-600);
      glutInitWindowSize(winWidth,winHeight);
  		glutCreateWindow("OPEN GL PROJECT");
       init();
  	  	glutDisplayFunc(displayFcn);
      glutReshapeFunc(winReshapeFcn);
      glutMouseFunc(polyline);
     	glutMainLoop();
      }

تم تعديل هذه المشاركة بواسطة أحمدالغريب في 22 ديسمبر 2011 في 07:28

صلي قبل ان يصلى عليك

#12

للأسف مبيرسمش الدائرة....وبيرسم المثلث من نقطتين فقط والضلع الثالث بيغلق تلقائياً عموماً معادلة الدائرة ممكن تفيدك لو تعدلها بالشكل مجرد إقتراح:

void circle(GLfloat centerx, GLfloat centery, GLfloat radiusx, GLfloat radiusy, GLint circle_points)
{ 	
	#define PI 3.1415926535898  
	GLint i;
	GLdouble theta;
	glBegin(GL_POLYGON); 
	for (i = 0; i < circle_points; i++) 
	{   
		theta = 2*PI*i/circle_points; 
		glVertex2f(centerx+radiusx*cos(theta), 
          	centery+radiusy*sin(theta)); 
	} 
	glEnd();
}

صلي قبل ان يصلى عليك

#13

طبعاً الدائرة شغالة بعد التعديل لكن مش عارف...هي بترسم نقطة مش أكتر :lol: الكود بعد التعديل تحت:

void drowCircle(scrPt endPt1,scrPt endPt2)
 {
  int dx , dy ;
#define PI 3.14
  dx = endPt2.x - endPt1.x ;
  dy = endPt2.y - endPt1.y ;
  double r = PI*( ( PI*(dx,2) + PI*(dy,2)) , 0.5 ) ;
     int x = 0,radius= r , xCenter=endPt1.x , yCenter=endPt1.y;
	int y = radius;
	int f = 1-radius;


		while (x < y) {
			x++;
			if (f < 0)
				f += 2*x+1;
			else {
				y--;
				f += 2*(x-y)+1;
    	  }

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

تم تعديل هذه المشاركة بواسطة أحمدالغريب في 22 ديسمبر 2011 في 07:57

صلي قبل ان يصلى عليك

#14
أحمدالغريب كتب:

أها بتستخدم بورلاند علشان كده جملة الإخراج شكلها كده وكمان تعريف المتغيرات عندك غريب شوية بس سؤال كيف بتعمل كومبايل وأنت مش معرف أصلاً pow وكمان في مشكلة تاني في الجملة التالية:

double r = pow ( ( pow(dx,2) + pow(dy,2)) , 0.5 ) ;

مش المفترض تكون بتعمل عملية حسابية إذاً أين المعاملات بين الـ pow والقوس الي بعده ولا البورلاند بيحسب الفراغ ما بين الـ pow والقوس على أنه علامة ضرب يعني بالشكل ده لأنه في مشكلة عندي في VC++ لازم أعملها بالشكل ده:

ال pow هو فنكشن جاهز بالسي لحساب القوة

فعملية حساب مسافة بين نقطتين بتكون بعملية رياضية و هي جذر ( قوة 0.5 ) لمربع الفرق السييني و مربع الفرق الصادي

و الفنكشن جاهز من مكتبة الماث و بيعطي النتيجة صح !

تم تعديل هذه المشاركة بواسطة صمت الفراشات في 22 ديسمبر 2011 في 10:15

#15
صمت الفراشات كتب:

ال pow هو فنكشن جاهز بالسي لحساب القوة

فعملية حساب مسافة بين نقطتين بتكون بعملية رياضية و هي جذر ( قوة 0.5 ) لمربع الفرق السييني و مربع الفرق الصادي

و الفنكشن جاهز من مكتبة الماث و بيعطي النتيجة صح !

تقصد Power دي مش معناها قوة في الرياضيات دي أس يعني المفترض تكون pow^ وعلامة ^ إلي عند رقم 6... أنا إحترت أنا ظاهرة عندي تحت كلمة pow باللون الاحمر مع انه مكتبة math.h محطوطة فوق في الهيدر....

صلي قبل ان يصلى عليك

#16

يا جماعة أنا متأسف جدا يبدو إني كتبت معلومات مسمومة محدش يعدل الـ Pow بالـ PI دي غلطتي أنا هو الكود الي في الاول صحيح لكن انا كان عندي أخطاء بس في تعريف الهيدرز علشان كده كان في خطوط حمراء تحت Pow متأسف مرة تاني يا جماعة البرنامج شغال كويس............!

صلي قبل ان يصلى عليك

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