南昌大學信工學院計算機圖形學實驗報告(附詳細代碼)_第1頁
南昌大學信工學院計算機圖形學實驗報告(附詳細代碼)_第2頁
南昌大學信工學院計算機圖形學實驗報告(附詳細代碼)_第3頁
南昌大學信工學院計算機圖形學實驗報告(附詳細代碼)_第4頁
南昌大學信工學院計算機圖形學實驗報告(附詳細代碼)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、實 驗 報 告實驗課程: 計算機圖形學 學生姓名: XXX 學 號: XXX 專業(yè)班級: 計算機科學與技術X班 20XX年XX月XX日目錄實驗一 直線和圓的生成3實驗二 區(qū)域填充12實驗三 裁剪算法15實驗四 Bezier曲線的繪制23實驗五 B樣條曲線的繪制27 南昌大學實驗報告學生姓名: 學 號: 專業(yè)班級: 實驗類型: 驗證 綜合 設計 創(chuàng)新 實驗日期: 實驗成績: 實驗一 直線和圓的生成一、實驗項目名稱直線和圓的生成二、實驗目的1、掌握DDA、Bresenham 直線生成算法;2、掌握中點畫圓生成算法三、實驗要求1、編程實現(xiàn)DDA、Bresenham算法生成直線2、編程實現(xiàn)中點畫圓的算

2、法四、實驗步驟1、根據(jù)實驗要求分析實驗,并寫出相應算法的實現(xiàn)2、選擇適當語言實現(xiàn)算法;3、調(diào)試程序。五、實驗內(nèi)容1、Bresenham畫線算法的實現(xiàn)#include<glglut.h>#include<stdlib.h>#include<math.h>void init(void)glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,500.0);void setPixel(int x,int y)glBegin(GL_POINTS);glVert

3、ex2i(x,y);glEnd();void lineBres(int x0,int y0,int xEnd,int yEnd)int dx=abs(xEnd-x0),dy=abs(yEnd-y0);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*(dy-dx);int x,y;if(x0>xEnd)x=xEnd;y=yEnd;elsex=x0;y=y0;setPixel( x, y);while(x<xEnd)x+;if(p<0)p+=twoDy;elsey+; p+=twoDyMinusDx;setPixel( x, y);void

4、 lineSegment(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0,0.0,1.0);lineBres(50,50,400,300);glFlush();void main(int argc,char* argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,300);glutCreateWindow("An Line OpenGL Pr

5、ogram");init();glutDisplayFunc(lineSegment);glutMainLoop();2、DDA算法的實現(xiàn)#include<glglut.h>#include<math.h>void init(void)glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,500.0);void setPixel(int x,int y)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();inline

6、 int round(const float a)return int(a+0.5);void lineDDA (int x0,int y0,int xEnd,int yEnd)int dx=xEnd-x0,dy=yEnd-y0,steps,k;float xIncrement,yIncrement,x=x0,y=y0;if(abs(dx)>abs(dy)steps=abs(dx);elsesteps=abs(dy);xIncrement=GLfloat(dx)/GLfloat(steps);yIncrement=GLfloat(dy)/GLfloat(steps);setPixel(

7、x, y);for(k=0;k<steps;k+)x+=xIncrement;y+=yIncrement;setPixel( x, y);void lineSegment(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);lineDDA(50,50,400,300);glFlush();void main(int argc,char* argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(5

8、0,100);glutInitWindowSize(400,300);glutCreateWindow("DDA OpenGL Program");init();glutDisplayFunc(lineSegment);glutMainLoop();3、圓的生成#include<glglut.h>#include <math.h>const int n = 20;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;void init(void)glClearColor(1.0,1.0,1.0

9、,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);void myDisplay(void)int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_POLYGON);for(i=0; i<n; +i)glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i);glEnd();glFlush();void main(int argc,char* argv)glutInit(&argc,argv)

10、;glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(500,500);glutCreateWindow("An Circle OpenGL Program");init();glutDisplayFunc(myDisplay);glutMainLoop();return ;4、修改后的圓的生成#include <GL/glut.h>#include <math.h>const int n = 20;const GLfl

11、oat R = 0.5f;const GLfloat Pi = 3.1415926536f;void myDisplay(void)int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_POLYGON);for(i=0; i<n; +i)glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i);glEnd();glFlush();int main(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMod

12、e(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("畫圓的程序");glutDisplayFunc(&myDisplay);glutMainLoop();return 05、中點畫圓算法#include<gl/glut.h>#include<stdlib.h>#include<math.h>void init(void)glClearColor(1.0,1.0,1.0,0.

13、0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);class screenPtprivate:GLint x,y;public:screenPt()x=y=0;void setCoords(GLint xCoordValue,GLint yCoordValue)x=xCoordValue;y= yCoordValue;GLint getx() constreturn x;GLint gety() constreturn y;void incrementx()x+;void decrementy()y-;void set

14、Pixel(GLint xCoord,GLint yCoord)glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();void circleMidpoint(GLint xc,GLint yc,GLint radius)screenPt circPt;GLint p=1-radius;circPt.setCoords(0,radius);void cieclePlotPoints(GLint,GLint,screenPt);cieclePlotPoints(xc,yc,circPt);while(circPt.getx()<circPt

15、.gety()circPt.incrementx(); if (p < 0) p += 2 * circPt.getx() + 1; else circPt.decrementy(); p += 2 * (circPt.getx() - circPt.gety() + 1; cieclePlotPoints(xc,yc,circPt);void cieclePlotPoints(GLint xc,GLint yc,screenPt circPt)setPixel(xc+circPt.getx(),yc+circPt.gety();setPixel(xc-circPt.getx(),yc+

16、circPt.gety();setPixel(xc+circPt.getx(),yc-circPt.gety();setPixel(xc-circPt.getx(),yc-circPt.gety();setPixel(xc+circPt.gety(),yc+circPt.getx();setPixel(xc-circPt.gety(),yc+circPt.getx();setPixel(xc+circPt.gety(),yc-circPt.getx();setPixel(xc-circPt.gety(),yc-circPt.getx();void myDisplay(void)glClear(

17、GL_COLOR_BUFFER_BIT);glColor3f(0.0,1.0,0.0);circleMidpoint(50,50,20);glFlush();void main(int argc,char* argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,300);glutCreateWindow("A Circle OpenGL Program");init();glut

18、DisplayFunc(myDisplay);glutMainLoop();六、實驗結(jié)果Bresenham畫線算法的實現(xiàn): DDA算法的實現(xiàn): 圓的生成: 中點畫圓算法: 七、實驗心得課本上有畫直線和中點畫圓的核心代碼,只要加上main函數(shù)和窗口定義等的基本函數(shù),稍微修改就可以得到完整的程序,比較簡單。 南昌大學實驗報告學生姓名: 學 號: 專業(yè)班級: 實驗類型: 驗證 綜合 設計 創(chuàng)新 實驗日期: 實驗成績: 實驗二 區(qū)域填充一、實驗項目名稱區(qū)域填充二、實驗目的1、理解區(qū)域的表示方法,能正確區(qū)分并應用區(qū)域的連通性;2、掌握基于邊界、內(nèi)點的區(qū)域填充算法;3、掌握邊界標志算法進行多邊形掃描轉(zhuǎn)換的

19、程序?qū)崿F(xiàn)方法;4、掌握邊界種子填充算法進行區(qū)域填充的程序?qū)崿F(xiàn)方法三、實驗要求編程實現(xiàn)種子填充算法四、實驗步驟1、根據(jù)實驗要求分析實驗,并寫出相應算法的實現(xiàn)2、選擇適當語言實現(xiàn)算法;3、調(diào)試程序。五、實驗內(nèi)容1、輸入種子點坐標(x, y)、填充色、邊界顏色2、種子像素入棧;當棧非空時重復執(zhí)行如下三步操作:(1)棧頂像素出棧;(2)將出棧像素置成填充色;(3)檢查出棧像素的4-鄰接點,若其中某個像素點不是邊界色且未置成多邊形色,則把該像素入棧。實驗代碼如下:#include<GL/glut.h>#include<stdlib.h>#include<math.h>

20、#include<windows.h>void init(void)glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,400.0,0.0,400.0);/初始化投影窗口,保持與顯示的窗口一致void setPixel(int x,int y,long fillColor)/自定義的setPixel函數(shù)glColor3f(fillColor<<16,fillColor<<8,fillColor);glBegin(GL_POINTS);glVertex2i(x,y);

21、glEnd();void boundaryFill4(int x,int y,long fillColor,long borderColor)/遞歸的邊界填充算法unsigned char params3;/定義存儲顏色的數(shù)組long interiorColor;/定義內(nèi)部顏色glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,params);/讀取當前像素點的顏色interiorColor=RGB(params0,params1,params2);/內(nèi)部顏色的獲取if(interiorColor!=borderColor&&interio

22、rColor!=fillColor)/遞歸setPixel(x,y,fillColor);boundaryFill4(x+1,y,fillColor,borderColor);/右邊boundaryFill4(x-1,y,fillColor,borderColor);/左邊boundaryFill4(x,y+1,fillColor,borderColor);/上邊boundaryFill4(x,y-1,fillColor,borderColor);/下邊void lineSegment(void)long borderColor=RGB(0,255,0);/定義邊界顏色long fillCol

23、or=RGB(0,0,255);/定義填充顏色glClear(GL_COLOR_BUFFER_BIT);glColor3f(0,255,0);/畫填充的多邊形,簡單起見,畫了一個正方形glBegin(GL_LINE_LOOP);glVertex2i(50,50);glVertex2i(80,50);glVertex2i(80,80);glVertex2i(50,100);glEnd();boundaryFill4(55,55,fillColor,borderColor);/調(diào)用遞歸函數(shù)glFlush();void main(int argc,char* argv)glutInit(&a

24、rgc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,400);/保持與投影窗口尺寸一致glutCreateWindow("種子填充算法程序");init();glutDisplayFunc(lineSegment);glutMainLoop();六、實驗結(jié)果七、實驗心得區(qū)域填充指的是在輸出平面的閉合區(qū)域內(nèi)完整地填充某種顏色或圖案。種子填充在掌握了“?!边@一抽象數(shù)據(jù)類型的實現(xiàn)方法的前提下,比較容易完成。 南昌大學實驗報

25、告學生姓名: 學 號: 專業(yè)班級: 實驗類型: 驗證 綜合 設計 創(chuàng)新 實驗日期: 實驗成績: 實驗三 裁剪算法一、實驗項目名稱裁剪算法二、實驗目的掌握Sutherland-Cohen 直線裁剪算法三、實驗要求實現(xiàn)Sutherland-Cohen 直線裁剪算法四、實驗步驟1、根據(jù)實驗要求分析實驗,并寫出相應算法的實現(xiàn);2、選擇適當語言實現(xiàn)算法;3、調(diào)試程序。五、實驗內(nèi)容Cohen-Sutherland 算法:任意平面線段和矩形窗口的位置關系只會有如下3種:a.完全落在窗口內(nèi)。b.完全落在窗口外。c.部分落在窗口內(nèi),部分落在窗口外。要想判斷線段和窗口的位置關系,只要找到線段的兩端點相對于矩形窗口

26、的位置即可.線段的兩端點相對于矩形窗口的位置可能會有如下幾種情況:a.線段的兩個端點均在窗口內(nèi),這時線段全部落在窗口內(nèi),完全可見,應予以保留。b.線段的兩個端點均在窗口邊界線外同側(cè),這時線段全部落在窗口外,完全不可見,應予以舍棄。c.線段的一個端點在窗口內(nèi),另一個端點在窗口外,這時線段部分可見,應求出線段與窗口邊界線的交點,從而得到線段在窗口內(nèi)的可見部分。d.線段的兩個端點均不在窗口內(nèi),但不處于窗口邊界線外同側(cè),這時有可能線段是部分可見的,也可能是完全不可見的。Cohen-Sutherland裁剪算法就是按照上述思路來對線段進行裁剪的,只是在線段的兩端點相對于矩形窗口的位置上,巧妙地運用了編碼

27、的思想。首先,如下圖所示,延長窗口的四條邊界線,將平面劃分成9個區(qū)域,然后,用四位二進制數(shù)C3C2C1C0對這9個區(qū)域進行編碼,編碼規(guī)則如下:1001 1000 10100001 0000 00100101 0100 0110第0位C0:當線段的端點在窗口的左邊界之左時,該位編碼為1,否則,該位編碼為0。第1位C1:當線段的端點在窗口的右邊界之右時,該位編碼為1,否則,該位編碼為0。第2位C2:當線段的端點在窗口的下邊界之下時,該位編碼為1,否則,該位編碼為0。第3位C3:當線段的端點在窗口的上邊界之上時,該位編碼為1,否則,該位編碼為0。于是算法步驟可描述如下:步驟1:根據(jù)上述編碼規(guī)則,對線

28、段的兩個端點進行編碼。步驟2:根據(jù)線段的兩端點編碼判斷線段相對于窗口的位置關系,從而決定對線段如何剪。取兩端點編碼全為0000時,說明線段完全位于窗口內(nèi),是完全可見的,于是顯示此線段。兩端點編碼逐位邏輯與不為0時,說明線段的兩個端點位于窗口外同側(cè),即此線段完全位于窗口外,是完全不可見的,于是全部舍棄,不顯示此線段。兩端點編碼逐位邏輯與為0時,說明此線段或者部分可見,或者完全不可見。此時需要計算出線段與窗口某一邊界線或邊界線的延長線的交點,若交點在窗口邊界線的延長線上,則說明該線段完全位于窗口外,不予以顯示;若交點在窗口邊界線上,則對以其中一個交點為分割點的兩端線段,再分別對其端點進行編碼,并按

29、照上述(1)和(2)所示的方法進行測試,從而舍棄完全位于窗口外的一段線段,保留并顯示完全位于窗口內(nèi)的一段線段。實驗代碼如下:#include<stdlib.h>#include<math.h>#include<GL/glut.h>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 setPixel (GLint xCoord,GLint yCoord)glBegin(GL_POINTS);

30、glVertex2i (xCoord,yCoord);glEnd();void setrect ()/繪制矩形裁剪窗口glColor3f(1.0,0.0,0.0);int point1=90,20;int point2=150,20;int point3=150,140;int point4=90,140;glBegin(GL_LINE_STRIP);glVertex2iv(point1);glVertex2iv(point2);glVertex2iv(point3);glVertex2iv(point4);glVertex2iv(point1);glEnd();glFlush();void

31、lineBres (int x0,int y0,int xEnd,int yEnd)/繪制直線 glColor3f(1.0,0.0,0.0);int dx=abs(xEnd-x0),dy=abs(yEnd-y0);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*(dy-dx);int x,y;if(x0>xEnd)x=xEnd;y=yEnd;xEnd=x0;elsex=x0;y=y0;setPixel(x,y);while(x<xEnd)x+;if(p<0)p+=twoDy;elsey+;p+=twoDyMinusDx;setPixel

32、(x,y);glFlush();void lineBres2 (int x0,int y0,int xEnd,int yEnd)/繪制裁剪后的直線 glColor3f(1.0,1.0,1.0);int dx=abs(xEnd-x0),dy=abs(yEnd-y0);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*(dy-dx);int x,y;if(x0>xEnd)x=xEnd;y=yEnd;xEnd=x0;elsex=x0;y=y0;setPixel(x,y);while(x<xEnd)x+;if(p<0)p+=twoDy;elsey

33、+;p+=twoDyMinusDx;setPixel(x,y);glFlush();class wcPt2Dpublic:GLfloat x,y;inline GLint round(const GLfloat a)return GLint(a+0.5);const GLint winleftbitcode=0x1;const GLint winrightbitcode=0x2;const GLint winbottombitcode=0x4;const GLint wintopbitcode=0x8;inline GLint inside(GLint code)return GLint(!c

34、ode);inline GLint reject(GLint code1,GLint code2) return GLint(code1&code2);inline GLint accept(GLint code1,GLint code2) return GLint(!(code1|code2);GLubyte encode(wcPt2D pt,wcPt2D winmin,wcPt2D winmax)GLubyte code=0x00;if(pt.x<winmin.x)code=code|winleftbitcode;if(pt.x>winmax.x)code=code|w

35、inrightbitcode;if(pt.y<winmin.y)code=code|winbottombitcode;if(pt.y>winmax.y)code=code|wintopbitcode;return (code);glFlush();void swapPts(wcPt2D *p1,wcPt2D *p2)wcPt2D tem;tem=*p1;*p1=*p2;*p2=tem;glFlush();void swapcodes(GLubyte *c1,GLubyte *c2)GLubyte tem;tem=*c1;*c1=*c2;*c2=tem;glFlush();void

36、lineclipCohSuth() glColor3f(1.0,0.0,0.0);/裁剪線的顏色wcPt2D winmin,winmax; winmin.x=90.0;winmin.y=20.0;winmax.x=150.0;winmax.y=140.0;wcPt2D p1,p2;p1.x=20.0;p1.y=50.0;p2.x=200.0;p2.y=100.0;setrect ();lineBres(round(p1.x),round(p1.y),round(p2.x),round(p2.y);GLubyte code1,code2;GLint done=false,plotline=fal

37、se;GLfloat m;while(!done)code1=encode(p1,winmin,winmax);code2=encode(p2,winmin,winmax);if(accept(code1,code2)done=true;plotline=true;elseif(reject(code1,code2)done=true;elseif(inside(code1)swapPts(&p1,&p2);swapcodes(&code1,&code2);if(p2.x!=p1.x)m=(p2.y-p1.y)/(p2.x-p1.x);if(code1&

38、winleftbitcode)p1.y+=(winmin.x-p1.x)*m;p1.x=winmin.x;elseif(code1&winrightbitcode)p1.y+=(winmax.x-p1.x)*m;p1.x=winmax.x;elseif(code1&winbottombitcode)if(p2.x!=p1.x)p1.x+=(winmin.y-p1.y)/m;p1.y=winmin.y;elseif(code1&wintopbitcode)if(p2.x!=p1.x)p1.x+=(winmax.y-p1.y)/m;p1.y=winmax.y;if(plot

39、line) lineBres2(round(p1.x),round(p1.y),round(p2.x),round(p2.y);glFlush();void main(int argc, char *argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB ); glutInitWindowPosition(50, 100); glutInitWindowSize(400, 300); glutCreateWindow("裁剪算法");init();glutDisplayFunc(l

40、ineclipCohSuth); glutMainLoop();六、實驗結(jié)果七、實驗心得通過這個實驗,我掌握了Sutherland-Cohen 直線裁剪算法,希望在以后的實驗中能夠再接再厲,做得更好! 南昌大學實驗報告學生姓名: 學 號: 專業(yè)班級: 實驗類型: 驗證 綜合 設計 創(chuàng)新 實驗日期: 實驗成績: 實驗四 Bezier曲線的繪制一、實驗項目名稱Bezier曲線的繪制二、實驗目的1、掌握Bezier曲線的定義生成算法;2、掌握參數(shù)化曲線曲面的原理和方法。3、理解參數(shù)化曲線曲面的基本性質(zhì),特別是Bezier曲線的基本性質(zhì)。4、掌握型值點和控制頂點以及控制多邊形的概念,理解控制點對曲線的

41、控制作用。三、實驗要求實現(xiàn)Bezier曲線的算法四、實驗步驟1、根據(jù)實驗要求分析實驗,并寫出相應算法的實現(xiàn)2、選擇適當語言實現(xiàn)算法;3、調(diào)試程序。五、實驗內(nèi)容Bezier曲線的定義:給定空間n+1個點的位置矢量Pi(i=0,1,2,n)則Bezier曲線可定義為:其中,Pi構(gòu)成該Bezier曲線的特征多邊形。實驗代碼如下:#include<GL/glut.h>#include<stdio.h>#include<math.h>GLsizei winWidth=700,winHeight=700;GLfloat xwcMin=-50,xwcMax=50;GLfl

42、oat ywcMin=-50,ywcMax=50;class wcpt3Dpublic:GLfloat x,y,z;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 plotPoint(wcpt3D bezcurvept)glBegin(GL_POINTS); glVertex2f(bezcurvept.x,bezcurvept.y);glEnd();glFlush();void binomialcoeffs(GLint

43、n,GLint *C)/計算二項式系數(shù)GLint k,j;for(k=0;k<=n;k+)Ck=1;for(j=n;j>=k+1;j-)Ck*=j;for(j=n-k;j>=2;j-)Ck /=j;glFlush();void computebezpt(GLfloat u,wcpt3D * bezpt,GLint nctrlpts,wcpt3D * ctrlpts,GLint * C)/計算曲線沿路徑坐標值GLint k,n=nctrlpts-1;GLfloat bezblendFcn;bezpt->x=bezpt->y=bezpt->z=0.0;for(k

44、=0;k<nctrlpts;k+)bezblendFcn=Ck*pow(u,k)*pow(1-u,n-k);bezpt->x +=ctrlptsk.x*bezblendFcn;bezpt->y +=ctrlptsk.y*bezblendFcn;bezpt->z +=ctrlptsk.z*bezblendFcn;glFlush();void bezier(wcpt3D *ctrlpts,GLint nctrlpts,GLint nbezcurvepts)/bezier算法wcpt3D bezcurvept;GLfloat u;GLint *C,k;C=new GLint

45、nctrlpts;binomialcoeffs(nctrlpts-1,C);for(k=0;k<nbezcurvepts;k+)u=GLfloat(k)/GLfloat (nbezcurvepts);computebezpt(u,&bezcurvept,nctrlpts,ctrlpts,C);plotPoint(bezcurvept);glFlush();delete C;void displayFunc(void)GLint nctrlpts=4,nbezcurvepts=2000;wcpt3D ctrlpts4=-20.0,-30.0,0.0,-10.0,100.0,0.0,

46、10,-200.0,0,60,60,10;glClear(GL_COLOR_BUFFER_BIT);glPointSize(4);glColor3f(1.0,0.0,0.0);bezier(ctrlpts,nctrlpts,nbezcurvepts);glFlush();void winReshapeFcn(GLint newWidth,GLint newHeight)glViewport(0,0,newHeight,newWidth);glMatrixMode (GL_PROJECTION);glLoadIdentity();gluOrtho2D(xwcMin,xwcMax,ywcMin,y

47、wcMax);glClear(GL_COLOR_BUFFER_BIT);glFlush();void main(int argc,char* argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(10,10);glutInitWindowSize(winWidth,winHeight);glutCreateWindow("Bezier曲線");init();glutDisplayFunc(displayFunc);glutReshapeFu

48、nc(winReshapeFcn);glutMainLoop();六、實驗結(jié)果七、實驗心得貝塞爾曲線,是應用于二維圖形應用程序的數(shù)學曲線。一般的矢量圖形軟件通過它來精確畫出曲線,貝茲曲線由線段與節(jié)點組成,節(jié)點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種矢量曲線的。 南昌大學實驗報告學生姓名: 學 號: 專業(yè)班級: 實驗類型: 驗證 綜合 設計 創(chuàng)新 實驗日期: 實驗成績: 實驗五 B樣條曲線的繪制一、實驗項目名稱B樣條曲線的繪制二、實驗目的1、掌握B樣條曲線的定義生成算法;2、掌握參數(shù)化曲線曲面的原理和方法。3、理解參數(shù)化曲線曲面的基本性質(zhì)。4、掌握型值點和控制頂點以及控制多邊形的概念,理解控制點對曲線的控制作用。三、實驗要求實現(xiàn)B樣條曲線的算法四、實驗步驟1、根據(jù)實驗要求分析實驗,并寫出相應算法的實現(xiàn)2、選擇適當語言實現(xiàn)算法;3、調(diào)試程序。五、實驗內(nèi)容B樣條曲線的定義:在二維模式下,用自編程序生成三次B樣條曲線。四個控制頂點的坐標可由用戶任意輸入。三次B樣條曲線和控制多邊形必須同時顯示在顯示器

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論