السلام عليكم و رحمة الله و بركاته
انا عندى مشكلة صغيره ارجو ان الاقى حل ليها
ازاى اقدر اعمل فجوه مثلا فى مربع مرسوم على شاشة الاوبن جى ال يعنى مثلا لو انا عندى مربع مرسوم على الشاشة وعايز اعمل فجهو على شكل دائرة داخل المربع
وجزاكم الله خيرا
السلام عليكم و رحمة الله و بركاته
انا عندى مشكلة صغيره ارجو ان الاقى حل ليها
ازاى اقدر اعمل فجوه مثلا فى مربع مرسوم على شاشة الاوبن جى ال يعنى مثلا لو انا عندى مربع مرسوم على الشاشة وعايز اعمل فجهو على شكل دائرة داخل المربع
وجزاكم الله خيرا
وعليكم السلام و رحمة الله وبركاته ،
لاتوفّر 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 ( تأتي مع أي مترجم تقريباً ) ، يمكن أن تفيد ، لكن لو عملت واحدة بنفسك فهذا أفضل .
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
يمكنك ذلك من خلال تفعيل ال
(GL_COLOR_LOGIC_OP)
بحيثث ترسم دائره وسط المربع وتعمل logic operation بينهما
اقتباسيمكنك ذلك من خلال تفعيل ال
(GL_COLOR_LOGIC_OP)
بحيثث ترسم دائره وسط المربع وتعمل logic operation بينهما
ياريت توضح اكتر علشان اقدر انفذ المطلوب
اتمنى ان يوضح لك هذا المثال الفكره:
#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();
}المثال ده حضرتك عامل داخل المربع دائرة بنفس لون مسح الشاشة
علشان انا لما غيرت لون مسح الشاشة ظهرت معايا مش هوا ده اللى انا عايزه انا عايز اعمل فجوة داخل المربع نفسه
ارجو ان تكون فهمت قصدى
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
الشمري كتب:وعليكم السلام و رحمة الله وبركاته ،
لاتوفّر 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 ( تأتي مع أي مترجم تقريباً ) ، يمكن أن تفيد ، لكن لو عملت واحدة بنفسك فهذا أفضل .
اعتقد ان ال OpenGL توفر هذه الخدمه من خلال Boolean Operations وهي ليس بتلك الصعوبه !!!
مش عارف المشكلة فين انا ربت المثال بس فى حاجه مش مظبوطه يعنى هو اشتغل معايا بس برضه فى حاجه مش مظبوطه ياريت يا اخ على تشرح الكود
وجزاك الله خير
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() مش عارف ليه
بس انا عملت زى ما انت كاتب فى المثال استغلت معايا بس مش مظبوطه ولما بقفل دالة الرسم مش بتظهر الفجوة خالص
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
ثانياً " مش بتظهر الفجوة خالص" اليس هذا المطلوب من برنامجك هي فجوه لن تراها سترى ما تحتها
"بس انا عملت زى ما انت كاتب فى المثال استغلت معايا بس مش مظبوطه ولما بقفل دالة الرسم مش بتظهر الفجوة خالص" اولاً اكتب glEnd ثانياً " مش بتظهر الفجوة خالص" اليس هذا المطلوب من برنامجك هي فجوه لن تراها سترى ما تحتها
لا انا قصدى ان افجوه مش بتظهر يعنى لما احط اى حاجه خلف المربع مش بتبان على العموم هاجرب على المثال اللى حضرتك كاتبه و هابلغك بالنتيجه دلوقتى علطول
انا عملت مربع ذيادة على الكود اللى انت حاطه و خليته يبقى خلف المربع الاول وغيرت لونه المربع كله بيظهر معايا مع ان المفروض اللى يظهر من المربع هو شكل الدائرة اللى هيا المفروض تمثل الفجوه
ياريت تجرب الكود اللى انا كاتبه و تقولى النتيجة
#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;
}اقتباساعتقد ان ال OpenGL توفر هذه الخدمه من خلال Boolean Operations وهي ليس بتلك الصعوبه !!!
هلا أخوي ،
كنت أتكلّم على مستوى vertices ، وليس استخدام العمليات اللونية على البكسلات fragments ( هذا ما فهمته من كلمة فجوة ) ، أعتقد أنها ستصبح العملية أسهل بتحميل صورة مثل هذه :
أن تحصل على ماتريد ، هناك مثال :
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri