計(jì)算機(jī)圖形學(xué)OpenGL(第三版)第二章_第1頁(yè)
計(jì)算機(jī)圖形學(xué)OpenGL(第三版)第二章_第2頁(yè)
計(jì)算機(jī)圖形學(xué)OpenGL(第三版)第二章_第3頁(yè)
計(jì)算機(jī)圖形學(xué)OpenGL(第三版)第二章_第4頁(yè)
計(jì)算機(jī)圖形學(xué)OpenGL(第三版)第二章_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 前一頁(yè) 休息1本章內(nèi)容本章內(nèi)容l編寫圖形程序編寫圖形程序l學(xué)習(xí)學(xué)習(xí)OpenGL程序的基本組成程序的基本組成l開發(fā)繪制點(diǎn)、直線、折線和多邊形的基開發(fā)繪制點(diǎn)、直線、折線和多邊形的基本圖形工具本圖形工具l學(xué)會(huì)用鼠標(biāo)和鍵盤控制程序?qū)W會(huì)用鼠標(biāo)和鍵盤控制程序 前一頁(yè) 休息22.0 vc opengl 編程編程 指導(dǎo)例子指導(dǎo)例子l熟悉代碼,多次練習(xí)熟悉代碼,多次練習(xí)l見圖形學(xué)第二課見圖形學(xué)第二課opengl-console.doc,創(chuàng)建創(chuàng)建一個(gè)控制臺(tái)的應(yīng)用程序,本書采用的編一個(gè)控制臺(tái)的應(yīng)用程序,本書采用的編程方式程方式l見圖形學(xué)第二課見圖形學(xué)第二課opengl-nehe-win.doc,創(chuàng)創(chuàng)建一個(gè)建一個(gè)w

2、in32的應(yīng)用程序,的應(yīng)用程序,nehe教程(共教程(共48課)采用的編程方式課)采用的編程方式l見圖形學(xué)第三課見圖形學(xué)第三課opengl-nehe-mfc.doc,創(chuàng)創(chuàng)建一個(gè)建一個(gè)mfc的應(yīng)用程序,本人推薦采用的的應(yīng)用程序,本人推薦采用的編程方式,需要學(xué)習(xí)編程方式,需要學(xué)習(xí)vc和和mfc。 前一頁(yè) 休息32.1 生成圖像初步生成圖像初步l通過(guò)練習(xí)(編寫和測(cè)試各種不同圖形的程序)可以通過(guò)練習(xí)(編寫和測(cè)試各種不同圖形的程序)可以很快掌握計(jì)算機(jī)圖形學(xué)。先從簡(jiǎn)單的任務(wù)開始,一很快掌握計(jì)算機(jī)圖形學(xué)。先從簡(jiǎn)單的任務(wù)開始,一旦掌握,就試著變變花樣,看看有哪些變化,試著旦掌握,就試著變變花樣,看看有哪些變化

3、,試著進(jìn)一步繪制更復(fù)雜的場(chǎng)景。最好的學(xué)習(xí)辦法是認(rèn)真、進(jìn)一步繪制更復(fù)雜的場(chǎng)景。最好的學(xué)習(xí)辦法是認(rèn)真、仔細(xì)地學(xué)習(xí)每行代碼或等式。當(dāng)你這么做時(shí),就能仔細(xì)地學(xué)習(xí)每行代碼或等式。當(dāng)你這么做時(shí),就能理解每個(gè)新概念。理解每個(gè)新概念。l每個(gè)圖形程序都以一些初始化工作為開始,由此建每個(gè)圖形程序都以一些初始化工作為開始,由此建立程序所需要的顯示模型和坐標(biāo)系。立程序所需要的顯示模型和坐標(biāo)系。 前一頁(yè) 休息42.1 生成圖像初步生成圖像初步l初始化時(shí),將顯示器設(shè)置為初始化時(shí),將顯示器設(shè)置為“圖形模式圖形模式”,并且建,并且建立了坐標(biāo)系,坐標(biāo)立了坐標(biāo)系,坐標(biāo)x和和y以像素為單位,以像素為單位,x向右遞增,向右遞增,y向

4、下遞增。向下遞增。 前一頁(yè) 休息52.1.1 設(shè)備無(wú)關(guān)的編程設(shè)備無(wú)關(guān)的編程 和和OpenGLlOpenGL程序可以在不同的圖形環(huán)境里編譯和運(yùn)行,程序可以在不同的圖形環(huán)境里編譯和運(yùn)行,即它是與設(shè)備無(wú)關(guān)的編程。即它是與設(shè)備無(wú)關(guān)的編程。OpenGL是一個(gè)開源圖形是一個(gè)開源圖形庫(kù),可在庫(kù),可在下載。下載。OpenGL常被常被稱為應(yīng)用程序接口(稱為應(yīng)用程序接口(API)。這個(gè)接口是程序員可以)。這個(gè)接口是程序員可以調(diào)用的例程,先從調(diào)用的例程,先從OpenGL繪制簡(jiǎn)單的二維物體開始,繪制簡(jiǎn)單的二維物體開始,然后學(xué)習(xí)繪制三維圖形。然后學(xué)習(xí)繪制三維圖形。 前一頁(yè) 休息6

5、2.1.2 窗口的編程窗口的編程l事件驅(qū)動(dòng)編程:事件包括單擊鼠標(biāo),按下鍵盤上的事件驅(qū)動(dòng)編程:事件包括單擊鼠標(biāo),按下鍵盤上的按鍵,或者重新調(diào)整窗口的大小。程序員將程序組按鍵,或者重新調(diào)整窗口的大小。程序員將程序組織成回調(diào)函數(shù)的集合,這些回調(diào)函數(shù)一有事件發(fā)生織成回調(diào)函數(shù)的集合,這些回調(diào)函數(shù)一有事件發(fā)生就執(zhí)行。即什么也不做,等待事件發(fā)生,事件發(fā)生就執(zhí)行。即什么也不做,等待事件發(fā)生,事件發(fā)生后再做指定的事。后再做指定的事。OpenGL有一個(gè)有一個(gè)GLUT庫(kù),它用來(lái)庫(kù),它用來(lái)打開窗口,管理菜單和處理事件等。打開窗口,管理菜單和處理事件等。l注冊(cè)回調(diào)函數(shù):有一種方法將每種類型的事件與要注冊(cè)回調(diào)函數(shù):有一種

6、方法將每種類型的事件與要求的回調(diào)函數(shù)關(guān)聯(lián)起來(lái),這個(gè)方法稱之為注冊(cè)回調(diào)求的回調(diào)函數(shù)關(guān)聯(lián)起來(lái),這個(gè)方法稱之為注冊(cè)回調(diào)函數(shù)。程序中用到的每一個(gè)事件類型都必須用回調(diào)函數(shù)。程序中用到的每一個(gè)事件類型都必須用回調(diào)函數(shù)注冊(cè),該回調(diào)函數(shù)的名字和定義由程序員選擇。函數(shù)注冊(cè),該回調(diào)函數(shù)的名字和定義由程序員選擇。 前一頁(yè) 休息72.1.2 窗口的編程窗口的編程l下面是使用下面是使用GLUT庫(kù),名為庫(kù),名為myMouse的回調(diào)函數(shù)例的回調(diào)函數(shù)例子,它方便地注冊(cè)了與鼠標(biāo)關(guān)聯(lián)的事件:子,它方便地注冊(cè)了與鼠標(biāo)關(guān)聯(lián)的事件: glutMouseFunc(myMouse);); glutMouseFunc是是GLUT庫(kù)的固有函數(shù)

7、,但是回調(diào)函庫(kù)的固有函數(shù),但是回調(diào)函數(shù)數(shù)myMouse是程序員定義的,并由程序員編寫代碼,是程序員定義的,并由程序員編寫代碼,處理每個(gè)可能感興趣的鼠標(biāo)動(dòng)作。處理每個(gè)可能感興趣的鼠標(biāo)動(dòng)作。 4種主要的種主要的OpenGL庫(kù):庫(kù):1)基本)基本GL庫(kù),庫(kù),OpenGL庫(kù)的基礎(chǔ)。它提供庫(kù)的基礎(chǔ)。它提供OpenGL的的基本函數(shù)。每個(gè)基本函數(shù)。每個(gè)OpenGL函數(shù)都以字符函數(shù)都以字符GL開頭。開頭。 前一頁(yè) 休息82.1.2 窗口的編程窗口的編程l2)GLUT庫(kù):庫(kù):GL實(shí)用工具包。它用來(lái)打開窗口,開實(shí)用工具包。它用來(lái)打開窗口,開發(fā)和管理菜單,以及管理事件等。發(fā)和管理菜單,以及管理事件等。l3)GLU庫(kù)

8、:庫(kù):GL實(shí)用庫(kù),它提供高級(jí)例程,處理矩實(shí)用庫(kù),它提供高級(jí)例程,處理矩陣操作和繪制二次曲面如球和圓柱體;陣操作和繪制二次曲面如球和圓柱體;l4)GLUI庫(kù):用戶接口庫(kù),提供控制工具和菜單。庫(kù):用戶接口庫(kù),提供控制工具和菜單。glutDisplayFunc(myDisplay):重繪窗口調(diào)用重繪窗口調(diào)用myDisplay回調(diào)函數(shù);回調(diào)函數(shù);glutReshapeFun(myReshape):對(duì)屏幕窗口的形狀):對(duì)屏幕窗口的形狀進(jìn)行調(diào)整;進(jìn)行調(diào)整;void main()glutDisplayFunc(myDisplay); / 注冊(cè)重繪函數(shù)注冊(cè)重繪函數(shù)glutReshapeFunc(myResha

9、pe); / 注冊(cè)改變窗口形狀函數(shù)注冊(cè)改變窗口形狀函數(shù)glutMouseFunc(myMouse); / 注冊(cè)鼠標(biāo)動(dòng)作函數(shù)注冊(cè)鼠標(biāo)動(dòng)作函數(shù)glutMotionFunc(myMouse); / 注冊(cè)鼠標(biāo)移動(dòng)函數(shù)注冊(cè)鼠標(biāo)移動(dòng)函數(shù)glutKeyboardFunc(myKeyboard); / 注冊(cè)鍵盤動(dòng)作函數(shù)注冊(cè)鍵盤動(dòng)作函數(shù)/可能初始化其他工作可能初始化其他工作glutMainLoop(); / 進(jìn)入主循環(huán)等待事件發(fā)生進(jìn)入主循環(huán)等待事件發(fā)生 前一頁(yè) 休息102.1.3 如何打開一個(gè)窗口畫圖如何打開一個(gè)窗口畫圖 lglutInit:該函數(shù)初始化工具包:該函數(shù)初始化工具包lglutDisplayMode

10、(GLUT_SINGLE | GLUT_RGB): 分分配單個(gè)顯示緩存配單個(gè)顯示緩存lglutInitWindowSize(640,480): 該函數(shù)指定屏幕的初該函數(shù)指定屏幕的初始尺寸,寬始尺寸,寬640像素,高像素,高480像素。像素。lglutCreateWindow(“my first attempt”):該函):該函數(shù)打開并顯示屏幕窗口嗎,并顯示標(biāo)題。數(shù)打開并顯示屏幕窗口嗎,并顯示標(biāo)題。代碼如下:代碼如下:void main(int argc, char* argv)glutInit(&argc, argv); / 初始化工具包初始化工具包glutInitDisplayMod

11、e(GLUT_SINGLE | GLUT_RGB); / 設(shè)置顯示模式設(shè)置顯示模式glutInitWindowSize(640,480); / 設(shè)置窗口大小設(shè)置窗口大小glutInitWindowPosition(100, 150); / 設(shè)置窗口在屏幕上的位置設(shè)置窗口在屏幕上的位置glutCreateWindow(my first attempt); / 打開屏幕窗口打開屏幕窗口/ 注冊(cè)回調(diào)函數(shù)注冊(cè)回調(diào)函數(shù)glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMouseFunc(myMouse);glutKeyboardFunc(

12、myKeyboard);myInit(); / 必要的其他初始化工作必要的其他初始化工作glutMainLoop(); / 進(jìn)入循環(huán)進(jìn)入循環(huán) 前一頁(yè) 休息132.2 OpenGL的基本圖形元素的基本圖形元素l屏幕坐標(biāo)系:寬為屏幕坐標(biāo)系:寬為640,高為,高為640。x坐標(biāo)從左邊界坐標(biāo)從左邊界0增加到右邊界增加到右邊界639,y坐標(biāo)從坐標(biāo)從0增加到上邊的增加到上邊的479。繪制三個(gè)點(diǎn):繪制三個(gè)點(diǎn):glBegin(GL_POINTS);glVertex2i(100, 50);glVertex2i(100, 130);glVertex2i(150, 130);glEnd();或者用浮點(diǎn)值代替整數(shù)值:

13、或者用浮點(diǎn)值代替整數(shù)值:glBegin(GL_POINTS);glVertex2d(100.0, 50.0);glVertex2d(100.0, 130.0);glVertex2d(150.0, 130.0);glEnd();OpenGL數(shù)據(jù)類型:數(shù)據(jù)類型:命令后綴和參數(shù)數(shù)據(jù)類型命令后綴和參數(shù)數(shù)據(jù)類型OpenGL狀態(tài):狀態(tài):OpenGL是由許多狀態(tài)變量組成的狀態(tài)機(jī),這些狀態(tài)包括點(diǎn)的大是由許多狀態(tài)變量組成的狀態(tài)機(jī),這些狀態(tài)包括點(diǎn)的大小、繪圖的顏色額屏幕窗口大小等,點(diǎn)的大小可以用小、繪圖的顏色額屏幕窗口大小等,點(diǎn)的大小可以用glPointSize()來(lái)設(shè)置,畫圖的顏色用這條語(yǔ)句設(shè)置:()來(lái)設(shè)置,畫

14、圖的顏色用這條語(yǔ)句設(shè)置: glColor3f(red,green,blue););坐標(biāo)系的建立:坐標(biāo)系的建立:void myInit(void)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, 640.0, 0, 480.0);myInit設(shè)置坐標(biāo)系,設(shè)置透視投影變換。設(shè)置坐標(biāo)系,設(shè)置透視投影變換。gluOrtho2D設(shè)置正交投影。設(shè)置正交投影。組合在一起:建立起一個(gè)完整的組合在一起:建立起一個(gè)完整的OpenGL程序程序glFlush()函數(shù)保證所有的數(shù)據(jù)被完全處理并顯()函數(shù)保證所有的數(shù)據(jù)被完全處理并顯示。示。 前一頁(yè) 休息

15、172.2.1 幾個(gè)點(diǎn)叢繪制的例子幾個(gè)點(diǎn)叢繪制的例子l點(diǎn)叢是由大量點(diǎn)組成的某種圖案。下面有幾個(gè)點(diǎn)叢點(diǎn)叢是由大量點(diǎn)組成的某種圖案。下面有幾個(gè)點(diǎn)叢例子。例子。例子例子2.2.1 北斗星群北斗星群 見計(jì)算機(jī)圖形學(xué)課件見計(jì)算機(jī)圖形學(xué)課件2016計(jì)算機(jī)圖形學(xué)(計(jì)算機(jī)圖形學(xué)(Opengl版第三版版第三版)書書源代碼源代碼word版版2.2.1-threeDots.doc例子例子2.2.2 Sierpinski(塞平斯基)墊片(塞平斯基)墊片見計(jì)算機(jī)圖形學(xué)課件見計(jì)算機(jī)圖形學(xué)課件2016計(jì)算機(jī)圖形學(xué)(計(jì)算機(jī)圖形學(xué)(Opengl版第三版版第三版)書源書源代碼代碼word版版2.2.1-threeDots.doc

16、算法如下:第算法如下:第k個(gè)點(diǎn)表示為個(gè)點(diǎn)表示為P(k)=(x(k),),y(k),每一個(gè)),每一個(gè)點(diǎn)都依賴于前一個(gè)點(diǎn)點(diǎn)都依賴于前一個(gè)點(diǎn)P(k-1),過(guò)程如下:),過(guò)程如下:(1)選擇三個(gè)固定的點(diǎn))選擇三個(gè)固定的點(diǎn)T0,T1,T2,構(gòu)成一個(gè)三角形,稱為每,構(gòu)成一個(gè)三角形,稱為每個(gè)個(gè)Sierpinski墊片的父三角形;墊片的父三角形;(2)隨機(jī)選擇父三角形頂點(diǎn))隨機(jī)選擇父三角形頂點(diǎn)T0,T1,T2中的一點(diǎn)作為要繪制的中的一點(diǎn)作為要繪制的初始點(diǎn)初始點(diǎn)P0。 迭代下面的(迭代下面的(3)(5)步,直到圖案填充完畢。)步,直到圖案填充完畢。(3)隨機(jī)選擇)隨機(jī)選擇T0,T1,T2中的一點(diǎn),稱為中的一點(diǎn),

17、稱為T。(4)構(gòu)造下一個(gè)點(diǎn))構(gòu)造下一個(gè)點(diǎn)P(k),作為),作為T和前一個(gè)已建好的點(diǎn)和前一個(gè)已建好的點(diǎn)P(k-1)之間的之間點(diǎn),即之間的之間點(diǎn),即P(k)=(P(k-1)+T)/2(5)用)用drawDot()繪制()繪制P(k)。)。例子例子2.2.2 Sierpinski(塞平斯基)墊片(塞平斯基)墊片/初始值初始值P(0),在在for循環(huán)外面循環(huán)外面GLintPoint point = Tindex; / 初始值初始值drawDot(point.x, point.y); / 畫初始點(diǎn)畫初始點(diǎn)for(int i = 0; i 1000; i+) /畫畫1000點(diǎn)點(diǎn)index = rand()

18、%3;/P(k)=(P(k-1)+T)/2point.x = (point.x + Tindex.x) / 2;point.y = (point.y + Tindex.y) / 2;drawDot(point.x,point.y);例子例子2.2.3 用點(diǎn)集繪制函數(shù)用點(diǎn)集繪制函數(shù) 見計(jì)算機(jī)圖形學(xué)課件見計(jì)算機(jī)圖形學(xué)課件2016計(jì)算機(jī)圖形學(xué)(計(jì)算機(jī)圖形學(xué)(Opengl版第三版版第三版)書書源代碼源代碼word版版2.2.1-threeDots.doc繪制某個(gè)數(shù)學(xué)函數(shù)繪制某個(gè)數(shù)學(xué)函數(shù)f(x),當(dāng)),當(dāng)x在在04變化時(shí)的曲線。當(dāng)繪制曲線變化時(shí)的曲線。當(dāng)繪制曲線時(shí),因?yàn)闀r(shí),因?yàn)?4之間的之間的x值位于屏

19、幕窗口左下角的前值位于屏幕窗口左下角的前4個(gè)像素上,個(gè)像素上,而且而且f(.)的負(fù)值位于窗口的下面,根本看不到。需要進(jìn)行平移的負(fù)值位于窗口的下面,根本看不到。需要進(jìn)行平移和縮放使曲線正好出現(xiàn)在合適的屏幕窗口。將世界坐標(biāo)系轉(zhuǎn)換和縮放使曲線正好出現(xiàn)在合適的屏幕窗口。將世界坐標(biāo)系轉(zhuǎn)換為為窗口坐標(biāo)系。窗口坐標(biāo)系。x方向縮放:假定屏幕窗口為方向縮放:假定屏幕窗口為screenWidth,單位為像素,現(xiàn)在,單位為像素,現(xiàn)在x的的范圍為范圍為04,故,故sx = x * screenWidth /4.0;y方向縮放:假定屏幕窗口為方向縮放:假定屏幕窗口為screenHeight,單位為像素,單位為像素,f(

20、x) 的的 取值在取值在1.0 和和 1.0之間之間,縮放縮放screenHeight / 2 ,平移為,平移為 screenHeight / 2,sy = (y + 1.0) * screenHeight / 2.0;sx,sy為屏為屏幕坐標(biāo),幕坐標(biāo),x,y為窗口坐標(biāo);轉(zhuǎn)換方程為:為窗口坐標(biāo);轉(zhuǎn)換方程為: sx= A * x + B sy =C * y + Dconst int screenWidth = 640; / width of screen window in pixelsconst int screenHeight = 480; / height of screen window

21、 in pixelsGLdouble A, B, C, D; / values used for scaling and shiftingvoid myInit(void)glClearColor(1.0,1.0,1.0,0.0); / background color is whiteglColor3f(0.0f, 0.0f, 0.0f); / drawing color is blackglPointSize(2.0); / a dot is 2 by 2 pixelsglMatrixMode(GL_PROJECTION); / set camera shapeglLoadIdentity

22、();gluOrtho2D(0.0, (GLdouble)screenWidth, 0.0, (GLdouble)screenHeight);A = screenWidth / 4.0; / x方向的縮放量方向的縮放量AB = 0.0; /x方向的平移量方向的平移量BC = D = screenHeight / 2.0;/ y方向的縮放量方向的縮放量C和平移量和平移量Dvoid myDisplay(void)glClear(GL_COLOR_BUFFER_BIT); / clear the screenglBegin(GL_POINTS);for(GLdouble x = 0; x 4.0 ;

23、 x += 0.005)Gldouble func = exp(-x) * cos(2 * 3.14159265 * x);/sx= A * x + B, sy =C * y + DglVertex2d(A * x + B, C * func + D);glEnd();glFlush(); / send all output to display例子例子2.2.3 用點(diǎn)集繪制函數(shù)用點(diǎn)集繪制函數(shù) 見計(jì)算機(jī)圖形學(xué)課件見計(jì)算機(jī)圖形學(xué)課件2016計(jì)算機(jī)圖形學(xué)(計(jì)算機(jī)圖形學(xué)(Opengl版第三版版第三版)書源代碼書源代碼word版版2.2.1-threeDots.doc f(x)=sin(x),f(x)

24、=sin(2x),x從從-到到,y從從-1到到1A = screenWidth / 6.28;/ x方向的縮放量方向的縮放量A,屏幕寬度,屏幕寬度/x方向的變化范圍方向的變化范圍 B = screenWidth/2.0; /x方向的平移量方向的平移量B,屏幕寬度的一半,屏幕寬度的一半 C = screenHeight / 2.0;/ y方向的縮放量方向的縮放量C,屏幕高度,屏幕高度/y方向的變化范圍方向的變化范圍 D = screenHeight / 2.0;/ y方向的平移量方向的平移量D,屏幕的高度的一半屏幕的高度的一半for(GLdouble x = -3.14; x 3.14 ; x

25、+= 0.005)Gldouble func = sin(x);Gldouble func 1= sin(2x);/sx= A * x + B, sy =C * y + DglVertex2d(A * x + B, C * func + D);glVertex2d(A * x + B, C * func 1+ D); 前一頁(yè) 休息232.3 OpenGL中的直線繪制中的直線繪制l繪制線段繪制線段glBegin(GL_LINES); / use constant GL_LINES here glVertex2i(40, 100); glVertex2i(202, 96);glEnd();或者編寫

26、一個(gè)函數(shù)或者編寫一個(gè)函數(shù)void drawLineInt(GLint x1, GLint y1, GLint x2, GLint y2)glBegin(GL_LINES);glVertex2i(x1, y1);glVertex2i(x2, y2);glEnd();2.3.1 繪制折線和多邊形繪制折線和多邊形折線就是一系列頭尾相連的線段的集合,也稱為線帶。折線就是一系列頭尾相連的線段的集合,也稱為線帶。glBegin(GL_LINE_STRIP); / draw an open polyline glVertex2i(20,10); glVertex2i(50,10); glVertex2i(2

27、0,80); glVertex2i(50,80);glEnd();glFlush();繪制多邊形,只需要用繪制多邊形,只需要用GL_LINE_LOOP替換替換GL_LINE_STRIP 即可,即是閉合的。即可,即是閉合的。 f(x) = 300 - 100 cos(2p x/100) + 30 cos(4p x/100) + 6 cos(6p x/100)glBegin(GL_LINE_STRIP);for(x = 0; x = 300; x += 3)glVertex2d(A * x + B, C * f(x) + D);glEnd();glFlush;例子例子2.3.2 繪制存儲(chǔ)在文件中的

28、折線繪制存儲(chǔ)在文件中的折線 見計(jì)算機(jī)圖形學(xué)課件見計(jì)算機(jī)圖形學(xué)課件2016計(jì)算機(jī)圖形學(xué)(計(jì)算機(jī)圖形學(xué)(Opengl版第三版版第三版)書源代碼書源代碼word版版2.2.1-threeDots.doc,文件文件dino.dat:21 /文件中折線的數(shù)量文件中折線的數(shù)量4 / 第一條折線的點(diǎn)數(shù)第一條折線的點(diǎn)數(shù)169 118 / /第一條折線的第一個(gè)點(diǎn)第一條折線的第一個(gè)點(diǎn)174 120 /179 124178 1265 / 第二條折線的點(diǎn)數(shù)第二條折線的點(diǎn)數(shù)298 86 / 第二條折線的第一個(gè)點(diǎn)第二條折線的第一個(gè)點(diǎn)304 92310 104314 114314 1192932 43510 439. .

29、. 等等等等 例子例子2.3.3 參數(shù)化圖形參數(shù)化圖形 void hardwiredHouse(void) glBegin(GL_LINE_LOOP);/ 繪制房子外形繪制房子外形glVertex2i(40, 40); glVertex2i(40, 90); glVertex2i(70, 120); glVertex2i(100, 90); glVertex2i(100, 40);glEnd();glBegin(GL_LINE_STRIP); /繪制煙囪繪制煙囪glVertex2i(50, 100);glVertex2i(50, 120);glVertex2i(60, 120); glVert

30、ex2i(60, 110);glEnd();. . . / 繪制門繪制門. . . / 繪制窗戶繪制窗戶void parameterizedHouse(GLintPoint peak, GLint width, GLint height)/ 房子的頂點(diǎn)由房子的頂點(diǎn)由peak給定,房子的大小由給定,房子的大小由width和和height給定給定glBegin(GL_LINE_LOOP);glVertex2i(peak.x, peak.y); / 繪制房子外形繪制房子外形glVertex2i(peak.x + width / 2, peak.y - 3 * height /8);glVertex2

31、i(peak.x + width / 2 peak.y - height);glVertex2i(peak.x - width / 2, peak.y - height);glVertex2i(peak.x - width / 2, peak.y - 3 * height /8);glEnd();draw chimney in the same fashiondraw the doordraw the window第一個(gè)方法將由幾條折線組成的簡(jiǎn)易房子的每個(gè)端點(diǎn)位置被強(qiáng)制寫入代碼中,第一個(gè)方法將由幾條折線組成的簡(jiǎn)易房子的每個(gè)端點(diǎn)位置被強(qiáng)制寫入代碼中,而第二種方法則是利用參數(shù)來(lái)繪制,用參數(shù)指定房屋

32、頂點(diǎn)的位置和房子的而第二種方法則是利用參數(shù)來(lái)繪制,用參數(shù)指定房屋頂點(diǎn)的位置和房子的寬度和高度,比較靈活。寬度和高度,比較靈活。 例子例子2.3.4 構(gòu)造一個(gè)折線繪圖器構(gòu)造一個(gè)折線繪圖器 一些應(yīng)用程序需要用一個(gè)列表存儲(chǔ)折線的頂點(diǎn)。這個(gè)列表可能是一些應(yīng)用程序需要用一個(gè)列表存儲(chǔ)折線的頂點(diǎn)。這個(gè)列表可能是數(shù)組或者鏈表,可以采用類或者結(jié)構(gòu)體保存數(shù)組,對(duì)于大量數(shù)數(shù)組或者鏈表,可以采用類或者結(jié)構(gòu)體保存數(shù)組,對(duì)于大量數(shù)據(jù),據(jù),c+ STL(標(biāo)準(zhǔn)模板庫(kù))容器可能是一個(gè)安全的數(shù)據(jù)結(jié)構(gòu)。(標(biāo)準(zhǔn)模板庫(kù))容器可能是一個(gè)安全的數(shù)據(jù)結(jié)構(gòu)。struct GLintPointGLint x,y;class GLintPoint

33、Arrayconst int MAX_NUM = 100;public:int num;GLintPoint ptMAX_NUM;void drawPolyLine(GlintPointArray poly, int closed)glBegin(closed ? GL_LINE_LOOP : GL_LINE_STRIP);for(int i = 0; i poly.num; i+)glVertex2i(poly.pti.x, poly.pti.y);glEnd();glFlush(); 2.3.2 使用使用moveTo()和()和lineTo()繪制線段繪制線段 OpenGL繪制線段很容易。

34、可以用一組命令繪制線段很容易??梢杂靡唤M命令GL_LINES,.,GL_END,也可以用也可以用drawLine()函數(shù)。()函數(shù)。moveTo和和lineTo函數(shù)可以管理一個(gè)虛擬畫筆,它的位置叫當(dāng)前位置或函數(shù)可以管理一個(gè)虛擬畫筆,它的位置叫當(dāng)前位置或CP(current position)。)。CP像一個(gè)像一個(gè)OpenGL的狀態(tài)變量,如畫的狀態(tài)變量,如畫畫的顏色和背景一樣,它在程序的控制之下。畫的顏色和背景一樣,它在程序的控制之下。moveTo(x,y)/設(shè)定設(shè)定CP到(到(x,y)lineTo(x,y)/在在CP和(和(x,y)之間畫一條線,更新)之間畫一條線,更新CP。使用。使用下面的代

35、碼,容易繪制基于點(diǎn)的列表下面的代碼,容易繪制基于點(diǎn)的列表(x0, y0), (x1, y1), . , (xn-1, yn-1)的折線。的折線。moveto(x0, y0);for(int i = 1; i n; i+)lineto(xi, yi);可以直接在可以直接在OpenGL建立建立moveTo和和lineTo這兩個(gè)函數(shù),并保持這兩個(gè)函數(shù),并保持CP moveTo和和lineTo函數(shù)實(shí)現(xiàn)為:函數(shù)實(shí)現(xiàn)為: GLintPoint CP; / 全局位置變量全局位置變量/void moveto(GLint x, GLint y)CP.x = x; CP.y = y; / 更新更新CP/void

36、lineto(GLint x, GLint y)glBegin(GL_LINES); / 繪制曲線繪制曲線glVertex2i(CP.x, CP.y);glVertex2i(x, y);glEnd();glFlush();CP.x = x; CP.y = y; / 更新更新 CP 2.3.3 繪制邊校正的矩形 多邊形的特例是邊校正的矩形,因?yàn)樗倪吪c坐標(biāo)軸平行,多邊形的特例是邊校正的矩形,因?yàn)樗倪吪c坐標(biāo)軸平行,OpenGL提供了提供了一個(gè)現(xiàn)成的函數(shù)一個(gè)現(xiàn)成的函數(shù)glRecti()。()。 glRecti(GLint x1, GLint y1, GLint x2, GLint y2); / 以

37、對(duì)角點(diǎn)以對(duì)角點(diǎn)(x1, y1) and (x2, y2)繪制矩形繪制矩形該函數(shù)基于兩個(gè)給定點(diǎn)繪制邊校正矩形,并以當(dāng)前顏色填充矩形。該函數(shù)基于兩個(gè)給定點(diǎn)繪制邊校正矩形,并以當(dāng)前顏色填充矩形。glClearColor(1.0,1.0,1.0,0.0); / 白色背景白色背景glClear(GL_COLOR_BUFFER_BIT); / 清除清除glColor3f(0.6,0.6,0.6); / 淺灰淺灰glRecti(20,20,100,70);glColor3f(0.2,0.2,0.2); / 深灰深灰glRecti(70, 50, 150, 130);glFlush();a)隨機(jī)生成的矩形雪花

