OpenGL ا بی ک ی فرا گ ی س ی و ن ه م ا رب بPhD candidate ه گان ی ش خ ب ی! ست ه د داوب ام خ ه ب ن م ه د سه ل خA.M. Safaei
Jan 15, 2016
OpenGLبرنامه نویسی گرافیکی با
PhD candidate
به نام خداوند هستی بخش یگانه
جلسه دهم
A.M. Safaei
گرافیک کامپیوتری جلسه دهم
OpenGLورودی های در محیط
گرافیک کامپیوتری
:: ورودیها :: صفحه کلید glutKeyboardFunc
GLUT دو ت�ابع را ب�رای وق�ایع مرب�وط ب�ه ص�فحه کلی�د هنگ�ام فش�ردن
یک کلید فراهم نموده است.
glutKeyboardFunc جهت پ�ردازش مرب�وط ب�ه فش�ردن ش�دن کلی�د :
ه�ای معم�ولی اس�تفاده می ش�ود ) ح�روف الفب�ا ، اع�داد و تم�ام کلی�د
هایی که دارای کد اسکی هستند(.
یکی از کاربرده�ای این ت�ابع ف�راهم آوردن راهی ب�رای خ�روج از برنام�ه
کلی�د فش�ردن ت�ابع ESCAPEهنگ�ام اینک�ه ب�ه توج�ه ب�ا باش�د، می
glutMainLoop.یک حلقه نامتناهی تولید می کند
جلسه هشتم
ESCAPE = 27کد اسکی
void keyboard(unsigned char key, int x, int y)} if( key == 27) exit(0);{
گرافیک کامپیوتری
:: ورودیها :: صفحه کلید glutSpecialFunc
glutSpecialFunc جهت پ�ردازش مرب�وط ب�ه فش�ردن ش�دن کلی�د ه�ای :
ش�کل را ب�ه F1خ�اص اس�تفاده می ش�ود ، بعن�وان مث�ال ب�ا فش�ردن کلی�د
به رنگ آبی در بیاورد.F3 به رنگ سبز و کلید F2رنگ قرمز و با کلید
جلسه هشتم
void special( int key, int x, int y)}switch(key)} case GLUT KEY F1: r=1.0; g=0.0; b=0.0; break; case GLUT KEY F2: r=0.0; g=1.0; b=0.0; break; case GLUT KEY F3: r=0.0; g=0.0; b=1.0; break;{ {
گرافیک کامپیوتری
ورودیها :: کلید های پیرایشی glutGetModifiers)(
جلسه هشتم
( پیرایشی های کلید آیا اینکه تعیین ,ALT, CTRLجهت
SHIFT می اس�تفاده بازگش�تی ت�ابع از ان�د ش�ده فش�رده )
شود.
:GLUT_ACTIVE_SHIFT ش�دن فش�رده ص�ورت در Shift و
روشن باشد.Caps Lockروشن بودن کلید
GLUT_ACTIVE_CTRL در ص�ورتی ک�ه کلی�د :CTRL را فش�ار
دهید.
:GLUT_ACTIVE_ALT کلی�د ک�ه ص�ورتی در ALT فش�ار را
دهید.
گرافیک کامپیوتری جلسه هشتم
مث�ال :در اس�تفاده از کلی�د ه�ای پیرایش�ی ت�ابع مربوط�ه ب�ه ص�فحه کلی�د را
رن�گ قرم�ز ALT+rط�وری تغی�یر می دهیم ک�ه در ص�ورت فش�رده ش�دن
void keyboard(unsigned char key, int x, int y)غیر فعال و در غیر اینصورت فعال شود.
}
if( key == 27)
exit(0);
else if (key == 'r') }
int mod = glutGetModifiers();
if( mod == GLUT_ACTIVE_ALT)
r = 0.0;
else
r = 1.0;
{
{
ورودیها :: کلید های پیرایشی glutGetModifiers)(
گرافیک کامپیوتری
:: ورودیها :: ماوس glutMouseFunc
همانن�د ص�فحه کلی�د درGLUT ب�رای م�اوس ت�ابع زی�ر در نظ�ر
گرفت�ه ش�ده اس�ت، ک�ه کلی�ک ک�ردن ب�ا م�اوس را کن�ترل می
کند.
پارامتر اول این ت�ابع جهت مش�خص ک�ردن اینک�ه ک�دام دکم�ه
ی�ا ره�ا ش�ده می باش�د و دارای س�ه م�اوس فش�رده ش�ده و
حالت زیر می باشد:
.1GLUT_LEFT_BUTTON
.2GLUT_MIDDLE_BUTTON
.3GLUT_RIGHT_BUTTON
جلسه هشتم
void glutMouseFunc( void (*func) (int button, int state, int x, int y));
گرافیک کامپیوتری
:: ورودیها :: ماوس glutMouseFunc
فش�رده یع�نی مربوط�ه دکم�ه وض�عیت ت�ابع، دوم پارامتر
شدن یا رها شدن را مقدار دهی می کند.
.1GLUT_DOWN
.2GLUT_UP
جلسه هشتم
void glutMouseFunc( void (*func) (int button, int state, int x, int y));
void mouse(int b, int s, int x, int y)}switch(b) } case GLUT LEFT BUTTON: if( s == GLUT DOWN) r = 1.0; else r = 0.0; break; }}
ماوس های دکمه فشردن تشخیص
گرافیک کامپیوتری جلسه دهم
در این مبحث الگوریتم های برش خط و
برش چند ضلعی بررسی می شود
)کوتاه سازی(Clipping برش
گرافیک کامپیوتری جلسه دهم
گرافیک کامپیوتری جلسه دهم
بــرش خــط Line Clipping -
گرافیک کامپیوتری
) برش خط )کوتاه سازی خط
جلسه دهم
رسم یک خط درون یک مستطیل با اضالع افقی و عمودی •
می نامیم درون مستطیل و Pفرض کنید یک راس پاره خط که آن را •
می نامیم خارج از مستطیل باشد و در نظر Qراس دیگر که آن را
با PQ نقطه تقاطع پاره خط I را رسم کنیم ) PIداریم فقط پاره خط
مرز مستطیل است.
گرافیک کامپیوتری
) برش خط )کوتاه سازی خط
جلسه دهم
معین می شود، xmin, xmax, ymin, ymaxمستطیل توسط چهار عدد •
و با yO=ymax ضلع باالی مستطیل را قطع کرده است : PQچون خط
:PBQ و PAIتوجه به تشابه دو مثلث
را می PIاز طریق مقدار باال به راحتی پاره خط •
توان رسم کرد.
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی خط
کوهن - ساترلند
Cohen-Sutherland Line Clipping
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
یکی از روشهای موثر برای کوتاه سازی خط الگورتیم کوهن – ساترلند می •
باشد، که با امتداد اضالع مستطیل، صفحه نمایش را به نه قسمت تقسیم
می کندو به هر کدام از این نه بخش یک کد چهار بیتی کد خروج اختصاص
داده، هر بیت کد خروج در صورتی یک می شود که ناحیه متناظر با آن از
سمت معین پنجره خارج شده باشد.
0000 00100001
1001
0101 0100
1000 1010
0110
: 1 بیت
چپ
: 2 بیت
راست
: 3 بیت
پائین
: 4 بیت
باال
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
خواه�د ب�ود، 0000اگ�ر نقط�ه ای درون مس�تطیل ق�رار گ�یرد ک�د خ�روج آن •
است.1000کد خروج نقطه که دقیقا باالی مستطیل قرار دارد
نش�ان c2 و c1اگ�ر ف�رض ش�ود ک�ه خ�د خ�روج دو انته�ای پ�اره خ�ط را ب�ا •
دهیم، در اینصورت داریم :
آنگ�اه پ�اره خ�ط ک�امال درون پنج�ره می باش�د و بای�د c2 = 0000 ی�ا c1اگ�ر •
بطور کامل رسم شود.
باش�د آنگ�اه پ�اره خ�ط ک�امال خ�ارج از 0000 مخ�الف ب�ا مق�دار c2 و c1اگ�ر •
پنجره بودن و نباید رسم شود.
پ�اره خ�ط مزب�ور • آنگ�اه نب�ود برق�رار دوم و اول از ح�االت هیچک�دام اگ�ر
توس�ط م�رز پنج�ره ب�ه دو بخش تقس�یم می ش�ود ک�ه ب�رای ه�ر دو بخش بای�د
مراحل اول و دوم را تکرار کنیم .
برای اینک�ه بفهمیم پ�اره خ�ط ک�دام م�رز را قط�ع ک�رده اس�ت کافیس�ت م�رز •
متناظر را با بیتی را که مقدار آن یک است تعیین کنیم.
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
(Xmin, Ymax)
(Xmin, Ymin)
(Xmax, Ymax)
(Xmax, Ymin)
یکی از رئوس را به دلخواه انتخاب می کنیم، اگر خارج از •محدوده بود، نقطه تقاطع خط با مرز پنجره دید را پیدا می
کنیم و این نقطه جدیدرا جایگزین نقطه خارج از محدوده می کنیم.
چهاربیتی راس مورد نظر را برای تشخیص مرز، کافیست کد•بررسی نمود.
1001
0101
0001 0000
1000
0010
1010
0100 0110
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
: 1 بیت
چپ
: 2 بیت
راست
: 3 بیت
پائین
: 4 بیت
باال
منطقه
شماره بیت
گرافیک کامپیوتری جلسه دهم
0000
0100
1000
0001 0010
0110
10101001
0101
A1
A2
1. A1=0000,A2=00002. (both 0000) – Yes -> accept & draw3. 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4
1. A1=0000,A2=00002. (both 0000) – Yes -> accept & draw3. 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4
الگوریتم
گرافیک کامپیوتری جلسه دهم
0000
0100
0001 0010
01100101
A1
A2
B1
B21. B1=1001,B2=10102. (both 0000) – No3. AND Operation
B1 1001B2 1010Result 1000
3.1 (not 0000) – Yes reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4
الگوریتم
1. B1=1001,B2=10102. (both 0000) – No3. AND Operation
B1 1001B2 1010Result 1000
3.1 (not 0000) – Yes reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4
1. B1=1001,B2=10102. (both 0000) – No3. AND Operation
B1 1001B2 1010Result 1000
3.1 (not 0000) – Yes reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4
1. B1=1001,B2=10102. (both 0000) – No3. AND Operation
B1 1001B2 1010Result 1000
3.1 (not 0000) – Yes reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4
1001 1000 1010
گرافیک کامپیوتری جلسه دهم
0000
0100
1000
0010
0110
10101001
0101
A1
A2
C1
C2
1. C1=0001,C2=00002. (both 0000) – No 3. AND Operation
0001 0000
result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2
1. C1=0001,C2=00002. (both 0000) – No 3. AND Operation
0001 0000
result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2
1. C1=0001,C2=00002. (both 0000) – No 3. AND Operation
0001 0000
result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2
C1’
1. C1=0001,C2=00002. (both 0000) – No 3. AND Operation
0001 0000
result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2
1. C1=0001,C2=00002. (both 0000) – No 3. AND Operation
0001 0000
result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2
C1’
C2
0001
1. C1=0001,C2=00002. (both 0000) – Yes -> accept & draw3. 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4
الگوریتم
اگ�ر نقط�ه تق�اطع روی م�رز چپ ی�ا راس�ت باش�د و دو راس آغ�از •
خ������������������ط پای������������������ان و
(x1 , y1( و )x2 , y2 و ش�یب خ�ط باش�ند )m باش�د، مختص�ات
( عبارتست از:xt , ytنقطه تقاطع )
الگوریتم کوتاه سازی کوهن - ساترلند
xt = Xmin (چپ) یا xt = Xmax (راست)
yt = y1 + m(xt - x1 )
گرافیک کامپیوتری جلسه دهم
اگ�ر نقط�ه تق�اطع روی م�رز ب�اال ی�ا پ�ایین باش�د و دو راس آغ�از و •
خ�������������������������ط پای�������������������������ان
(x1 , y1( و )x2 , y2 و ش�یب خ�ط باش�ند )m باش�د، مختص�ات
( عبارتست از:xt , ytنقطه تقاطع )
الگوریتم کوتاه سازی کوهن - ساترلند
xt = x1 + (yt - y1 )/m
yt = Ymin (باال) یا yt = Ymax (پایین)
گرافیک کامپیوتری جلسه دهم
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
1. Assign a region code for each endpoints.
2. If both endpoints have a region code 0000 --- accept these line.
3. Else, perform the logical AND operation for both region codes.
3.1 if the result is not 0000 - reject the line.
3.2 else – (result = 0000, need clipping)
3.2.1. Choose an endpoint of the line that is outside the window.
3.2.2. Find the intersection point at the window boundary (base on region code).
3.2.3. Replace endpoint with the intersection point and update the
region code.
3.2.4. Repeat step 2 until we find a clipped line either accepted or rejected.
4. Repeat step 1 for other lines.
گرافیک کامپیوتری جلسه دهم
#define LEFT EDGE 0x1
#define RIGHT EDGE 0x2
#define BOTTOM EDGE 0x4
#define TOP EDGE 0x8
unsignedchar encode (GLint x, GLint y, GLint wx1, GLint wy1, GLint wx2, GLint wy2)
{
unsigned char code = 0x00;
if(x < wx1) code = code | LEFT EDGE;
if(x > wx2) code = code | RIGHT EDGE;
if(y < wy1) code = code | BOTTOM EDGE;
if(y > wy2) code = code | TOP EDGE;
return (code);
}
الگوریتم کوتاه سازی کوهن - ساترلند
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
#define INSIDE(a) (!a)
#define REJECT(a,b) (a & b)
#define ACCEPT(a,b) (!(a|b))
void SwapPts(GLint *x1, GLint *y1, GLint *x2, GLint *y2)
{
GLint temp;
temp = *x1; *x1=*x2; *x2=temp;
temp = *y1; *y1=*y2; *y2=temp;
}
void SwapCodes (unsigned char *c1, unsigned char * c2)
{
unsigned char temp;
temp = *c1, *c1=*c2; *c2=temp;
}
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلند
voidClipLine (GLint wx1, GLint wy1,GLint wx2, GLint wy2, GLint x1, GLint y1,
GLint x2, GLint y2){
unsigned char code1, code2;
int done = FALSE, draw = FALSE;
GLfloat m;
while (!done){
code1=encode(x1, y1, wx1, wy1, wx2, wy2);
code2=encode(x2, y2, wx1, wy1, wx2, wy2);
if(ACCEPT (code1, code2))
{
done = TRUE;
draw = TRUE;
}
ادامه الگوریتم اسالید بعد
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی کوهن - ساترلندelse if(REJECT (code1, code2))done = TRUE;else { if(INSIDE (code1)) { SwapPts (&x1, &y1, &x2, &y2); SwapCodes(&code1, &code2); } if(x2 != x1) m = (GLfloat) (y2-y1)/(x2-x1); if(code1 & LEFT EDGE) { y1 += (wx1 - x1)*m; x1 = wx1; } else if(code1 & RIGHT EDGE) { y1 += (wx2 - x1)*m; x1 = wx2; }
elseif(code1 & BOTTOM EDGE){ if(x2 != x1) x1 += (wy1 - y1)/m; y1 = wy1; } else if(code1 & TOP EDGE) { if(x2 != x1) x1 += (wy2 - y1)/m; y1 = wy2; } }}if (draw) MidpointLine(x1, y1, x2, y2);}
ادامه الگوریتم از اسالید قبل
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی چند ضلعی
ساترلند - هاجمن
Sutherland-Hodgman Clipping
ابت�اد تم�ام • در این الگ�وریتم ب�رای کوت�اه س�ازی چن�د ض�لعی
کوت�اه ی�ک ض�لع مس�تطیل ب�ه نس�بت را اض�الع چن�د ض�لعی
خ�ط ی�ک بص�ورت را ض�لع آن واق�ع در ک�نیم، می س�ازی
می انج�ام س�ازی کوت�اه عم�ل و گرفت�ه نظ�ر در نامتن�اهی
دهیم .
ض�لعی • چن�د بعن�وان را اص�لی ض�لعی چن�د روش این در
ورودی و جن�د ض�لعی جدی�د را بعن�وان چن�د ض�لعی خ�روجی در
نظر می گیرم.
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
چهار حالت ممکن برای یک ضلع در الگوریتم ساترلند - هاجمن
outside inside
v1v1’
v2
outside inside
v1
v2
outside inside
v1v1’
v2
outside inside
v1
v2
Outside to inside:Output: v1’ and v2
Inside to inside:Output: v2
Inside to outside:Output: v1’
Outside to outside:Output: nothing
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V2
V3
<V1, V2, V3>Left
V1
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1'
V2
V3
<V1, V2, V3>Left
<V1’ >
V1
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1'
V2’V3
<V1, V2, V3>Left
<V1’, V2’, V3 >
V1
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1'
V2’V3
<V1, V2, V3>Left
<V1’, V2’, V3 , V1 >
V1
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1'
V2’V3
Right<V1’, V2’, V3 , V1 >
V1
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1’’
V2’V3
Bottom<V1’, V2’, V3 , V1 >
V1
<V1’’ >
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1’’
V2’V3
Bottom<V1’, V2’, V3 , V1 >
V1
<V1’’, V2’, V3 >
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1’’
V2’V3
Bottom<V1’, V2’, V3 , V1 >
V1
<V1’’, V2’, V3, V3’ >
V3’’
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1’’
V2’V3
Bottom<V1’, V2’, V3 , V1 >
<V1’’, V2’, V3, V3’ >
V3’’
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
V1’’
V2’V3
Top<V1’’, V2’, V3, V3’ >
V3’’
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
v1
v5
v2 v3
v4
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
2مثال :
v1
v5
v2 v3
v4
v1
v5
v1
Clipping edge Clipping edge Clipping edge
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
v1
v5
v2 v3
v4
Now v1v2:
Clipping edge Clipping edge Clipping edge
v1
v2
v1
v2
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
v1
v5
v2 v3
v4
Clipping edge Clipping edge Clipping edge
v1
v2v2 v3v2 v3
Now v2v3:
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
v1
v5
v2 v3
v4
Clipping edge Clipping edge Clipping edge
v1
v2v2 v3v3
v4
i1
Now v3v4:
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن
v1
v5
v2 v3
v4
Clipping edge Clipping edge Clipping edge
v1
v2v2 v3
i1
v5
v4 i2
v5
Now v4v5 :
گرافیک کامپیوتری جلسه دهم
الگوریتم کوتاه سازی ساترلند - هاجمن