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

عمل فجوة فى اى شكل مرسوم

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

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

انا عندى مشكلة صغيره ارجو ان الاقى حل ليها

ازاى اقدر اعمل فجوه مثلا فى مربع مرسوم على شاشة الاوبن جى ال يعنى مثلا لو انا عندى مربع مرسوم على الشاشة وعايز اعمل فجهو على شكل دائرة داخل المربع

وجزاكم الله خيرا

1
#2

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

لاتوفّر OpenGL خدمة مماثلة ، والعملية ليست بالسهولة التي قد يتخيّلها البعض ،

يمكن القراءة عن Boolean Operations Algorithms ، وعن CSG ، لا أعرف مقالة مناسبة ، ولكن يمكن البدء من هنا :

http://en.wikipedia.org/wiki/Constructive_solid_geometry

http://sourceforge.net/projects/polyclipping/

http://www.hackchina.com/en/cont/78488

هناك أدوات مساعدة في glu ( تأتي مع أي مترجم تقريباً ) ، يمكن أن تفيد ، لكن لو عملت واحدة بنفسك فهذا أفضل .

http://glprogramming.com/red/chapter11.html#name1

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

يمكنك ذلك من خلال تفعيل ال

(GL_COLOR_LOGIC_OP)

بحيثث ترسم دائره وسط المربع وتعمل logic operation بينهما

#4
اقتباس

يمكنك ذلك من خلال تفعيل ال

(GL_COLOR_LOGIC_OP)

بحيثث ترسم دائره وسط المربع وتعمل logic operation بينهما

ياريت توضح اكتر علشان اقدر انفذ المطلوب

#5

اتمنى ان يوضح لك هذا المثال الفكره:

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#define _USE_MATH_DEFINES
#include <cmath>

void reshape(int w,int h)
{
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glOrtho(800,-800,800,-800,1,-1);
	glViewport(0,0,w,h);
}

void display()
{
	glClearColor(255,255,255,0);
	glClear(GL_COLOR_BUFFER_BIT);

	glColor4f(0,0,0,0);

	glBegin(GL_QUADS);
	glVertex2i(100,100);
	glVertex2i(-100,100);
	glVertex2i(-100,-100);
	glVertex2i(100,-100);
	glEnd();


	glLogicOp(GL_INVERT);  
	glBegin(GL_POLYGON);
	for(float a=0;a<=2*M_PI;a+=0.01)
		glVertex2f(50*sin(a),50*cos(a));
	glEnd();

	glutSwapBuffers();
}

void movie()
{

}
void main(int argc,char**argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
	glutInitWindowSize(600,600);
	glutInitWindowPosition(0,0);
	glutCreateWindow("glut window");	
	glEnable(GL_COLOR_LOGIC_OP);
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);
	glutIdleFunc(movie);
	glutMainLoop();
}
#6

المثال ده حضرتك عامل داخل المربع دائرة بنفس لون مسح الشاشة

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

ارجو ان تكون فهمت قصدى

#7
EnigmaLine كتب:

المثال ده حضرتك عامل داخل المربع دائرة بنفس لون مسح الشاشة

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

ارجو ان تكون فهمت قصدى

كلامك غير دقيق!!

اولاً عندما اعطيك مثال على حضرتك ان تاخذ الفكره الاساسيه ومن ثمه تبحث في النت

اعطيك مثال اوسع بقليل لكي تتضح لك الفكره اكثر

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#define _USE_MATH_DEFINES
#include <cmath>

#pragma comment (lib,"OpenGL32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glut32.lib")

void reshape(int w,int h)
{
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glOrtho(800,-800,800,-800,1,-1);
   glViewport(0,0,w,h);
}