38、)隨機(jī)生成的矩形雪花b)不同灰度等級(jí)的棋盤)不同灰度等級(jí)的棋盤void drawFlurry(int num, int numColors, int Width, int Height)/ draw num random rectangles in a Width by Height rectanglefor (int i = 0; i num; i+)GLint x1 = random(Width); / place corner randomlyGLint y1 = random(Height);GLint x2 = random(Width); / pick the size so it

39、 fitsGLint y2 = random(Height);GLfloat lev = random(10)/10.0; / random value, in range 0 to 1glColor3f(lev,lev,lev); / set the gray levelglRecti(x1, y1, x2, y2); / draw the rectangleglFlush();練習(xí)練習(xí)練習(xí)練習(xí)2.3.1 畫棋盤畫棋盤寫出例程寫出例程checkerboard(int size),這),這64個(gè)正方形的邊個(gè)正方形的邊長(zhǎng)都設(shè)為長(zhǎng)都設(shè)為size個(gè)像素。為這些正方形選擇兩種好看的個(gè)像素。為這些正方形

40、選擇兩種好看的顏色。顏色。解:第解:第ij個(gè)正方形的左下角位于個(gè)正方形的左下角位于(i*size, j*size)處(處( i =0,.,7 ; j = 0.7). 使用下面的代碼,可以將顏色在使用下面的代碼,可以將顏色在(r1, g1, b1) 和和(r2, g2, b2) 間變換。間變換。if(i + j)%2 =0) / 如果如果i + j 是偶數(shù)是偶數(shù) glColor3f( r1, g1, b1);else glColor3f(r2, g2, b2);練習(xí)練習(xí)練習(xí)練習(xí)2.3.1 畫棋盤畫棋盤寫出例程寫出例程checkerboard(int size),這),這64個(gè)正方形的邊個(gè)正方形的

41、邊長(zhǎng)都設(shè)為長(zhǎng)都設(shè)為size個(gè)像素。為這些正方形選擇兩種好看的個(gè)像素。為這些正方形選擇兩種好看的顏色。顏色。解:第解:第ij個(gè)正方形的左下角位于個(gè)正方形的左下角位于(i*size, j*size)處(處( i =0,.,7 ; j = 0.7). 使用下面的代碼,可以將顏色在使用下面的代碼,可以將顏色在(r1, g1, b1) 和和(r2, g2, b2) 間變換。間變換。if(i + j)%2 =0) / 如果如果i + j 是偶數(shù)是偶數(shù) glColor3f( r1, g1, b1);else glColor3f(r2, g2, b2);2.3.5 填充多邊形填充多邊形 OpenGL支持用圖案

42、或色彩填充一般的多邊形,那么這個(gè)多邊形支持用圖案或色彩填充一般的多邊形,那么這個(gè)多邊形是凸的。是凸的。 凸多邊形:如果多邊形中任意兩點(diǎn)的連線完全位于多邊凸多邊形:如果多邊形中任意兩點(diǎn)的連線完全位于多邊形內(nèi)部,那么這個(gè)多邊形是凸的。形內(nèi)部,那么這個(gè)多邊形是凸的。要繪制凸多邊形,使用頂點(diǎn)列表,把頂點(diǎn)列表放要繪制凸多邊形,使用頂點(diǎn)列表,把頂點(diǎn)列表放在在glBegin(GL_POLYGON)和)和glEnd()之()之間。可以用點(diǎn)畫線圖案填充多邊形,會(huì)把圖像間??梢杂命c(diǎn)畫線圖案填充多邊形,會(huì)把圖像貼在多邊形上,作為應(yīng)用紋理的。貼在多邊形上,作為應(yīng)用紋理的。C,E,F是凸的多邊形。是凸的多邊形。2.3.

43、6 OpenGL中的其他圖形元素中的其他圖形元素 除了點(diǎn)、線和多邊形,除了點(diǎn)、線和多邊形,OpenGL還支持繪制五種其他元素還支持繪制五種其他元素/ 使用鼠標(biāo)指定一個(gè)矩形使用鼠標(biāo)指定一個(gè)矩形static GLintPoint corner2;static int numCorners = 0; / initial value is 0if(button = GLUT_LEFT_BUTTON & state = GLUT_DOWN)cornernumCorners.x = x;cornernumCorners.y = screenHeight - y; / flip y coordina

44、tenumCorners+; / have another pointif(numCorners = 2)glRecti(corner0.x, corner0.y, corner1.x, corner1.y);numCorners = 0; / back to 0 cornerselse if(button = GLUT_RIGHT_BUTTON & state = GLUT_DOWN)glClear(GL_COLOR_BUFFER_BIT); / clear the windowglFlush();2.4 與鼠標(biāo)和鍵盤的交互與鼠標(biāo)和鍵盤的交互當(dāng)用戶按下或釋放鼠標(biāo)按鈕、移動(dòng)鼠標(biāo)或者松開

45、或按下鍵盤時(shí),當(dāng)用戶按下或釋放鼠標(biāo)按鈕、移動(dòng)鼠標(biāo)或者松開或按下鍵盤時(shí),就會(huì)產(chǎn)生一個(gè)相關(guān)事件。程序員可以用每類事件注冊(cè)一個(gè)回調(diào)就會(huì)產(chǎn)生一個(gè)相關(guān)事件。程序員可以用每類事件注冊(cè)一個(gè)回調(diào)函數(shù)函數(shù) glutMouseFunc(myMouse) :利用按下或者鼠標(biāo)按鈕時(shí)發(fā)生事件來(lái)注冊(cè)利用按下或者鼠標(biāo)按鈕時(shí)發(fā)生事件來(lái)注冊(cè) myMouse() glutMotionFunc(myMovedMouse) 利用鼠標(biāo)移動(dòng)注冊(cè)函數(shù)利用鼠標(biāo)移動(dòng)注冊(cè)函數(shù) myMovedMouse() glutKeyboardFunc(myKeyboard) 利用按下或者松開鍵盤按鍵時(shí)注冊(cè)函數(shù)利用按下或者松開鍵盤按鍵時(shí)注冊(cè)函數(shù) myKeyB

