




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)圖形學(xué) 課程實(shí)驗(yàn)指導(dǎo)一 實(shí)驗(yàn)總體方案 1教學(xué)目標(biāo)與基本要求 (1) 掌握教材所介紹的圖形算法的原理; (2) 掌握通過(guò)具體的平臺(tái)實(shí)現(xiàn)圖形算法的方法,培養(yǎng)相應(yīng)能力; (3) 通過(guò)實(shí)驗(yàn)培養(yǎng)具有開(kāi)發(fā)一個(gè)基本圖形軟件包的能力。 2. 實(shí)驗(yàn)平臺(tái)與考核 實(shí)驗(yàn)主要結(jié)合OpenGL設(shè)計(jì)程序?qū)崿F(xiàn)各種課堂教學(xué)中講過(guò)的圖形算法為主。程序設(shè)計(jì)語(yǔ)言主要以C/C+語(yǔ)言為主,開(kāi)發(fā)平臺(tái)為Visual C+。每次實(shí)驗(yàn)前完成實(shí)驗(yàn)報(bào)告的實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容、實(shí)驗(yàn)原理、實(shí)驗(yàn)代碼四部分并接受
2、抽查,實(shí)驗(yàn)完成后完成實(shí)驗(yàn)結(jié)果、實(shí)驗(yàn)體會(huì)兩部分,本次實(shí)驗(yàn)課結(jié)束前提交。 3. 實(shí)驗(yàn)步驟 (1) 預(yù)習(xí)教材與實(shí)驗(yàn)指導(dǎo)相關(guān)的算法理論及原理;(2) 仿照教材與實(shí)驗(yàn)指導(dǎo)提供的算法,利用VC+OpenGL進(jìn)行實(shí)現(xiàn); (3) 調(diào)試、編譯、運(yùn)行程序,運(yùn)行通過(guò)后,可考慮對(duì)程序進(jìn)行修改或改進(jìn)。 二. 實(shí)驗(yàn)具體方案 實(shí)驗(yàn)預(yù)備知識(shí) OpenGL作為當(dāng)前主流的圖形API之一,它在一些場(chǎng)合具有比DirectX更優(yōu)越的特性。 1)與C語(yǔ)言緊密結(jié)合: OpenGL命令最初就是用C語(yǔ)言函數(shù)來(lái)進(jìn)行描
3、述的,對(duì)于學(xué)習(xí)過(guò)C語(yǔ)言的人來(lái)講,OpenGL是容易理解和學(xué)習(xí)的。如果你曾經(jīng)接觸過(guò)TC的graphics.h,你會(huì)發(fā)現(xiàn),使用OpenGL作圖甚至比TC更加簡(jiǎn)單; 2)強(qiáng)大的可移植性: 微軟的Direct3D雖然也是十分優(yōu)秀的圖形API,但它只用于Windows系統(tǒng)。而OpenGL不僅用于 Windows,還可以用于Unix/Linux等其它系統(tǒng),它甚至在大型計(jì)算機(jī)、各種專業(yè)計(jì)算機(jī)(如:醫(yī)療用顯示設(shè)備)上都有應(yīng)用。并且,OpenGL 的基本命令都做到了硬件無(wú)關(guān),甚至是平臺(tái)無(wú)關(guān); 3) 高性能的圖形渲染: OpenGL是一個(gè)工業(yè)標(biāo)準(zhǔn),它的技
4、術(shù)緊跟時(shí)代,現(xiàn)今各個(gè)顯卡廠家無(wú)一不對(duì)OpenGL提供強(qiáng)力支持,激烈的競(jìng)爭(zhēng)中使得OpenGL性能一直領(lǐng)先。總之,OpenGL是一個(gè)非常優(yōu)秀的圖形軟件接口。OpenGL官方網(wǎng)站(英文) 下面將對(duì)Windows下的OpenGL編程進(jìn)行簡(jiǎn)單介紹。如下是學(xué)習(xí)OpenGL前的準(zhǔn)備工作: 1選擇一個(gè)編譯環(huán)境 現(xiàn)在Windows系統(tǒng)的主流編譯環(huán)境有Visual C+,C+ Builder,Dev-C+等,它們都是支持OpenGL的。但這里我們選擇Visual C+ 作為學(xué)習(xí)OpenGL的實(shí)驗(yàn)環(huán)境。
5、160;2安裝GLUT工具包 GLUT不是OpenGL所必須的,但它會(huì)給我們的學(xué)習(xí)帶來(lái)一定的方便,推薦安裝。Windows環(huán)境下的GLUT下載地址:(大小約為150k) /resources/libraries/glut/glutdlls37beta.zip Windows環(huán)境下安裝GLUT的步驟: 1)將下載的壓縮包解開(kāi),將得到5個(gè)文件 2)在“我的電腦”中搜索“gl.h”,并找到其所在文件夾(如果是VisualStudio2005,則應(yīng)該是其安裝目錄下面的“VCPlatformSDKincludegl
6、文件夾”)。把解壓得到的glut.h放到這個(gè)文件夾。 3)把解壓得到的glut.lib和glut32.lib放到靜態(tài)函數(shù)庫(kù)所在文件夾(如果是VisualStudio2005,則應(yīng)該是其安裝目錄下面的“VClib”文件夾)。 4)把解壓得到的glut.dll和glut32.dll放到操作系統(tǒng)目錄下面的system32文件夾內(nèi)。(典型的位置為:C:WindowsSystem32)3建立一個(gè)OpenGL工程 這里以VC為例:選擇File->New->Project,然后選擇Win32 Console Application,選擇一個(gè)名字,
7、然后按OK。在談出的對(duì)話框左邊點(diǎn)Application Settings,找到Empty project并勾上,選擇Finish。然后向該工程添加一個(gè)代碼文件,取名為“OpenGL.cpp”。 實(shí)驗(yàn)1 像素點(diǎn)的生成1實(shí)驗(yàn)?zāi)康模?#160;熟悉編程環(huán)境;了解光柵圖形顯示器的特點(diǎn);了解計(jì)算機(jī)繪圖的特點(diǎn);利用VC+OpenGL作為開(kāi)發(fā)平臺(tái)設(shè)計(jì)程序,以能夠在屏幕上生成任意一個(gè)像素點(diǎn)為本實(shí)驗(yàn)的結(jié)束。 2實(shí)驗(yàn)內(nèi)容: (1) 了解和使用VC的開(kāi)發(fā)環(huán)境,理解簡(jiǎn)單的OpenGL程序結(jié)構(gòu)。 (2) 掌握OpenGL提供的基本
8、圖形函數(shù),尤其是生成點(diǎn)的函數(shù)。 3實(shí)驗(yàn)原理: (1)基本語(yǔ)法 常用的程序設(shè)計(jì)語(yǔ)言,如C、C+、Pascal、Fortran和Java等,都支持OpenGL的開(kāi)發(fā)。這里只討論C版本下OpenGL的語(yǔ)法。OpenGL基本函數(shù)均使用gl作為函數(shù)名的前綴,如glClearColor();實(shí)用函數(shù)則使用glu作為函數(shù)名的前綴,如gluSphere()。OpenGL基本常量的名字以GL_開(kāi)頭,如GL_LINE_LOOP;實(shí)用常量的名字以GLU_開(kāi)頭,如GLU_FILL。一些函數(shù)如glColor*()(定義顏色值),函數(shù)名后可以接不同的后綴以支持不同的數(shù)據(jù)類型和格式。如glCo
9、lor3b(.)、glColor3d(.)、glColor3f(.)和glColor3bv(.)等,這幾個(gè)函數(shù)在功能上是相似的,只是適用于不同的數(shù)據(jù)類型和格式,其中3表示該函數(shù)帶有三個(gè)參數(shù),b、d、f分別表示參數(shù)的類型是字節(jié)型、雙精度浮點(diǎn)型和單精度浮點(diǎn)型,v則表示這些參數(shù)是以向量形式出現(xiàn)的。 OpenGL定義了一些特殊標(biāo)識(shí)符,如GLfloat,GLvoid。它們其實(shí)就是C中的float和void。在gl.h文件中可以看到以下定義: typedef float GLfloat; typedef void GLvoi
10、d; 一些基本的數(shù)據(jù)類型都有類似的定義項(xiàng)。 (2)程序的基本結(jié)構(gòu) OpenGL程序的基本結(jié)構(gòu)可分為三個(gè)部分: 第一部分是初始化部分。主要是設(shè)置一些OpenGL的狀態(tài)開(kāi)關(guān),如顏色模式(RGBA或ALPHA)的選擇,是否作光照處理(若有的話,還需設(shè)置光源的特性),深度檢驗(yàn),裁剪等等。這些狀態(tài)一般都用函數(shù)glEnable(.), glDisable()來(lái)設(shè)置,表示特定的狀態(tài)。 第二部分設(shè)置觀察坐標(biāo)系下的取景模式和取景框位置大小。主要利用了三個(gè)函數(shù): 函數(shù)void glViewport(left,top,rig
11、ht,bottom):設(shè)置在屏幕上的窗口大小,四個(gè)參數(shù)描述屏幕窗口四個(gè)角上的坐標(biāo)(以象素表示)函數(shù)void glOrtho(left,right,bottom,top,near,far):設(shè)置投影方式為正交投影(平行投影),其取景體積是一個(gè)各面均為矩形的六面體; 函數(shù)void gluPerspective(fovy,aspect,zNear,zFar):設(shè)置投影方式為透視投影,其取景體積是一個(gè)截頭錐體。 第三部分是OpenGL的主要部分,使用OpenGL的庫(kù)函數(shù)構(gòu)造幾何物體對(duì)象的數(shù)學(xué)描述,包括點(diǎn)線面的位置和拓?fù)潢P(guān)系、幾何變換、光照處理等等。 以
12、上三個(gè)部分是OpenGL程序的基本框架,即使移植到使用MFC的Windows程序中,也是如此。只是由于Windows自身有一套顯示方式,需要進(jìn)行一些必要的改動(dòng)以協(xié)調(diào)這兩種不同顯示方式。 (3)狀態(tài)機(jī)制 OpenGL的工作方式是一種狀態(tài)機(jī)制,它可以進(jìn)行各種狀態(tài)或模式設(shè)置,這些狀態(tài)或模式在重新改變它們之前一直有效。例如,當(dāng)前顏色就是一個(gè)狀態(tài)變量,在這個(gè)狀態(tài)改變之前,繪制的每個(gè)象素都將使用該顏色,直到當(dāng)前顏色被設(shè)置為其它顏色為止。OpenGL中大量地使用了這種狀態(tài)機(jī)制,如顏色模式、投影模式、單雙顯示緩存區(qū)的設(shè)置、背景色的設(shè)置、光源的位置和特性等等。許多狀態(tài)變量可以通過(guò)glEnab
13、le()、glDisable()這兩個(gè)函數(shù)來(lái)設(shè)置成有效或無(wú)效狀態(tài),如是否設(shè)置光照、是否進(jìn)行深度檢測(cè)等;在被設(shè)置成有效狀態(tài)之后,絕大部分狀態(tài)變量都有一個(gè)缺省值。通常情況下,可以用下列四個(gè)函數(shù)來(lái)獲取某個(gè)狀態(tài)變量的值:glGetBooleanv()、glGetDouble()、glGetFloatv()和glGetIntegerv()。究竟選擇哪個(gè)函數(shù)應(yīng)該根據(jù)所要獲得的返回值的數(shù)據(jù)類型來(lái)決定。還有些狀態(tài)變量有特殊的查詢函數(shù),如glGetLight*()、glGetError()和glPolygonStipple()等。另外,使用glPushAttrib()和glPopAttrib()函數(shù),可以存儲(chǔ)和
14、恢復(fù)最近的狀態(tài)變量的值。只要有可能,都應(yīng)該使用這些函數(shù),因?yàn)樗鼈儽绕渌樵兒瘮?shù)的效率更高。 4實(shí)驗(yàn)代碼: 一個(gè)簡(jiǎn)單的OpenGL程序如下:(注意,如果需要編譯并運(yùn)行,需要正確安裝GLUT,安裝方法如預(yù)備知識(shí)中所述) 該程序的作用是在一個(gè)黑色的窗口中央畫(huà)一個(gè)矩形、三角形和三個(gè)點(diǎn)。下面對(duì)各行語(yǔ)句進(jìn)行說(shuō)明: 首先,需要包含頭文件#include <GL/glut.h>,這是GLUT的頭文件。本來(lái)OpenGL程序一般還要包含<GL/gl.h>和<GL/glu.h>,但GLUT的頭文件中已經(jīng)自動(dòng)將這兩個(gè)文件包含了,不必
15、再次包含; 然后看main函數(shù)。int main(int argc, char *argv),這個(gè)是帶命令行參數(shù)的main函數(shù)。注意main函數(shù)中的各語(yǔ)句,除了最后的return之外,其余全部以glut開(kāi)頭。這種以glut開(kāi)頭的函數(shù)都是GLUT工具包所提供的函數(shù),下面對(duì)用到的幾個(gè)函數(shù)進(jìn)行介紹; 1)glutInit,對(duì)GLUT進(jìn)行初始化,這個(gè)函數(shù)必須在其它的GLUT使用之前調(diào)用一次。其格式比較固定,一般都是glutInit(&argc, argv)就行; 2) glutInitDisplayMod
16、e,設(shè)置顯示方式,其中GLUT_RGB表示使用RGB顏色,與之對(duì)應(yīng)的還有GLUT_INDEX(表示使用索引顏色)。GLUT_SINGLE表示使用單緩沖,與之對(duì)應(yīng)的還有GLUT_DOUBLE(使用雙緩沖)。更多信息,以后的實(shí)驗(yàn)教程會(huì)有講解介紹; 3) glutInitWindowPosition,設(shè)置窗口在屏幕中的位置;4) glutInitWindowSize,設(shè)置窗口的大?。?#160;5) glutCreateWindow,根據(jù)前述設(shè)置的信息創(chuàng)建窗口。參數(shù)將被作為窗口的標(biāo)題。注意:窗口被創(chuàng)建后,并不立即顯示到屏幕上。需要調(diào)用glutMainLoop才
17、能看到窗口; 6) glutDisplayFunc,設(shè)置一個(gè)函數(shù),當(dāng)需要進(jìn)行畫(huà)圖時(shí),這個(gè)函數(shù)就會(huì)被調(diào)用。(暫且這樣理解); 7) glutMainLoop,進(jìn)行一個(gè)消息循環(huán)。(現(xiàn)在只需知道這個(gè)函數(shù)可以顯示窗口,并且等待窗口關(guān)閉后才會(huì)返回。) 在glutDisplayFunc函數(shù)中,我們?cè)O(shè)置了“當(dāng)需要畫(huà)圖時(shí),請(qǐng)調(diào)用myDisplay函數(shù)”。于是myDisplay函數(shù)就用來(lái)畫(huà)圖。觀察myDisplay中的三個(gè)函數(shù)調(diào)用,發(fā)現(xiàn)它們都以gl開(kāi)頭。這種以gl開(kāi)頭的函數(shù)都是OpenGL的標(biāo)準(zhǔn)函數(shù),下面對(duì)用到的函數(shù)進(jìn)行介紹: 1) glCl
18、earColor(0.0, 0.0, 0.0, 0.0) :將清空顏色設(shè)為黑色(為什么會(huì)有四個(gè)參數(shù)?);2) glClear(GL_COLOR_BUFFER_BIT):將窗口的背景設(shè)置為當(dāng)前清空顏色; 3) glRectf,畫(huà)一個(gè)矩形。四個(gè)參數(shù)分別表示了位于對(duì)角線上的兩個(gè)點(diǎn)的橫、縱坐標(biāo);4) glFlush,保證前面的OpenGL命令立即執(zhí)行(而不是讓它們?cè)诰彌_區(qū)中等待)。 5. 思考題 如圖所示,根據(jù)示范程序,能否在原有結(jié)果基礎(chǔ)上添加三條直線組成三角形?實(shí)驗(yàn)2 直線生成算法
19、的實(shí)現(xiàn)1實(shí)驗(yàn)?zāi)康模?#160;理解基本圖形元素光柵化的基本原理,掌握一種基本圖形元素光柵化算法,利用OpenGL實(shí)現(xiàn)直線光柵化的DDA算法。 2實(shí)驗(yàn)內(nèi)容: (1) 根據(jù)所給的直線光柵化的示范源程序,在計(jì)算機(jī)上編譯運(yùn)行,輸出正確結(jié)果; (2) 指出示范程序采用的算法,以此為基礎(chǔ)將其改造為中點(diǎn)線算法或Bresenham算法,寫(xiě)入實(shí)驗(yàn)報(bào)告; (3) 根據(jù)示范代碼,將其改造為圓的光柵化算法,寫(xiě)入實(shí)驗(yàn)報(bào)告; (4) 了解和使用OpenGL的生成直線的命令,來(lái)驗(yàn)證程序運(yùn)行結(jié)果。 3實(shí)驗(yàn)原理: 示范
20、代碼原理參見(jiàn)教材直線光柵化一節(jié)中的DDA算法。下面介紹下OpenGL畫(huà)線的一些基礎(chǔ)知識(shí)和glutReshapeFunc()函數(shù)。 (1)數(shù)學(xué)上的直線沒(méi)有寬度,但OpenGL的直線則是有寬度的。同時(shí),OpenGL的直線必須是有限長(zhǎng)度,而不是像數(shù)學(xué)概念那樣是無(wú)限的??梢哉J(rèn)為,OpenGL的“直線”概念與數(shù)學(xué)上的“線段”接近,它可以由兩個(gè)端點(diǎn)來(lái)確定。這里的線由一系列頂點(diǎn)順次連結(jié)而成,有閉合和不閉合兩種。 前面的實(shí)驗(yàn)已經(jīng)知道如何繪“點(diǎn)”,那么OpenGL是如何知道拿這些頂點(diǎn)來(lái)做什么呢?是一個(gè)一個(gè)的畫(huà)出來(lái),還是連成線?或者構(gòu)成一個(gè)多邊形?或是做其它事情呢?為了解決這一問(wèn)題,OpenG
21、L要求:指定頂點(diǎn)的命令必須包含在glBegin函數(shù)之后,glEnd函數(shù)之前(否則指定的頂點(diǎn)將被忽略),并由glBegin來(lái)指明如何使用這些點(diǎn)。 例如: glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.0f); glEnd(); 則這兩個(gè)點(diǎn)將分別被畫(huà)出來(lái)。如果將GL_POINTS替換成GL_LINES,則兩個(gè)點(diǎn)將被認(rèn)為是直線的兩個(gè)端點(diǎn),OpenGL將會(huì)畫(huà)出一
22、條直線。還可以指定更多的頂點(diǎn),然后畫(huà)出更復(fù)雜的圖形。另一方面,glBegin支持的方式除了GL_POINTS和GL_LINES,還有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每種方式的大致效果見(jiàn)下圖:(2)首次打開(kāi)窗口、移動(dòng)窗口和改變窗口大小時(shí),窗口系統(tǒng)都將發(fā)送一個(gè)事件,以通知程序員。如果使用的是GLUT,通知將自動(dòng)完成,并調(diào)用向glutReshapeFunc()注冊(cè)的函數(shù)。該函數(shù)必須完成下列工作: l 重新建立用作新渲染畫(huà)布的矩形區(qū)域; l 定義繪制物體
23、時(shí)使用的坐標(biāo)系。 如: 在GLUT內(nèi)部,將給該函數(shù)傳遞兩個(gè)參數(shù):窗口被移動(dòng)或修改大小后的寬度和高度,單位為像素。glViewport()調(diào)整像素矩形,用于繪制整個(gè)窗口。接下來(lái)三個(gè)函數(shù)調(diào)整繪圖坐標(biāo)系,使左下角位置為(0, 0),右上角為(w, h)。 4實(shí)驗(yàn)代碼:注: glShadeModel選擇平坦或光滑漸變模式。GL_SMOOTH為缺省值,為光滑漸變模式,GL_FLAT為平坦?jié)u變模式。 5思考題 示范代碼有個(gè)小錯(cuò)誤,能否指出并改正?請(qǐng)將結(jié)果寫(xiě)入實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)3 變換1實(shí)驗(yàn)?zāi)康模?#160;進(jìn)一步掌握二維
24、、三維變換的數(shù)學(xué)知識(shí)、變換原理、變換種類、變換方法;進(jìn)一步理解采用齊次坐標(biāo)進(jìn)行二維、三維變換的必要性;利用OpenGL實(shí)現(xiàn)二維、三維圖形變換。 2實(shí)驗(yàn)內(nèi)容: (1) 掌握二維、三維變換的原理及數(shù)學(xué)公式; (2) 利用OpenGL實(shí)現(xiàn)二維、三維圖形變換,在屏幕上顯示變換過(guò)程或變換結(jié)果。(3) 掌握OpenGL常用的變換函數(shù)。 3實(shí)驗(yàn)原理: OpenGL的三個(gè)基本幾何變換函數(shù)介紹如下:(1) 平移變換 平移變換函數(shù)如下: void glTranslatefd(TYPE
25、;x,TYPE y,TYPE z); 三個(gè)函數(shù)參數(shù)就是目標(biāo)分別沿三個(gè)軸向平移的偏移量。這個(gè)函數(shù)表示用這三個(gè)偏移量生成的矩陣乘以當(dāng)前矩陣。當(dāng)參數(shù)是(0.0,0.0,0.0)時(shí),表示對(duì)函數(shù)glTranslate*()的操作是單位矩陣,也就是對(duì)物體沒(méi)有影響。 (2) 旋轉(zhuǎn)變換旋轉(zhuǎn)變換函數(shù)如下: void glRotatefd(TYPE angle,TYPE x,TYPE y,TYPE z); 函數(shù)中第一個(gè)參數(shù)是表示目標(biāo)沿從點(diǎn)(x,y,z)到原點(diǎn)的方向逆時(shí)針旋轉(zhuǎn)的角度,后
26、三個(gè)參數(shù)是旋轉(zhuǎn)的方向點(diǎn)坐標(biāo)。這個(gè)函數(shù)表示用這四個(gè)參數(shù)生成的矩陣乘以當(dāng)前矩陣。當(dāng)角度參數(shù)是0.0時(shí),表示對(duì)物體沒(méi)有影響。 (3) 比例變換比例變換函數(shù)如下: void glScalefd(TYPE x,TYPE y,TYPE z); 三個(gè)函數(shù)參數(shù)值就是目標(biāo)分別沿三個(gè)軸向縮放的比例因子。這個(gè)函數(shù)表示用這三個(gè)比例因子生成的矩陣乘以當(dāng)前矩陣。這個(gè)函數(shù)能完成沿相應(yīng)的軸對(duì)目標(biāo)進(jìn)行拉伸、壓縮和反射三項(xiàng)功能。當(dāng)參數(shù)是(1.0,1.0,1.0)時(shí),表示對(duì)函數(shù)glScale*()操作是單位矩陣,也就是對(duì)物體沒(méi)有影響。當(dāng)其中
27、某個(gè)參數(shù)為負(fù)值時(shí),表示將對(duì)目標(biāo)進(jìn)行相應(yīng)軸的反射變換,且這個(gè)參數(shù)不為1.0,則還要進(jìn)行相應(yīng)軸的縮放變換。最好不要令三個(gè)參數(shù)值都為零,這將導(dǎo)致目標(biāo)沿三軸都縮為零。 4實(shí)驗(yàn)代碼:這個(gè)程序需要注意的地方有幾點(diǎn)。 使用了雙緩存模式,程序在空閑時(shí)一直不停的調(diào)用display函數(shù),這個(gè)函數(shù)繪制完圖像后,改變旋轉(zhuǎn)的角度,然后交換雙緩存,這樣,每畫(huà)完一幀就交換,形成了動(dòng)畫(huà)。 另外,使用了深度緩存,激活了深度測(cè)試,這樣,被遮擋的面就不會(huì)顯示,大家可以把激活深度緩存的一行去掉看看效果。大家還可以改變變換的方式,達(dá)到不同的效果。實(shí)驗(yàn)4 裁剪1實(shí)驗(yàn)?zāi)康模?#160;了解二維圖形裁
28、剪的原理(點(diǎn)的裁剪、直線的裁剪、多邊形的裁剪),利用VC+OpenGL實(shí)現(xiàn)直線的裁剪算法。 2實(shí)驗(yàn)內(nèi)容: (1) 理解直線裁剪的原理(Cohen-Surtherland算法、梁友棟算法) (2) 利用VC+OpenGL實(shí)現(xiàn)直線的編碼裁剪算法,在屏幕上用一個(gè)封閉矩形裁剪任意一條直線。 (3) 調(diào)試、編譯、修改程序。 (4) 嘗試實(shí)現(xiàn)梁友棟裁剪算法。 3實(shí)驗(yàn)原理: 編碼裁剪算法的主要思想是:對(duì)于每條線段,分為三種情況處理。(1)若線段完全在窗口之內(nèi),則顯示該線段,稱為“取”;(2)若線段明
29、顯在窗口之外,則丟棄該線段,稱為“棄”;(3)若線段既不滿足“取”的條件,也不滿足“舍”的條件,則把線段分割為兩段。其中一段完全在窗口之外,可棄之;對(duì)另一段則重復(fù)上述處理。 算法中,為了快速判斷一條直線段與矩形窗口的位置關(guān)系,采用了如圖所示的空間劃分和編碼方案。延長(zhǎng)窗口的四條邊界,把未經(jīng)裁剪的圖形區(qū)域分為九個(gè)區(qū),每個(gè)區(qū)有一個(gè)四位二進(jìn)制的編碼,從左到右各位依次表示上、下、右、左。例如,區(qū)號(hào)0101,左起第二位1表示該區(qū)在窗口的下方;右起第一位的1表示該區(qū)在窗口的左方。整個(gè)區(qū)號(hào)表示該區(qū)在窗口的左下方。裁剪一條線段時(shí),先求出兩端點(diǎn)所在的區(qū)號(hào)code1和code2,若code1 =
30、 0且code2 = 0,則說(shuō)明線段的兩個(gè)端點(diǎn)均在窗口內(nèi),那么整條線段必在窗口內(nèi),應(yīng)取之;若code1和code2經(jīng)按位與運(yùn)算的結(jié)果不為0,則說(shuō)明兩個(gè)端點(diǎn)同在窗口的上方、下方、左方或右方。這種情況下,對(duì)線段的處理是棄之。如果上述兩種條件都不成立,則按第三種情況處理。求出線段與窗口某邊的交點(diǎn),在交點(diǎn)處把線段一分為二,其中必有一段完全在窗口外,可棄之,對(duì)另一段則重復(fù)上述處理。 4實(shí)驗(yàn)代碼:5實(shí)驗(yàn)思考題 請(qǐng)分別給出直線的三種不同位置情況,測(cè)試實(shí)驗(yàn)代碼是否存在問(wèn)題,有的話請(qǐng)調(diào)試改正??赡艿脑挘梢試L試實(shí)現(xiàn)梁友棟裁剪算法。實(shí)驗(yàn)5 Bezier曲線1實(shí)驗(yàn)?zāi)康模?#160;了解曲線的生成原理,掌握幾種常見(jiàn)的曲線生成算法,利用VC+OpenGL實(shí)現(xiàn)Bezier曲線生成算法。 2實(shí)驗(yàn)內(nèi)容: (1) 結(jié)合示范代碼了解曲線生成原理與算
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中提前考試數(shù)學(xué)試卷
- 福建省質(zhì)檢卷數(shù)學(xué)試卷
- 高一年泉州統(tǒng)考數(shù)學(xué)試卷
- 福州初中五月數(shù)學(xué)試卷
- 甘肅15高考數(shù)學(xué)試卷
- 教師課件的制作培訓(xùn)
- 2025年浙江醫(yī)療衛(wèi)生招聘金華義烏市中醫(yī)醫(yī)院招聘4人筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025年年唐都醫(yī)院住培醫(yī)師招錄筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025至2030城市建設(shè)規(guī)劃發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 二一年高考數(shù)學(xué)試卷
- 醫(yī)療器械行業(yè)市場(chǎng)部人員崗位職責(zé)
- 旅行社導(dǎo)游帶團(tuán)操作流程
- 部編版小學(xué)道德與法治三年級(jí)下冊(cè)期末質(zhì)量檢測(cè)試卷【含答案】5套
- 怎樣當(dāng)好一名師長(zhǎng)
- DB21T 3354-2020 遼寧省綠色建筑設(shè)計(jì)標(biāo)準(zhǔn)
- 新生兒復(fù)蘇解析課件
- (完整版)重大危險(xiǎn)源清單及辨識(shí)表
- ABI7500熒光定量PCR儀標(biāo)準(zhǔn)操作規(guī)程
- 語(yǔ)言領(lǐng)域核心經(jīng)驗(yàn)《學(xué)前兒童語(yǔ)言學(xué)習(xí)與發(fā)展核心經(jīng)驗(yàn)》
- DB51T 5036-2017 四川省屋面工程施工工藝規(guī)程
- 11級(jí)設(shè)計(jì)題目寶豐紅四煤礦
評(píng)論
0/150
提交評(píng)論