void display()
{

   glClearColor(255,255,0,0);
   glClear(GL_COLOR_BUFFER_BIT);



   glEnable(GL_COLOR_LOGIC_OP);
   glLogicOp(GL_XOR);
   glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

   glBegin(GL_QUADS);
   glVertex3i(100,100,0);
   glVertex3i(-100,100,0);
   glVertex3i(-100,-100,0);
   glVertex3i(100,-100,0);
   glEnd();

   glBegin(GL_POLYGON);
   for(float a=0;a<=2*M_PI;a+=0.01)
      glVertex3f(50*sin(a),50*cos(a),0);

   glDisable(GL_COLOR_LOGIC_OP);

   glutSwapBuffers();

}

void movie()
{

}
int main(int argc,char**argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
   glutInitWindowSize(600,600);
   glutInitWindowPosition(0,0);
   glutCreateWindow("glut window");    
   glutReshapeFunc(reshape);
   glutDisplayFunc(display);
   glutIdleFunc(movie);
   glutMainLoop();

   return 0;
}

تم تعديل هذه المشاركة بواسطة Ali Al-Zyoud في 16 يناير 2011 في 13:35

#8
الشمري كتب:

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

لاتوفّر OpenGL خدمة مماثلة ، والعملية ليست بالسهولة التي قد يتخيّلها البعض ،

يمكن القراءة عن Boolean Operations Algorithms ، وعن CSG ، لا أعرف مقالة مناسبة ، ولكن يمكن البدء من هنا :

http://en.wikipedia.org/wiki/Constructive_solid_geometry

http://sourceforge.net/projects/polyclipping/

http://www.hackchina.com/en/cont/78488

هناك أدوات مساعدة في glu ( تأتي مع أي مترجم تقريباً ) ، يمكن أن تفيد ، لكن لو عملت واحدة بنفسك فهذا أفضل .

http://glprogramming.com/red/chapter11.html#name1

اعتقد ان ال OpenGL توفر هذه الخدمه من خلال Boolean Operations وهي ليس بتلك الصعوبه !!!

#9

مش عارف المشكلة فين انا ربت المثال بس فى حاجه مش مظبوطه يعنى هو اشتغل معايا بس برضه فى حاجه مش مظبوطه ياريت يا اخ على تشرح الكود

وجزاك الله خير

#10
EnigmaLine كتب:

مش عارف المشكلة فين انا ربت المثال بس فى حاجه مش مظبوطه يعنى هو اشتغل معايا بس برضه فى حاجه مش مظبوطه ياريت يا اخ على تشرح الكود

وجزاك الله خير

ما هي ال "حاجه مش مظبوطه" حتى اتمكن من مساعدتك ؟؟

#11

بص على الكود اللى حضرتك كاتبه

 glBegin(GL_POLYGON); 
   for(float a=0;a<=2*M_PI;a+=0.01) 
      glVertex3f(50*sin(a),50*cos(a),0); 

   glDisable(GL_COLOR_LOGIC_OP);

حضرتك فى الكود اللى فات ده ماقفلتش دالة الرسم

  
GlBegin()

GlEnd()

انت ماكتبتش GlEnd() مش عارف ليه

بس انا عملت زى ما انت كاتب فى المثال استغلت معايا بس مش مظبوطه ولما بقفل دالة الرسم مش بتظهر الفجوة خالص

#12
EnigmaLine كتب:

بص على الكود اللى حضرتك كاتبه

 glBegin(GL_POLYGON); 
   for(float a=0;a<=2*M_PI;a+=0.01) 
      glVertex3f(50*sin(a),50*cos(a),0); 

   glDisable(GL_COLOR_LOGIC_OP);

حضرتك فى الكود اللى فات ده ماقفلتش دالة الرسم

  
GlBegin()

GlEnd()

انت ماكتبتش GlEnd() مش عارف ليه

بس انا عملت زى ما انت كاتب فى المثال استغلت معايا بس مش مظبوطه ولما بقفل دالة الرسم مش بتظهر الفجوة خالص

1- عدم وضعي لل glEnd كان خطاء يجب ان تضعها