46、oard() 2.4.1 用鼠標(biāo)交互用鼠標(biāo)交互注冊(cè)一個(gè)函數(shù)到注冊(cè)一個(gè)函數(shù)到glutMouseFunc(myMouse),),myMouse()的()的名字可以任意,有四個(gè)參數(shù):名字可以任意,有四個(gè)參數(shù):void myMouse(int button, int state, int x, int y);button的值如下:的值如下:GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, 或或 GLUT_RIGHT_BUTTON;而而state的值可能為:的值可能為:GLUT_UP 或或GLUT_DOWN。x和和y為事件發(fā)生時(shí)鼠標(biāo)的位置。為事件發(fā)生時(shí)鼠標(biāo)的位置。2.4.1 用

47、鼠標(biāo)繪制點(diǎn)用鼠標(biāo)繪制點(diǎn)當(dāng)用戶每次按下鼠標(biāo)時(shí),就會(huì)在屏幕窗口上鼠標(biāo)所在的位置繪制當(dāng)用戶每次按下鼠標(biāo)時(shí),就會(huì)在屏幕窗口上鼠標(biāo)所在的位置繪制出一個(gè)點(diǎn)。由于鼠標(biāo)位置的出一個(gè)點(diǎn)。由于鼠標(biāo)位置的y值是距離屏幕頂端的像素值,故值是距離屏幕頂端的像素值,故不在不在(x, y), 而是在而是在 (x,screenHeight y)上繪制,其中上繪制,其中screenHeight 為屏幕的高度。為屏幕的高度。void myMouse(int button, int state, int x, int y)if(button = GLUT_LEFT_BUTTON & state = GLUT_DOWN)dr

48、awDot(x, screenHeight -y);else if(button = GLUT_RIGHT_BUTTON & state = GLUT_DOWN)exit(-1); 2.4.2 用鼠標(biāo)指定一個(gè)矩形用鼠標(biāo)指定一個(gè)矩形想讓用戶畫尺寸大小由鼠標(biāo)輸入的長(zhǎng)方形。用戶在兩個(gè)點(diǎn)上單擊想讓用戶畫尺寸大小由鼠標(biāo)輸入的長(zhǎng)方形。用戶在兩個(gè)點(diǎn)上單擊鼠標(biāo),指定邊校正矩形的兩個(gè)角點(diǎn),就可以畫出矩形。用戶右鼠標(biāo),指定邊校正矩形的兩個(gè)角點(diǎn),就可以畫出矩形。用戶右鍵點(diǎn)擊鼠標(biāo)即可清屏。鍵點(diǎn)擊鼠標(biāo)即可清屏。/ 使用鼠標(biāo)指定一個(gè)矩形使用鼠標(biāo)指定一個(gè)矩形static GLintPoint corner2;sta

49、tic int numCorners = 0; / initial value is 0if(button = GLUT_LEFT_BUTTON & state = GLUT_DOWN)cornernumCorners.x = x;cornernumCorners.y = screenHeight - y; / flip y coordinatenumCorners+; / have another pointif(numCorners = 2)glRecti(corner0.x, corner0.y, corner1.x, corner1.y);numCorners = 0; / b

50、ack to 0 cornerselse if(button = GLUT_RIGHT_BUTTON & state = GLUT_DOWN)glClear(GL_COLOR_BUFFER_BIT); / clear the windowglFlush();2.4.3 用鼠標(biāo)控制用鼠標(biāo)控制Sierpinski墊片墊片使用戶用鼠標(biāo)指定初始三角形的三個(gè)頂點(diǎn),并置于數(shù)組使用戶用鼠標(biāo)指定初始三角形的三個(gè)頂點(diǎn),并置于數(shù)組corners中,代碼為中,代碼為static GLintPoint corners3;static int numCorners = 0;if(button = GLUT_LE

51、FT_BUTTON & state = GLUT_DOWN)cornernumCorners.x = x;cornernumCorners.y = screenHeight - y; / flip y coordinateif(+numCorners = 3) Sierpinski(corners); / draw the gasketnumCorners = 0; / back to 0 corners 鼠標(biāo)移動(dòng)鼠標(biāo)移動(dòng)鼠標(biāo)移動(dòng)會(huì)產(chǎn)生一個(gè)鼠標(biāo)事件:鼠標(biāo)移動(dòng)會(huì)產(chǎn)生一個(gè)鼠標(biāo)事件:glutMotionFunc(myMovedMouse);注冊(cè)函數(shù)注冊(cè)函數(shù)myMovedMouse(int x

52、, int y);有兩個(gè)參數(shù),即事有兩個(gè)參數(shù),即事件發(fā)生時(shí)鼠標(biāo)所在的位置。件發(fā)生時(shí)鼠標(biāo)所在的位置。glutPassiveMotionFunc(myPassiveMotion);這個(gè)函數(shù)是沒有按下鼠標(biāo)按鈕的情況下,鼠標(biāo)在窗口內(nèi)這個(gè)函數(shù)是沒有按下鼠標(biāo)按鈕的情況下,鼠標(biāo)在窗口內(nèi)移動(dòng)時(shí)調(diào)用。該函數(shù)可以繪制并顯示橡皮矩形:隨著移動(dòng)時(shí)調(diào)用。該函數(shù)可以繪制并顯示橡皮矩形:隨著用戶移動(dòng)鼠標(biāo),矩形將相應(yīng)地變大或變小。用戶移動(dòng)鼠標(biāo),矩形將相應(yīng)地變大或變小。下面的程序是用戶單擊鼠標(biāo)建立矩形的一個(gè)角點(diǎn),然后下面的程序是用戶單擊鼠標(biāo)建立矩形的一個(gè)角點(diǎn),然后不按下鼠標(biāo)時(shí)移動(dòng)鼠標(biāo),調(diào)用不按下鼠標(biāo)時(shí)移動(dòng)鼠標(biāo),調(diào)用myPass

