




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、計算機(jī)圖形學(xué)實驗報告姓名:學(xué)號:班級:時間:2016年12月_實驗一OpenGL編程與圖形繪制1實驗?zāi)康牧私釵penGL編程,并熟悉OpenGL的主要功能、繪制流程和基本語法。學(xué)會配置OpenGL環(huán)境,并在該環(huán)境中編程繪圖。2實驗內(nèi)容OpenGL的主要功能:模型繪制、模型觀察、顏色模式、光照應(yīng)用、圖像效果增強(qiáng)、位圖和圖像處理、紋理映射、實時動畫和交互技術(shù)。OpenGL的繪制流程分為兩個方面:一個完整的窗口系統(tǒng)的OpenGL圖形處理系統(tǒng)的結(jié)構(gòu)為:最底層為圖形硬件,第二層為操作系統(tǒng),第三層為窗口系統(tǒng),第四層為OpenGL,最上面的層為應(yīng)用軟件;OpenGL命令將被放在一個命令緩沖區(qū)中,這樣命令緩沖
2、區(qū)中包含了大量的命令、頂點(diǎn)數(shù)據(jù)和紋理數(shù)據(jù)。當(dāng)緩沖區(qū)被清空時,緩沖區(qū)中的命令和數(shù)據(jù)都將傳遞給流水線的下一個階段。OpenGL的基本語法中相關(guān)庫有:OpenGL核心庫:gl、OpenGL實用程序庫:glu、OpenG編程輔助庫:aux、OpenGL實用程序工具包(OpenGLutilitytoolkit,GLUT):glut、Windows專用庫:wgl。OpenGL的基本語法中命名規(guī)則為:OpenGL函數(shù)都遵循一個命名約定,即采用以下格式:庫前綴根命令可選的參數(shù)個數(shù)可選的參數(shù)類型。了解了上述基礎(chǔ)知識后,配置好OpenGL環(huán)境,然后在該環(huán)境中編程練習(xí)圖形的繪制,本次實驗主要是對點(diǎn)的繪制、直線的繪制
3、和多邊形面的繪制。3實驗代碼及結(jié)果3.1點(diǎn)的繪制:#includegl/glut.hvoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅/glRectf(50.0f,100.0f,1
4、50.0f,50.0f);/繪制一個矩形glPointSize(10);/三個點(diǎn)glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush();/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSiz
5、e(400,300);glutInitWindowPosition(100,120);glutCreateWindow(glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(矩形”);glutDisplayFunc(Display);Initial();glutMainLoop();/設(shè)置窗口的尺寸/設(shè)置窗口位置/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)return0;運(yùn)行結(jié)果:3.2直線的繪制:運(yùn)行結(jié)果:3.2直線的繪制:#includev
6、oidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色/glRectf(50.0f,100.0f,150.0f,50.0f);/繪制一個矩形glBegin(GL_LINE_LOOP);
7、/五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush();清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutC
8、reateWindow(glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(,矩形”);glutDisplayFunc(Display);Initial();glutMainLoop();/設(shè)置窗口的尺寸/設(shè)置窗口位置/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)return0;運(yùn)行結(jié)果:3.3多邊形面的繪制:#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色
9、為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色/glRectf(50.0f,100.0f,150.0f,50.0f);/繪制一個矩形glBegin(GL_TRIANGLES);/等邊三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(3
10、0,0);glEnd();glFlush();/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSize(400,300);/設(shè)置窗口的尺寸glutInitWindowPosition(100,120);/設(shè)置窗口位置glutCreateWindow(矩形”);glutDisplayFunc(Display);Initial();glutMainLoop();retur
11、n0;/創(chuàng)建一個名為矩形的窗口/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)實驗二直線繪制實驗實驗?zāi)康臑榱诉M(jìn)一步熟悉OpenGL編程,了解基本圖形生成算法中的直線繪制,學(xué)會直線繪制算法中最常用的三種算法:數(shù)值微分法、中點(diǎn)畫線算法和Bresenham算法。實驗內(nèi)容數(shù)值微分法數(shù)值微分法直接從直線的微分方程生成直線。給定直線的兩端點(diǎn):P0(X0,Y0)和P1(X1,Y1),得到直線的微分方程dy/dx=Ay/Ax=(Yl-YO)/(Xl-XO)=k。數(shù)值微分算法的原理是,由于直線的一階導(dǎo)數(shù)是連續(xù)的,而且&和Ay是成比例的,因此通過在當(dāng)前位置(Xi,Y
12、i)分別加上兩個小增量ex和&(&為無窮小的正數(shù))來求下一點(diǎn)(X(i+l),Y(i+l)的x,y坐標(biāo)。中點(diǎn)畫線算法給定直線的兩端點(diǎn):PO(XO,YO)和P1(X1,Y1),可得到直線方程F(x,y)=y-kx-b=O且k=A/x=(YlYO)/(XlXO)。繪圖過程如下:O輸入直線的兩端點(diǎn)P0(X0,Y0)和P1(X1,Y1)。Q.計算初始值A(chǔ)x,y,d=Ax-2Ay,x=X0,y=Y0.Q.繪制點(diǎn)(x,y)。判斷d的符號,若d0,貝Hx,y)更新為(x+l,y+l),d更新為d+2Ax-2y;否則(x,y)更新為(x+1,y),d更新為Ay。Q.當(dāng)直線沒有畫完時,重復(fù)步驟,否則結(jié)束。Bres
13、enham算法算法步驟如下:Q.輸入直線兩端點(diǎn)P0(X0,Y0)和P1(X1,Y1)。Q.計算初始值A(chǔ)x,y,e=-Ax,x=X0,y=Y0。Q.繪制點(diǎn)(x,y)。Q.e更新為e+2Ay。判斷e的符號,若e0,則(x,y)更新為(x+l,y+l),同樣將e更新為e-2Ax;否則(x,y)更新為(x+l,y)。Q.當(dāng)直線沒有畫完時,重復(fù)步驟Q和Q;否則結(jié)束。實驗代碼及結(jié)果3.1數(shù)值微分算法編程繪制直線代碼:#include#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_P
14、ROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色glBegin(GL_LINES);intx0=10;inty0=20;intx1=30;inty1=40;intcolor=10;intdx,dy,epsl,k;floatx,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0;/if(abs(dx)
15、abs(dy)epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k=epsl;k+)glVertex2i(int(x+0.5),(int)(y+0.5);x+=xIncre;y+=yIncre;glEnd();glFlush();/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
16、/初始化窗口的顯示模式glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(,矩形”);glutDisplayFunc(Display);Initial();glutMainLoop();/設(shè)置窗口的尺寸/設(shè)置窗口位置/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)return0;實驗結(jié)果:2.2
17、中點(diǎn)畫線算法編程繪制直線代碼:#include#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色glBegin(GL_POINTS);intx0=50;inty0
18、=20;intx1=100;inty1=120;intcolor=10;intdx,dy,d,UpIncre,DownIncre,x,y;if(x0 x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=2*dy;while(x=x1)glVertex2i(x,y);x+;if(d0)y+;d+=UpIncre;elsed+=DownIncre;/清空/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序glFlush();intmain(intarg
19、c,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(,矩形”);glutDisplayFunc(Display);Initial();glutMainLoop();/設(shè)置窗
20、口的尺寸/設(shè)置窗口位置/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)return0;實驗結(jié)果:2.3Bresenham算法編程繪制直線代碼:#include#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前
21、背景色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色/Bresenham算法glBegin(GL_POINTS);intx0=10;inty0=20;intx1=90;inty1=90;intcolor=10;intx,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x0)y+;e=e-2*dx;glEnd();glFlush();/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplay
22、Mode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的現(xiàn)實模式glutInitWindowSize(400,300);/設(shè)置窗口的尺寸glutInitWindowPosition(100,200);設(shè)置窗口的位置glutCreateWindow(點(diǎn));創(chuàng)建一個名為矩形的窗口glutDisplayFunc(Display);/設(shè)置當(dāng)前窗口的顯示函數(shù)Initial();/完成窗口的初始化glutMainLoop();/啟動主GLUT事件處理循環(huán)return0;實驗結(jié)果:實驗三圓繪制實驗實驗?zāi)康膶嶒瀮?nèi)容八分法畫圓圓心位于原點(diǎn)的圓有4條對稱軸x=O,y=O,y=x,y=-x。若已知圓上任
23、一點(diǎn)(x,y),可以得到其在圓周上關(guān)于四條對稱軸的另外7個點(diǎn)(y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x,-y)。中點(diǎn)Bresenham畫圓算法算法步驟如下:Q輸入圓的半徑RQ計算初始值d=l-R,x=O,y=R。繪制點(diǎn)(x,y)及其在八分圓中的另外7個對稱點(diǎn)。Q判斷d的符號。若d0,則先將d更新為d+2x+3,再將(x,y)更新為(x+l,y);否則先將d更新為d+2(x-y)+5,再將(x,y)更新為(x+l,y-l)。Q當(dāng)xy時,重復(fù)步驟和Q;否則結(jié)束。橢圓的中點(diǎn)Bresenham算法算法步驟如下:輸入橢圓的長半軸a和短半軸bo計算初始值d=b人2+a人2
24、(-b+0.25),x=0,y=b。繪制點(diǎn)(x,y)及其在四分象限上的另外三個對稱點(diǎn)。判斷d的符號。若d=0,則先將d更新為d+bA2(2x+3),再將(x,y)更新為(x+1,y)否則先將d更新為d+bA2(2x+3)+aA2(-2y+2),再將(x,y)更新為(x+l,y-l)。當(dāng)匕人2(x+1)a人2(丫-0.5)時,重復(fù)步驟和;否則轉(zhuǎn)到步驟。6用上半部分計算的最后點(diǎn)(x,y)來計算下半部分中d的初值d=bA2(x+0.5)A2+aA2(y-1)A2-aA2bA2繪制點(diǎn)(x,y)及其在四分象限上的另外三個對稱點(diǎn)。判斷d的符號。若d=0時,重復(fù)步驟0和;否則結(jié)束。實驗代碼及結(jié)果八分法畫圓程
25、序代碼:#include#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidCirclePoint(intx,inty,intcolor)glVertex2i(x+50,y+50);glVertex2i(y+50,x+50);glVertex2i(-y+50,x+50);glVertex2i(-x+50,y+50);glVertex2i(-x+50
26、,-y+50);glVertex2i(-y+50,-x+50);glVertex2i(y+50,-x+50);glVertex2i(x+50,-y+50);voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色glPointSize(10);glBegin(GL_POINTS);CirclePoint(10,20,20);glEnd();glFlush();/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv
27、)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSize(400,300);/設(shè)置窗口的尺寸glutInitWindowPosition(100,120);/設(shè)置窗口位置glutCreateWindow(矩形”);glutDisplayFunc(Display);Initial();glutMainLoop();return0;/創(chuàng)建一個名為矩形的窗口/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)中點(diǎn)Bresenha
28、m算法繪制圓代碼#include#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidCirclePoint(intx,inty,intcolor)glVertex2i(x+50,y+50);glVertex2i(y+50,x+50);glVertex2i(-y+50,x+50);glVertex2i(-x+50,y+50);glVertex2i(-
29、x+50,-y+50);glVertex2i(-y+50,-x+50);glVertex2i(y+50,-x+50);glVertex2i(x+50,-y+50);voidMidBresenhamCircle(intr,intcolor)intx,y,d;x=0;y=r;d=1-r;while(x=y)CirclePoint(x,y,color);if(d0)d+=2*x+3;elsed+=2*(x-y)+5;y-;x+;voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置
30、當(dāng)前的繪圖顏色為紅色glPointSize(3);glBegin(GL_POINTS);MidBresenhamCircle(20,10);/清空/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序glFlush();intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow(,glutInitWindow
31、Size(400,300);glutInitWindowPosition(100,120);glutCreateWindow(,矩形”);glutDisplayFunc(Display);Initial();/設(shè)置窗口的尺寸/設(shè)置窗口位置/創(chuàng)建一個名為矩形的窗口/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化glutMainLoop();return0;完成窗口glutMainLoop();return0;完成窗口GLUT事件處理循環(huán)中點(diǎn)Bresenham算法繪制橢圓代碼:#include#includevoidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.
32、0f);/設(shè)置窗口背景顏色為白色glMatrixMode(GL_PROJECTION);/指定設(shè)置投影參數(shù)gluOrtho2D(0.0,200.0,0.0,150.0);/設(shè)置投影參數(shù)voidMidBresenhamEllipse(inta,intb,intcolor)intx,y;floatd1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);glVertex2i(x+50,y+50);glVertex2i(-x+50,-y+50);glVertex2i(-x+50,y+50);glVertex2i(x+50,-y+50);while(b*b*(x+1)a*a*(y-0.5)
33、if(d10)if(d2=0)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);y-;glVertex2i(x+50,y+50);glVertex2i(-x+50,-y+50);glVertex2i(-x+50,y+50);glVertex2i(x+50,-y+50);voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/用當(dāng)前背景顏色填充窗口glColor3f(1.0f,0.0f,0.0f);/設(shè)置當(dāng)前的繪圖顏色為紅色glPointSize(3);glBegin(GL_POINTS);Mid
34、BresenhamEllipse(40,25,10);glEnd();glFlush();/清空OpenGL命令緩沖區(qū),執(zhí)行OpenGL程序intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的顯示模式glutInitWindowSize(400,300);/設(shè)置窗口的尺寸glutInitWindowPosition(100,120);/設(shè)置窗口位置glutCreateWindow(,矩形”);創(chuàng)建一個名為矩形的窗口glutDisplayFunc(Displ
35、ay);Initial();glutMainLoop();return0;/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù)/完成窗口初始化完成窗口GLUT事件處理循環(huán)實驗四填充算法實驗實驗?zāi)康恼莆沼脪呙杈€種子填充法,實現(xiàn)掃描線種子填充算法填充任一多邊形區(qū)域的程序?qū)嶒瀮?nèi)容算法步驟如下:種子像素入棧。執(zhí)行如下三步操作:Q棧頂像素出棧。Q填充出棧像素所在掃描線的連續(xù)像素段,從出棧的像素開始沿掃描線向左和向右填充,直到遇到邊界像素為止,即每出棧一個像素,就對包含該像素的整個掃描線區(qū)間進(jìn)行填充,并且記錄下此時掃描線區(qū)間的x坐標(biāo)范圍xl,x2。Q分別檢查上、下兩條掃描線上位于xl,x2坐標(biāo)區(qū)間內(nèi)的
36、未被填充的連續(xù)水平像素段,將每個連續(xù)像素段的最左像素取作種子像素壓人棧堆。檢查棧是否為空,若棧非空重復(fù)執(zhí)行步驟(2),若棧為非空則結(jié)束。實驗代碼及結(jié)果代碼:#includegl/glut.h#includemath.h#includestdlib.h#includeconio.h#includetypedeffloatColor3;structPointGLintx;GLinty;std:stackstk;voidinit(void)glClearColor(l.0,l.0,l.0,l.0);/Setdisplay-windowcolorwhite.glMatrixMode(GL_PROJEC
37、TION);gluOrtho2D(0.0,400.0,0.0,400.0);voidsetPixel(GLintx,GLinty);/種子像素坐標(biāo)voidsetPixel(Pointcur_point)glBegin(GL_POINTS);glVertex2i(cur_point.x,cur_point.y);glEnd();glFlush();voidgetPixel(Pointcur_point,Colorc)glReadPixels(cur_point.x,cur_point.y,l,l,GL_RGB,GL_FLOAT,c);boolrgbColorEqual(Colorcl,Color
38、c2)/cl顏色數(shù)據(jù)與c2顏色數(shù)據(jù),當(dāng)正負(fù)誤差不超過0.0001時,返回值為1,否則為0if(abs(cl0-c20)0.00l)|(abs(cll-c2l)0.00l)|(abs(cl2-c22)0.00l)return0;elsereturn1;intFillLineRegion(Pointcur_point,ColorfillColor,ColorborderColor,intdirection)intcount=0;ColorinteriorColor;glColor3f(fillColor0,fillColor1,fillColor2);getPixel(cur_point,inte
39、riorColor);while(!(rgbColorEqual(interiorColor,borderColor)&!(rgbColorEqual(interiorColor,fillColor)/這個判斷保證讀取的像素的顏色數(shù)據(jù)與邊界顏色還有填充顏色數(shù)據(jù)在數(shù)值上相差較大/即當(dāng)正讀取像素不是多邊形邊界,且也沒有被填充,則執(zhí)行以下花括號內(nèi)的操作setPixel(cur_point);/setcolotofpixeltofillColor./為坐標(biāo)為(x,y)的像素上色if(direction=0)cur_point.x+;elsecur_point.x-;getPixel(cur_point
40、,interiorColor);count+;returncount;intIsPixelValid(Pointcur_point,ColorfillColor,ColorborderColor)ColorinteriorColor;getPixel(cur_point,interiorColor);if(!(rgbColorEqual(interiorColor,borderColor)&!(rgbColorEqual(interiorColor,fillColor)return1;elsereturn0;voidSearchLineNewSeed(intxLeft,intxRight,in
41、ty,ColorfillColor,ColorborderColor)/在種子像素所在掃描線上一條或下一條是掃描線尋找新種子像素intxt=xLeft;intseed_left=-1;Pointseed_point;Pointtemp_point;while(xt=xRight)seed_left=-1;temp_point.x=xt;temp_point.y=y;while(xt=xRight)/findthefirstvalidpointif(IsPixelValid(temp_point,fillColor,borderColor)seed_left=temp_point.x;break
42、;elsext+;temp_point.x=xt;while(xt=xRight)/findthenextinvalidpointif(IsPixelValid(temp_point,fillColor,borderColor)xt+;temp_point.x=xt;elsebreak;if(seed_left!=-1)seed_point.x=seed_left;seed_point.y=y;stk.push(seed_point);voidscanLine(Pointcur_point,ColorfillColor,ColorborderColor)intcount=0;intright,
43、left;Pointtemp_point;while(!stk.empty()Pointseed_point=stk.top();stk.pop();/種子像素出棧count=FillLineRegion(seed_point,fillColor,borderColor,0);/Z填充種子像素所在的掃描線右邊right=seed_point.x+count-1;temp_point.x=seed_point.x-1;temp_point.y=seed_point.y;count=FillLineRegion(temp_point,fillColor,borderColor,l);/填充種子像素
44、所在掃描線左邊left=seed_point.x-count;SearchLineNewSeed(left,right,seed_point.y-l,fillColor,borderColor);/在種子像素所在掃描線上方一條掃描線尋找新種子像素SearchLineNewSeed(left,right,seed_point.y+l,fillColor,borderColor);/在種子像素所在掃描線尋找新種子像素return;voidmyDraw(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0,0.0,0.0);glBegin(GL_LINE_L
45、OOP);glVertex2f(20.0f,80.0f);glVertex2f(30.0f,95.0f);glVertex2f(50.0f,95.0f);glVertex2f(60.0f,80.0f);glVertex2f(70.0f,95.0f);glVertex2f(90.0f,95.0f);glVertex2f(l00.0f,80.0f);glVertex2f(60.0f,30.0f);glEnd();/intx=60,y=60;種子像素坐標(biāo)為(60,60)structPointseed_point=65,65;ColorfillColor,borderColor;fillColor0=
46、l.0;fillColorl=0.0;fillColor2=0.0;borderColor0=0.0;borderColorl=0.0;borderColor2=0.0;/掃描的邊界的顏色要與上面的繪圖顏色一致stk.push(seed_point);/種子像素入棧scanLine(seed_point,fillColor,borderColor);glFlush();voidmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,4
47、00);glutInitWindowPosition(50,l00);glutCreateWindow(邊界”);init();glutDisplayFunc(myDraw)glutMainLoop()實驗五裁剪算法實驗實驗?zāi)康恼莆沼肅ohen-Sutherland法裁減直線,掌握用Sutherland-Hodgman算法裁剪多邊形的編程方法,并編程實現(xiàn)實驗內(nèi)容Cohen-Sutherland直線段裁剪算法的步驟如下:Q輸入直線段的兩端點(diǎn)坐標(biāo)Pl(xl,yl),P2(x2,y2),及窗口的4條邊界坐標(biāo)ywt,ywb,ywl,ywroQ對Pl,P2進(jìn)行編碼,點(diǎn)Pl的編碼為codel,點(diǎn)P2的編碼
48、為code2。Q若codel|code2=0,對直線段PlP2“簡取”之,轉(zhuǎn)Q;否則,若codel&code2!=0,對直線段“簡棄”之,轉(zhuǎn)當(dāng)上述兩條均不滿足時,進(jìn)行步驟QoQ確保Pl在窗戶外部。若Pl在窗口內(nèi),則交換Pl和P2的坐標(biāo)值和編碼。Q根據(jù)Pl編碼從低位喀什找編碼值為1的地方,從而確定Pl的窗口外的哪一側(cè),然后求出直線段與相應(yīng)窗口邊界的交點(diǎn)S,并用交點(diǎn)S的坐標(biāo)值替換Pl的坐標(biāo)值,即在交點(diǎn)S處把線段一分為二,并去掉PlS這一段??紤]到Pl是窗口外的一點(diǎn),因此可以去掉PlSo轉(zhuǎn)QQ用直線掃描轉(zhuǎn)換算法畫出當(dāng)前的直線段PlP2oQ算法結(jié)束。Sutherland-Hodgman算法:基本思想:
49、將多邊形的邊界作為一個整體,每次用窗口的一條邊界對要裁剪的多邊形進(jìn)行裁剪,體現(xiàn)“分而治之”的思想。每次裁剪時把落在窗口外部區(qū)域的圖形去掉,只保留落在窗口內(nèi)部區(qū)域的圖形,并把它作為下一次裁剪的多邊形。依次用窗口的4條邊界對多邊形進(jìn)行裁剪,則原始多邊形即被裁剪完畢。實驗代碼及結(jié)果Cohen-Sutherland直線段裁剪算法代碼:#includestdafx.h#defineLEFT_EDGE1#defineRIGHT_EDGE2#defineBOTTOM_EDGE4#defineTOP_EDGE8floatymin=100;intymax=300;intxmin=100;intxmax=300;
50、typedefstructLineaintx0;inty0;intx1;inty1;Linea;Lineal1=l1.x0=450,l1.y0=0,l1.x1=0,l1.y1=450;Lineal2=l2.x0=450,l2.y0=200,l2.x1=0,l2.y1=200;Lineal3=l3.x0=200,l3.y0=0,l3.x1=200,l3.y1=450;voidLineGL(Linea&li)/沒有&,引用改變li的值glBegin(GL_LINES);glColor3f(1.0f,0.0f,0.0f);glVertex2f(li.x0,li.y0);glColor3f(0.0f,
51、1.0f,0.0f);glVertex2f(li.x1,li.y1);/雖然兩個點(diǎn)的顏色設(shè)置不同,但是最終線段顏色是綠色glEnd();/因為glShadeModel(GL_FLAT)設(shè)置為最后一個頂點(diǎn)的顏色/決定整個圖元的顏色。intCompCode(intx,inty)intcode=0 x00;/此處是二進(jìn)制if(yymax)code=code|8;if(xxmax)code=code|2;if(x3)/total3,執(zhí)行兩次后total又加一done=1;flag=1;while(!done);if(accept)/線段位于窗口內(nèi)或者線段剪裁過accept=l;LineGL(li);e
52、lseli.x0=0;li.y0=0;li.x1=0;li.y1=0;LineGL(li);returnaccept;voidmyDisplay()glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glBegin(GL_LINE_LOOP);glVertex2f(100,100);glVertex2f(300,100);glVertex2f(300,300);glVertex2f(100,300);glEnd();LineGL(l1);LineGL(l2);LineGL(l3);glFlush();voidInit()glClearC
53、olor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);printf(PresskeyctoClip!nPresskeyrtoRestore!n);voidReshape(intw,inth)glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);/printf(#Reshapen);voidkeyboard(unsignedcharkey,intx,inty)swi
54、tch(key)casec:cohensutherlandlineclip(l1);cohensutherlandlineclip(l2);cohensutherlandlineclip(l3);glutPostRedisplay();break;caser:l1.x0=450;l1.y0=0;l1.x1=0;l1.y1=450;l2.x0=450;l2.y0=200;l2.x1=0;l2.y1=200;l3.x0=200;l3.y0=0;l3.x1=200;l3.y1=450;Init();glutPostRedisplay();break;casex:exit(0);break;defau
55、lt:break;intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(640,480);glutCreateWindow(Cohen-Sutherland);Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutKeyboardFunc(&keyboard);/按下鍵盤后會調(diào)用該函數(shù),鍵和鼠標(biāo)點(diǎn)擊位
56、置作為變量傳給keyboard函數(shù)glutMainLoop();return0;實驗結(jié)果:Sutherland-Hodgman算法代碼:/Sutherland-Hodgmantypedefstructdoublex,y;vec_t,*vec;inlinedoubledot(veca,vecb)returna-x*b-x+a-y*b-y;inlinedoublecross(veca,vecb)returna-x*b-y-a-y*b-x;inlinevecvsub(veca,vecb,vecres)res-x=a-x-b-x;res-y=a-y-b-y;returnres;intleft_of(v
57、eca,vecb,vecc)vec_ttmp1,tmp2;doublex;vsub(b,a,&tmp1);vsub(c,b,&tmp2);x=cross(&tmp1,&tmp2);returnx0;intline_sect(vecx0,vecx1,vecy0,vecy1,vecres)vec_tdx,dy,d;vsub(x1,x0,&dx);vsub(y1,y0,&dy);vsub(x0,y0,&d);doubledyx=cross(&dy,&dx);if(!dyx)return0;dyx=cross(&d,&dx)/dyx;if(dyx=1)return0;res-x=y0-x+dyx*dy
58、.x;res-y=y0-y+dyx*dy.y;return1;typedefstructintlen,alloc;vecv;poly_t,*poly;/activeedgetablepolypoly_new()return(poly)calloc(1,sizeof(poly_t);voidpoly_free(polyp)free(p-v);free(p);voidpoly_append(polyp,vecv)if(p-len=p-alloc)p-alloc*=2;if(!p-alloc)p-alloc=4;p-v=(vec)realloc(p-v,sizeof(vec_t)*p-alloc);
59、p-vp-len+=*v;intpoly_winding(polyp)returnleft_of(p-v,p-v+1,p-v+2);voidpoly_edge_clip(polysub,vecx0,vecx1,intleft,polyres)inti,side0,side1;vec_ttmp;vecv0=sub-v+sub-len-1,v1;res-len=0;side0=left_of(x0,x1,v0);if(side0!=-left)poly_append(res,v0);for(i=0;ilen;i+)v1=sub-v+i;side1=left_of(x0,x1,v1);if(side0+side1=0&side0)/*lastpointandcurrentstraddletheedge*/if(line_sect(x0,x1,v0,v1,&tmp)poly_append(res,&tmp);if(i=sub-len-1)break;if(side1!=-left)poly_append(res,v1);v0=v1;side0=side1;polypoly_clip(polysub,polyclip)inti;polyp1=poly_new(),p2=poly_n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廣西城市職業(yè)大學(xué)單招職業(yè)技能考試題庫及完整答案一套
- 2025年廣元中核職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫a4版
- 2025年貴州財經(jīng)職業(yè)學(xué)院單招職業(yè)技能考試題庫新版
- 2025年滁州城市職業(yè)學(xué)院單招職業(yè)技能考試題庫及完整答案一套
- 2025年廣東茂名農(nóng)林科技職業(yè)學(xué)院單招綜合素質(zhì)考試題庫及參考答案
- 2025年貴州省六盤水市單招職業(yè)傾向性測試題庫有答案
- 2025年廣州科技貿(mào)易職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫參考答案
- 2025年廣東嶺南職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫及答案一套
- 綠色物流配送信息平臺-深度研究
- 超市營銷策略創(chuàng)新-深度研究
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對法》及其應(yīng)用案例
- JGJ46-2024 建筑與市政工程施工現(xiàn)場臨時用電安全技術(shù)標(biāo)準(zhǔn)
- 肺炎的中醫(yī)護(hù)理方案
- 基本樂理及音樂常識類知識考試題及答案
- 轉(zhuǎn)學(xué)申請表、轉(zhuǎn)學(xué)證明
- 最新-路面標(biāo)線技術(shù)交底
- 鋁擠壓設(shè)備日常巡檢保養(yǎng)記錄
- 立風(fēng)井瓦斯管路安裝施工組織設(shè)計
- 附件 流動人員人事檔案轉(zhuǎn)遞通知單存根
- 計算機(jī)信息檢索第三章
- 低壓電工作業(yè)電工培訓(xùn)課件.ppt
評論
0/150
提交評論