"بس انا عملت زى ما انت كاتب فى المثال استغلت معايا بس مش مظبوطه ولما بقفل دالة الرسم مش بتظهر الفجوة خالص"

اولاً اكتب glEnd

ثانياً " مش بتظهر الفجوة خالص" اليس هذا المطلوب من برنامجك هي فجوه لن تراها سترى ما تحتها

#13
"بس انا عملت زى ما انت كاتب فى المثال استغلت معايا بس مش مظبوطه ولما بقفل دالة الرسم مش بتظهر الفجوة خالص"
اولاً اكتب glEnd
ثانياً " مش بتظهر الفجوة خالص" اليس هذا المطلوب من برنامجك هي فجوه لن تراها سترى ما تحتها

لا انا قصدى ان افجوه مش بتظهر يعنى لما احط اى حاجه خلف المربع مش بتبان على العموم هاجرب على المثال اللى حضرتك كاتبه و هابلغك بالنتيجه دلوقتى علطول

#14

انا عملت مربع ذيادة على الكود اللى انت حاطه و خليته يبقى خلف المربع الاول وغيرت لونه المربع كله بيظهر معايا مع ان المفروض اللى يظهر من المربع هو شكل الدائرة اللى هيا المفروض تمثل الفجوه

ياريت تجرب الكود اللى انا كاتبه و تقولى النتيجة

#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 
#define _USE_MATH_DEFINES 
#include <cmath> 

#pragma comment (lib,"OpenGL32.lib") 
#pragma comment (lib,"glu32.lib") 
#pragma comment (lib,"glut32.lib") 

void reshape(int w,int h) 
{ 
   glMatrixMode(GL_MODELVIEW); 
   glLoadIdentity(); 
   glOrtho(800,-800,800,-800,1,-1); 
   glViewport(0,0,w,h); 
} 

void display() 
{ 

   glClearColor(255,255,255,0); 
   glClear(GL_COLOR_BUFFER_BIT); 



   glEnable(GL_COLOR_LOGIC_OP); 
   glLogicOp(GL_XOR); 
   glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

   glBegin(GL_QUADS); 
   glVertex3i(100,100,0); 
   glVertex3i(-100,100,0); 
   glVertex3i(-100,-100,0); 
   glVertex3i(100,-100,0); 
   glEnd(); 


 glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
   glBegin(GL_QUADS); 
   glVertex3i(70,70,-1); 
   glVertex3i(-70,70,-1); 
   glVertex3i(-70,-70,-1); 
   glVertex3i(70,-70,-1); 
   glEnd(); 

   glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
   glBegin(GL_POLYGON); 
   for(float a=0;a<=2*M_PI;a+=0.01) 
      glVertex3f(50*sin(a),50*cos(a),0); 
 glEnd(); 
   glDisable(GL_COLOR_LOGIC_OP); 

   glutSwapBuffers(); 

} 

void movie() 
{ 

} 
int main(int argc,char**argv) 
{ 
   glutInit(&argc,argv); 
   glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); 
   glutInitWindowSize(600,600); 
   glutInitWindowPosition(0,0); 
   glutCreateWindow("glut window");     
   glutReshapeFunc(reshape); 
   glutDisplayFunc(display); 
   glutIdleFunc(movie); 
   glutMainLoop(); 

   return 0; 
}
#15
اقتباس
اعتقد ان ال OpenGL توفر هذه الخدمه من خلال Boolean Operations وهي ليس بتلك الصعوبه !!!

هلا أخوي ،

كنت أتكلّم على مستوى vertices ، وليس استخدام العمليات اللونية على البكسلات fragments ( هذا ما فهمته من كلمة فجوة ) ، أعتقد أنها ستصبح العملية أسهل بتحميل صورة مثل هذه :

post-42837-033142600 1295267498_thumb.pn

أن تحصل على ماتريد ، هناك مثال :

/index.php?showtopic=130647

المرفقات
111.PNG

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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