53、iveMotion(int x, int y),這決定了矩形的第二個(gè)角點(diǎn)。,這決定了矩形的第二個(gè)角點(diǎn)。glutPostRedisplay()調(diào)用調(diào)用myDisplay()函數(shù)。()函數(shù)。 代碼見代碼見見計(jì)算機(jī)圖形學(xué)課件見計(jì)算機(jī)圖形學(xué)課件2016計(jì)算機(jī)圖形學(xué)計(jì)算機(jī)圖形學(xué)(Opengl版第三版版第三版)書源代碼書源代碼word版版2.2.1-threeDots.doc2.4.2 鍵盤交互鍵盤交互按下鍵盤上的某個(gè)按鍵時(shí)就會(huì)產(chǎn)生一個(gè)鍵盤事件,并放入消息隊(duì)按下鍵盤上的某個(gè)按鍵時(shí)就會(huì)產(chǎn)生一個(gè)鍵盤事件,并放入消息隊(duì)列。回調(diào)函數(shù)列?;卣{(diào)函數(shù)myKeyboard()通過(guò)()通過(guò)glutKeyboardFunc(

54、myKeyboard)來(lái)注冊(cè)這種事件,該函數(shù)的原來(lái)注冊(cè)這種事件,該函數(shù)的原型為:型為:void myKeyboard(unsigned int key, int x, int y); key 值就是鍵的值就是鍵的ASCII 值,值, x 和和y為鼠標(biāo)所在的位置。實(shí)例代碼為:為鼠標(biāo)所在的位置。實(shí)例代碼為:void myKeyboard(unsigned char theKey, int mouseX, int mouseY)GLint x = mouseX;GLint y = screenHeight - mouseY; / 反轉(zhuǎn)反轉(zhuǎn)y的值的值switch(theKey)case p:drawD

55、ot(x, y); / draw a dot at the mouse positionbreak;case GLUT_KEY_LEFT: List+last.x = x; / add a pointList last.y = y;break;case E:exit(-1); /terminate the programdefault:break; / do nothing 前一頁(yè) 休息412.5 程序中的菜單設(shè)計(jì)與使用程序中的菜單設(shè)計(jì)與使用l如果一個(gè)圖形程序能夠提供菜單功能,對(duì)用戶來(lái)說(shuō),如果一個(gè)圖形程序能夠提供菜單功能,對(duì)用戶來(lái)說(shuō),使用就比較方便了。建議使用使用就比較方便了。建議使用vc。

56、設(shè)計(jì)代碼和使用設(shè)計(jì)代碼和使用GLUT菜單菜單 創(chuàng)建菜單使用創(chuàng)建菜單使用void glutCreateMenu(),菜單項(xiàng)使用(),菜單項(xiàng)使用一個(gè)帶參數(shù)的函數(shù)一個(gè)帶參數(shù)的函數(shù)glutCreateMenu(ProcessMenuEvents)來(lái)定義,必須編寫來(lái)定義,必須編寫ProcessMenuEvents函數(shù)。使用函數(shù)函數(shù)。使用函數(shù)glutAddMenuEntry()可以在菜單中添加選項(xiàng),一旦菜()可以在菜單中添加選項(xiàng),一旦菜單設(shè)計(jì)好,可以用單設(shè)計(jì)好,可以用glutAttachMenu(GLUT_RIGHT_BUTTON)建立與鼠標(biāo)按鈕的聯(lián)系。)建立與鼠標(biāo)按鈕的聯(lián)系。代碼見書代碼見書P69.案例

57、分析案例分析 為了鞏固所學(xué)知識(shí),最好的方式就是使用學(xué)過(guò)的知識(shí),在最初的學(xué)習(xí)中更是為了鞏固所學(xué)知識(shí),最好的方式就是使用學(xué)過(guò)的知識(shí),在最初的學(xué)習(xí)中更是如此,因?yàn)橐婚_始學(xué)習(xí)計(jì)算機(jī)圖形學(xué),不了解程序的編寫是必須克服的障如此,因?yàn)橐婚_始學(xué)習(xí)計(jì)算機(jī)圖形學(xué),不了解程序的編寫是必須克服的障礙。為了強(qiáng)調(diào)這一點(diǎn),每章都有案例,其中介紹的編程項(xiàng)目不僅本身有趣,礙。為了強(qiáng)調(diào)這一點(diǎn),每章都有案例,其中介紹的編程項(xiàng)目不僅本身有趣,而且濃縮了該章中所提及的知識(shí)。而且濃縮了該章中所提及的知識(shí)。 難易程度:難易程度: I: 簡(jiǎn)單的練習(xí),課堂即可完成。簡(jiǎn)單的練習(xí),課堂即可完成。. II: 教難任務(wù),可能需要幾天才能完成。教難任務(wù)

58、,可能需要幾天才能完成。 III: 復(fù)雜任務(wù),可能需要兩周完成。復(fù)雜任務(wù),可能需要兩周完成。案例案例2.1 偽隨機(jī)點(diǎn)云偽隨機(jī)點(diǎn)云(難度難度 II)rand()函數(shù)不是隨機(jī)產(chǎn)生的,而是通過(guò)一個(gè)很有規(guī)律的機(jī)制產(chǎn)生的:每個(gè)數(shù)()函數(shù)不是隨機(jī)產(chǎn)生的,而是通過(guò)一個(gè)很有規(guī)律的機(jī)制產(chǎn)生的:每個(gè)數(shù)ni 都是由它前一個(gè)數(shù)都是由它前一個(gè)數(shù) ni-1,通過(guò)一個(gè)等式確定,通過(guò)一個(gè)等式確定 : ni = (ni-1 * A + B) mod N 其中其中 A, B, 和和 N 是適當(dāng)選擇的常數(shù)。是適當(dāng)選擇的常數(shù)。 一組有效的值為一組有效的值為: A =1103515245, B = 12345, 和和 N = 3276

59、7. 這個(gè)數(shù)限制在這個(gè)數(shù)限制在 0 到到 N-1. 散亂點(diǎn)圖,調(diào)用散亂點(diǎn)圖,調(diào)用rand(N),它會(huì)返回一個(gè)),它會(huì)返回一個(gè)0,.,N-1之間的數(shù)。之間的數(shù)。glBegin(GL_POINTS);for(int i = 0; i num; i+) / do it num timesglVertex2i(random(N), random(N);glEnd();選擇不同的選擇不同的A,B,N的值生成(的值生成(x,y)對(duì)。)對(duì)。案例分析案例分析 案例案例2.2 迭代函數(shù)系統(tǒng)介紹迭代函數(shù)系統(tǒng)介紹(難度難度 II)繪制繪制Sierpinski墊片時(shí)的操作就是迭代函數(shù)墊片時(shí)的操作就是迭代函數(shù)(IFS)的一個(gè)例子。許多計(jì)算機(jī)生成的有趣圖的一個(gè)例子。許多計(jì)算機(jī)生成的有趣圖形(如分形、形(如分形、Mandelbrot集合等)都是基于迭代函數(shù)變化生成的。如:集合等)都是基于迭代函數(shù)變化生成的。如: f(.) = 2(.); 倍增器,倍增它的參數(shù)倍增器,倍增它的參數(shù); f(.) =

溫馨提示

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

評(píng)論

0/150

提交評(píng)論