計算機圖形學(xué)實驗指導(dǎo)書--xhp_第1頁
計算機圖形學(xué)實驗指導(dǎo)書--xhp_第2頁
計算機圖形學(xué)實驗指導(dǎo)書--xhp_第3頁
計算機圖形學(xué)實驗指導(dǎo)書--xhp_第4頁
計算機圖形學(xué)實驗指導(dǎo)書--xhp_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機圖形學(xué)實驗指導(dǎo)書軟件學(xué)院軟件理論系2013年2月22日前 言隨著計算機科學(xué)與技術(shù)的迅猛發(fā)展,特別是大規(guī)模集成電路和超大規(guī)模集成電路技術(shù)的飛速發(fā)展,計算機已經(jīng)成為一種高速、費用低的生成圖形的有效工具。計算機圖形學(xué)作為利用計算機生成圖形的技術(shù),已經(jīng)越來越廣泛地在各個領(lǐng)域得到應(yīng)用。隨著計算機圖形學(xué)應(yīng)用領(lǐng)域的拓寬和應(yīng)用水平的提高,人們越來越重視對該項技術(shù)的研究和利用。當(dāng)今,計算機圖形學(xué)已經(jīng)成為了計算機科學(xué)技術(shù)領(lǐng)域的一個重要研究方向,并被廣泛的應(yīng)用于科學(xué)計算、工程設(shè)計、醫(yī)藥、工業(yè)、藝術(shù)、娛樂業(yè)、廣告業(yè)、教育與培訓(xùn)、商業(yè)和政府部門等。鑒于計算機圖形學(xué)的重要性和應(yīng)用的廣泛性,計算機科學(xué)與技術(shù)專業(yè)將其設(shè)

2、置為專業(yè)必選的選修課。它主要是研究用計算機及其圖形設(shè)備來輸入、表示、變換、運算和輸出圖形的原理、算法及系統(tǒng)。通過對本課程的學(xué)習(xí),使學(xué)生對計算機圖形學(xué)有一個完整的了解,并為進行計算機圖形學(xué)應(yīng)用和研究打下扎實基礎(chǔ)。為了讓學(xué)生深入理解各種圖形算法和相關(guān)理論知識,貫徹學(xué)生學(xué)習(xí)知識是為了應(yīng)用知識、應(yīng)用就要追求創(chuàng)新應(yīng)用的思想和意識,設(shè)計了8個實驗。通過實驗,使學(xué)生更加深入的理解計算機圖形系統(tǒng)的工作機理和基本圖形生成和處理算法。實現(xiàn)語言為Turbo C 、Visual C+ 6.0、OpenGl,或其它學(xué)生掌握的高級語言。這些實驗是對學(xué)生的一種多全面訓(xùn)練。它著眼于原理與應(yīng)用的結(jié)合,使學(xué)生學(xué)會如何把書上學(xué)到的

3、知識用于解決實際問題,培養(yǎng)軟件工作所需要的動手能力;另一方面,能使書上的知識變“活”,起到深化理解和靈活掌握教學(xué)內(nèi)容的目的。在實驗過程中,能夠培養(yǎng)學(xué)生的自學(xué)能力、團隊協(xié)作能力、解決問題能力、軟件開發(fā)能力等多種能力。目 錄實驗要求及實驗報告規(guī)范1實驗一 交互式繪圖技術(shù)的實現(xiàn)2實驗二 直線、圓弧及橢圓弧的生成算法5實驗三 多邊形的區(qū)域填充7實驗四 二維幾何變換9實驗五 裁剪算法10實驗六 三維圖形變換11實驗七 曲線與曲面12實驗八 真實感圖形繪制14參考文獻15附錄A C程序繪圖基礎(chǔ)16附錄B Visual C+圖形程序設(shè)計23一、實驗?zāi)康?3二、實驗任務(wù)(需要課外學(xué)時8學(xué)時)23三、基礎(chǔ)知識和

4、實驗步驟23(一) Visual C+ 6.0應(yīng)用程序開發(fā)方法23(二) 圖形設(shè)備接口和圖形程序設(shè)計26(三)鼠標(biāo)編程36(四)菜單程序設(shè)計42四、實驗總結(jié)46附錄C OpenGL圖形程序設(shè)計4752 - 實驗要求及實驗報告規(guī)范一、實驗的性質(zhì)、目的和任務(wù)本實驗是與本專業(yè)課計算機圖形學(xué)相配套的,通過計算機圖形學(xué)實驗教學(xué),引導(dǎo)學(xué)生由淺入深地掌握計算機圖形學(xué)理論與相關(guān)算法,具有一定實踐體會和相關(guān)的編程能力及圖形處理的能力,為畢業(yè)設(shè)計和畢業(yè)后從事計算機繪圖、計算機輔助設(shè)計、輔助教學(xué)、輔助工程、圖形處理等打下基礎(chǔ)。本實驗教學(xué)主要內(nèi)容是要求學(xué)生編程實現(xiàn)各種圖形的繪制,強化學(xué)生的程序設(shè)計能力和程序調(diào)試能力,

5、使學(xué)生鞏固所學(xué)各種圖形的生成算法的理論知識。二、實驗基本要求實驗基本要求:本實驗教學(xué)的基本要求是: 實驗課前,學(xué)生必須預(yù)習(xí)實驗指導(dǎo)書中的實驗內(nèi)容,了解本次實驗的目的、要求、原理、算法、步驟等,準(zhǔn)備好實驗的程序設(shè)計算法描述與關(guān)鍵分析內(nèi)容; 準(zhǔn)備好程序和測試數(shù)據(jù),上機調(diào)試、運行; 完成每個實驗后進行結(jié)果對比分析,完成實驗報告。實驗內(nèi)容要求:(1) 認(rèn)真分析題目的條件和要求,復(fù)習(xí)相關(guān)理論知識,選擇適當(dāng)?shù)慕鉀Q方案和算法;(2) 編寫上機實驗程序,作好上機前的準(zhǔn)備工作;(3) 上機調(diào)試程序,繪制圖形,驗證算法的正確性;(4) 分析和解釋運行結(jié)果;(5) 程序調(diào)試完后,須由實驗輔導(dǎo)教師在機器上檢查運行結(jié)果

6、;(6) 按照要求書寫每次實驗的實驗報告。 (7) 要求獨立完成上述各項。三、實驗環(huán)境實驗設(shè)備:計算機實驗使用的語言:C或Visual C+、OpenGL四、考核與報告(1) 本課程的評分方法是考查,實驗作為平時成績占學(xué)期期末總成績的30%。(2) 每個實驗完成后必須完成相應(yīng)的實驗報告。實驗成績組成為:實驗報告占40;按照教學(xué)計劃的實驗,現(xiàn)場編程序,演示計算結(jié)果占50;創(chuàng)新占10。五、實驗報告格式實驗報告在書寫過程中應(yīng)該將以下問題寫清楚1、 實驗?zāi)康模?、 實驗要求:3、 實驗內(nèi)容:4、 實驗題目: 5、 設(shè)計原理與思想: 6、 對應(yīng)程序:7、 實驗結(jié)果(輸出圖形)及其分析: 8、 計算中出現(xiàn)

7、的問題,解決方法及體會:實驗一 交互式繪圖技術(shù)的實現(xiàn)一、實驗?zāi)康?、掌握各種交互式繪圖技術(shù)及其原理;2、掌握Visual C+集成編程環(huán)境的使用,圖形設(shè)備接口和常用圖形程序設(shè)計、鼠標(biāo)編程、畫刷與畫筆以及菜單設(shè)計等,能夠利用Visual C+實現(xiàn)各種交互式繪圖技術(shù);3、了解OpenGL的基本操作及其庫函數(shù),能夠通過OpenGL庫函數(shù)實現(xiàn)各種交互式繪圖技術(shù)。二、實驗要求1、用Visual C+設(shè)計一個簡易的交互式繪圖軟件,能夠?qū)崿F(xiàn)鉛筆繪圖,以及直線、圓等基本圖形的繪制;2、能夠?qū)崿F(xiàn)橡皮筋畫線或圓、拾取、拖動、撤銷和重做等交互式技術(shù);3、能夠用OpenGL函數(shù)庫實現(xiàn)橡皮筋技術(shù)和拾取操作。三、算法提示

8、(一)鉛筆繪圖的實現(xiàn):1、建一個MFC AppWizard(exe)工程(具體操作見附錄B),新增“繪圖”菜單,并在該菜單下添加子菜單“鉛筆”;2、向視圖類中添加1個菜單消息響應(yīng)函數(shù)和3個鼠標(biāo)消息響應(yīng)函數(shù),并輸入時間處理程序代碼。(1)新增成員變量: public: int drawMode; /畫圖模式,1表示鉛筆 int isDrag; /鼠標(biāo)是否是拖動,1表示拖動,0表示移動 CPoint p0; /鉛筆的起點(2)初始化變量:CMy11View:CMy11View()/ TODO: add construction code here drawMode=0; isDrag=0;(3)在

9、消息響應(yīng)函數(shù)中添加代碼void CMy11View:OnPen()/“鉛筆”菜單響應(yīng)函數(shù)/ TODO: Add your command handler code here drawMode=1; /設(shè)置為鉛筆模式void CMy11View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default isDrag=1; /設(shè)置為拖動 p0=point; /記下起點CView:OnLButtonDown(nFlags, point);void CM

10、y11View:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default isDrag=0; /設(shè)置為移動CView:OnLButtonUp(nFlags, point);void CMy11View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(isDrag & drawMode=1)

11、/如果是鼠標(biāo)拖動,且是鉛筆模式 CDC* pdc=GetDC(); pdc-MoveTo(p0); pdc-LineTo(point); p0=point; ReleaseDC(pdc); CView:OnMouseMove(nFlags, point);(4)編譯運行程序,驗證運行結(jié)果。(二)橡皮筋畫直線的實現(xiàn)(1)并在“繪圖”菜單下再添加子菜單“直線”,添加“直線”菜單響應(yīng)函數(shù),并編寫代碼void CMy11View:OnLine() /“直線”菜單響應(yīng)函數(shù)/ TODO: Add your command handler code heredrawMode=2; /設(shè)置為繪制直線模式(2)

12、新增成員變量CPoint p1;(3)修改OnLButtonDown以及OnMouseMove函數(shù)的代碼:void CMy11View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultisDrag=1;p0=point;p1=point;CView:OnLButtonDown(nFlags, point);void CMy11View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add y

13、our message handler code here and/or call defaultif(isDrag) /鼠標(biāo)拖動CDC* pdc=GetDC();switch (drawMode)case 1:pdc-MoveTo(p0); pdc-LineTo(point);p0=point;break; /鉛筆繪圖case 2: pdc-SetROP2(R2_NOTXORPEN); /采用異或模式繪圖 pdc-MoveTo(p0); pdc-LineTo(p1); /擦除原直線 pdc-MoveTo(p0); pdc-LineTo(point);p1=point;break; /橡皮筋畫

14、直線ReleaseDC(pdc);CView:OnMouseMove(nFlags, point);(4)編譯運行程序,驗證運行結(jié)果。(三)OpenGL中橡皮筋技術(shù)與拾取操作的實現(xiàn),見教材62-70頁。四、實驗結(jié)果、分析和總結(jié)1對程序進行分析和比較,你還能提出哪些改進和擴充?例如:其他交互式繪圖技術(shù)的實現(xiàn)。2總結(jié)從本次實驗中學(xué)到了那些知識點或者有哪些感受?實驗二 直線、圓弧及橢圓弧的生成算法一、實驗?zāi)康?、幾種直線生成算法的比較,特別掌握用Bresenham直線生成算法。2、幾種圓弧生成算法的比較,掌握Bresenham圓弧生成算法。3、幾種橢圓弧生成算法的比較,掌握Bresenham橢圓弧生

15、成算法。4、掌握線型與線寬處理技術(shù)。二、實驗要求1、用不同的生成算法在屏幕上繪制出直線的圖形,對不同的算法可設(shè)置不同的線形或顏色表示區(qū)別。2、用Bresenham生成算法在屏幕上繪制出圓弧的圖形。3、用Bresenham生成算法在屏幕上繪制出橢圓弧的圖形。4、用動畫的方式表演圖形的生成。三、算法提示1、有關(guān)直線生成算法有:DDA(數(shù)值微分)直線算法、逐點比較法、直線Bresenham生成算法。直線Bresenham生成算法思想如下(第一象限,且斜率k0,則yi+1=yi+1,否則 yi+1=yi;3) 畫點(xi+1,yi+1);4) 求下一個誤差Pi+1點,如果Pi0,則Pi+1=Pi+2d

16、y-2dx,否則 Pi+1=Pi+2dy;5) i=i+1,如果i1的情況,可交換變量x和y,y每次長1個單位。對Pi進行判斷,xi+1=xi或xi+1=xi+1。2、有關(guān)圓弧生成算法有:逐點比較法、DDA(數(shù)值微分)直線算法、圓的Bresenham生成算法。圓的生成算法一般將圓劃分為8等份,只需計算(900,450)的八分之一圓弧,其它用對稱法求得(參見圖2-1 b)。Bresenham生成算法思想如下(第一象限,且斜率k1的情況):1) 計算誤差初值P1=3-2r,i=1,畫點(0,r);2) 求下一個光柵點位置 xi+1=xi+1 如果Pi0,則yi+1=yi,否則 yi+1=yi-1;

17、3) 畫點(xi+1,yi+1);4) 求下一個誤差Pi+1點,如果Pi0,則Pi+1=Pi+2xi+6,否則 Pi+1=Pi+4(xi-yi)+10;5) i=i+1,如果x=y則結(jié)束操作,否則轉(zhuǎn)步驟2。圓Bresenham算法的算式簡單,只需做加減法和乘4運算3對屏幕布局的考慮適當(dāng)選取坐標(biāo),將屏幕分成幾個區(qū)域性,在每個區(qū)域內(nèi)實現(xiàn)一種算法,生成一個圖形。也可用delay實現(xiàn)延時實現(xiàn)動畫。四、實驗結(jié)果、分析和總結(jié)1查看實驗結(jié)果,驗證算法的正確性;2對程序進行分析和比較,你還能提出哪些改進和擴充?例如:(1)線刷子繪制直線和圓;(2)方形刷子繪制直線和圓;(3)虛線和點劃線的繪制;3總結(jié)從本次實

18、驗中學(xué)到了那些知識點或者有哪些感受?實驗三 多邊形的區(qū)域填充一、實驗?zāi)康?通過實驗,進一步理解和掌握幾種常用多邊形填充算法的基本原理;2掌握多邊形區(qū)域填充算法的基本過程;3掌握在Visual C+環(huán)境下用多邊形填充算法編程實現(xiàn)指定多邊形的填充。二、實驗要求1用種子填充算法實現(xiàn)區(qū)域填充。2掃描線填充算法實現(xiàn)區(qū)域填充。3用x-掃描線算法實現(xiàn)多邊形的填充(可選);4實現(xiàn)邊緣填充算法和邊標(biāo)志填充算法(可選);三、算法提示(一)多邊形的掃描轉(zhuǎn)換多邊形的掃描轉(zhuǎn)換:從多邊形的頂點信息出發(fā),求出位于其內(nèi)部的各個象素,并將其顏色值寫入幀緩存中相應(yīng)單元的過程。多邊形的掃描轉(zhuǎn)換算法有:X掃描線算法、邊緣填充算法等。

19、1、X掃描線算法(1)基本思想:按掃描線順序,計算掃描線與多邊形的相交區(qū)間,再用要求的顏色顯示這些區(qū)間的所有象素。l (2)算法步驟:u 確定多邊形所占有的最大掃描線數(shù),得到多邊形頂點的最小和最大y值(ymin和ymax)。u 從y=ymin到y(tǒng)=ymax,每次用一條掃描線進行填充。u 對一條掃描線填充的過程可分為四個步驟:求交;排序;交點配對;區(qū)間填色。 2、邊緣填充算法基本思想:按任意順序處理多邊形的每條邊。處理時,先求出該邊與掃描線的交點,再對掃描線上交點右方的所有象素取反。(二)區(qū)域填充區(qū)域填充是指從區(qū)域內(nèi)的某一個象素點(種子點)開始,由內(nèi)向外將填充色擴展到整個區(qū)域內(nèi)的過程。區(qū)域是指已

20、經(jīng)表示成點陣形式的填充圖形,它是相互連通的一組像素的集合。1、棧結(jié)構(gòu)實現(xiàn)4-連通邊界填充算法的算法步驟為: 種子象素入棧;當(dāng)棧非空時重復(fù)執(zhí)行如下三步操作: (a)棧頂象素出棧; (b)將出棧象素置成填充色; (c)檢查出棧象素的4-鄰接點,若其中某個象素點不是邊界色且未置成多邊形色,則把該象素入棧。 2、棧結(jié)構(gòu)實現(xiàn)8-連通邊界填充算法的算法步驟為:種子象素入棧;當(dāng)棧非空時重復(fù)執(zhí)行如下三步操作:(a) 棧頂象素出棧;(b) 將出棧象素置成填充色;(c) 檢查出棧象素的8-鄰接點,若其中某個像素點不是邊界色且未置成多邊形色,則把該像素入棧。四、實驗結(jié)果、分析和總結(jié)1查看實驗結(jié)果,驗證算法的正確性;

21、2對程序進行分析和比較,編寫種子填充算法、多邊形填充算法和圖案填充算法? 3總結(jié)從本次實驗中學(xué)到了那些知識點或者有哪些感受?實驗四 二維幾何變換一、實驗?zāi)康倪M一步加深對常用的二維幾何變換的理解,如平移、旋轉(zhuǎn)、放大縮小等。掌握變換順序和變換矩陣。二、實驗要求1 通過二維幾何變換的數(shù)學(xué)模型,編寫平移、旋轉(zhuǎn)、放縮、對稱變換;2 繪制一個北極星圖案或字母圖案,如下圖所示,實現(xiàn)該圖形的平移、旋轉(zhuǎn)、放縮、對稱等幾何變換; 3 加入鼠標(biāo)功能,實現(xiàn)圖形的拾取及交互式移動等功能。三、算法提示二維幾何圖形的步驟: 1、選取二維空間坐標(biāo)系。2、在選定的坐標(biāo)系中,確定圖形走筆順序或連點順序(拓?fù)浣Y(jié)構(gòu)) ,寫出圖形中上

22、各頂點位置坐標(biāo),同時引入齊次坐標(biāo)表示成n(點數(shù))*3階矩陣。3、根據(jù)圖形的拓?fù)浣Y(jié)構(gòu)及頂點坐標(biāo),繪制圖形。4、將圖形的頂點坐標(biāo)矩陣乘以變換矩陣(不同的變換乘以不同的變換矩陣),得到變換后的頂點坐標(biāo),再根據(jù)圖形的拓?fù)浣Y(jié)構(gòu)及頂點坐標(biāo),繪制變換之后的圖形。四、實驗分析和總結(jié)1 分析程序運行結(jié)果,進一步完善程序;2 參照Autocad的交互式方式,實現(xiàn)交互式放縮、旋轉(zhuǎn)和對稱變換。3 寫出實驗體會和小結(jié),總結(jié)通過本次實驗,學(xué)習(xí)和掌握了哪些知識點?實驗五 裁剪算法一、實驗?zāi)康?、熟悉各種直線裁剪算法,包括CohenSutherland線段裁剪算法,中點分割線段裁剪算法,Liang-Barsky裁剪算法等,掌

23、握編碼裁剪法的編程方法和步驟。2、掌握多邊形逐邊裁剪(Sutherland-Hodgman)法的編程方法和步驟。3、了解字符裁剪算法的原理與編程方法。二、實驗要求1、 實現(xiàn)直線的裁剪。在屏幕上繪制出一個矩形作為裁剪邊界,再用不同的顏色繪出幾個由線段組成的簡單幾何圖形,它們和裁剪邊界可相交或不相交。按一個鍵,實現(xiàn)一條線段的裁剪,裁剪后的線段可用另一種顏色繪制,繼續(xù)按鍵,直至全部線段裁剪完。2、實現(xiàn)多邊形逐邊裁剪算法。三、算法提示1、Sutherland-Cohen(編碼) 裁剪算法用數(shù)組保存裁剪邊界的坐標(biāo)值和被裁剪邊界的坐標(biāo)值;根據(jù)逐邊裁剪方法對被裁剪邊界進裁剪,計算出裁剪后的坐標(biāo);再將裁剪后的

24、直線用不同顏色繪制到屏幕上。Sutherland-Cohen(編碼)算法的思想是:對于每條線段P1P2分為三種情況處理。(1)若P1P2完全在窗口內(nèi),則顯示該線段P1P2簡稱“取”之。(2)若P1P2明顯在窗口外,則丟棄該線段,簡稱“棄”之。(3)若線段既不滿足“取”的條件,也不滿足“棄”的條件,則在交點處把線段分為兩段。其中一段完全在窗口外,可棄之。然后對另一段重復(fù)上述處理。2、Sutherland-Hodgman 多邊形裁剪算法多邊形裁剪算法的關(guān)鍵在于,通過裁剪,不僅要保留窗口內(nèi)多邊形的邊界部分,而且要將窗框有關(guān)部分按一定的次序插入多邊形保留邊界之間,從而使多邊形的邊仍然保持封閉狀態(tài)。Su

25、therland-Hodgman 多邊形裁剪算法:令多邊形的頂點按邊線逆時針走向排序P1、P2、Pn,多邊形各邊先與上窗框求交。求交后刪去多邊形一窗框之上的部分,并插入窗邊及延長線與多邊形的交點之間的部分,從而形成一個新多邊形。然后,新的多邊形按相同的方法與右窗框相剪裁。如此重重,直至多邊形與各窗框都裁剪完畢。四、實驗分析和總結(jié)1、分析程序運行結(jié)果,進一步完善程序;2、對程序進行分析和比較,你還能提出哪些改進和擴充?例如:字符、圓等其他圖元的裁剪。3、寫出實驗體會和小結(jié),總結(jié)通過本次實驗,學(xué)習(xí)和掌握了哪些知識點?實驗六 三維圖形變換一、實驗?zāi)康?、復(fù)習(xí)用二維平面來表示三維立體圖形的正等測投影或

26、斜二側(cè)投影圖形。2、編程實現(xiàn)三維簡單立體的平移變換、旋轉(zhuǎn)變換、對稱變換、變比變換、錯切變換。3、對變換后的簡單三維幾何體用正等測投影或斜二側(cè)投影圖形來表示。4、用編寫的繪制三維幾何圖形的函數(shù)。二、基本要求1、在屏幕上繪制出如下圖所示或其他簡單幾何體的正等測投影的幾何圖形。 2、對上述簡單三維幾何體進行三維平移變換、旋轉(zhuǎn)、縮放、對稱等幾何變換,用不同的顏色在屏幕上繪制出變換后的三維圖形正等測投影圖。三、算法提示1、三維圖形的變換實際上是一個變換矩陣,平面圖形是由若干個三維點P(xi,yi,zi)組成,經(jīng)過變換后的三維點P(xi,yi ,zi),其變換公式為: x y z 1 =x y z 1T對

27、于不同的變換,都是用矩陣乘法來計算坐標(biāo),只需改變變換矩陣即可。因此對每一種坐標(biāo)變換可編成一個子程序。2、 變換后的三維點并不能直接在二維屏幕上繪制出來,必須用到前一個實驗的內(nèi)容,選用一個軸測投影,將三維點經(jīng)過軸測投影變換后,得出P*(x*i,y*i ,z*i)x* y* z* 1 =x y z 1T正等測3、編程時的技巧用數(shù)組將三維圖形的特征坐標(biāo)點(頂點)保存,由特征坐標(biāo)點(頂點)繪制出三維圖形的命令(一般由直線命令組成)編寫一個繪圖子程序,調(diào)用繪圖子程序繪制出變換以前的圖形(必須經(jīng)過軸測投影變換),根據(jù)不同的三維幾何變換,選用相應(yīng)三維坐標(biāo)變換公式(調(diào)用相應(yīng)的子程序)得出變換后的坐標(biāo);再經(jīng)軸測

28、投影變換后,得出P*(x*i,y*i ,z*i),調(diào)用繪圖子程序繪制出變換后的圖形。四、實驗分析和總結(jié)1、分析程序運行結(jié)果,進一步完善程序。2、對程序進行分析和比較,你還能提出哪些改進和擴充?例如:繪制三維立體圖形的斜二側(cè)投影圖形、透視投影等。3、寫出實驗體會和小結(jié),總結(jié)通過本次實驗,學(xué)習(xí)和掌握了哪些知識點?實驗七 曲線與曲面一、實驗?zāi)康母鶕?jù)曲線和曲面的基礎(chǔ)知識和常用曲線的數(shù)學(xué)基礎(chǔ),對其算法進行程序設(shè)計,驗證算法的正確性,并通過程序結(jié)果加深對常用曲線數(shù)學(xué)模型的理解。二、實驗要求 1、三次Bezier曲線與三次B樣條曲線的編程實現(xiàn)。在主窗口中添加Bezier曲線和B樣條曲線的菜單,當(dāng)運行系統(tǒng),點

29、擊相應(yīng)菜單時,根據(jù)系統(tǒng)給定的四個點,在屏幕上繪制三次Bezier曲線或三次B樣條曲線。2、交互式繪制三次Bezier曲線或三次B樣條曲線的編程實現(xiàn)。添加鼠標(biāo)功能,進行交互式繪制三次Bezier曲線或三次B樣條曲線。當(dāng)用鼠標(biāo)選擇四個點時,繪出第一條Bezier曲線或B樣條曲線,以后每增加一個點,就會增加一段曲線。Esc鍵表示鼠標(biāo)選擇點結(jié)束。 3、Bezier曲面與B樣條曲面的編程實現(xiàn)。在屏幕上繪制出一個Bezier曲面或B樣條曲面,并用不同的顏色標(biāo)出邊界網(wǎng)格。三、算法提示(一)Bezier曲線給定空間n+1個點的位置矢量Pi(i=0,1,2,n),則Bezier參數(shù)曲線上各點坐標(biāo)的插值公式是:

30、其中,Pi構(gòu)成該Bezier曲線的特征多邊形,Bi,n(t)是n次Bernstein基函數(shù):(二)B樣條曲線 以Bernstein基函數(shù)構(gòu)造的Bezier曲線或曲面有許多優(yōu)越性,但有兩點不足:其一是Bezier曲線或曲面不能作局部修改;其二是Bezier曲線或曲面的拼接比較復(fù)雜。1972年,Gordon、Riesenfeld等人提出了B樣條方法,在保留Bezier方法全部優(yōu)點的同時,克服了Bezier方法的弱點。B樣條曲線的方程定義為:是B樣條基函數(shù),其定義如下:(三)Bezier曲面1、設(shè)Pi j(i=0,1,2,n,j=0,1,m)為(n+1)(m+1)個空間點列,則mn次Bezier曲面

31、的方程為:其中,Bim(u)=Cmiui(1-u)m-i,Bjn(u)=Cnjvj(1-v)n-j,是Bernstern基函數(shù)。依次用線段連接Pi j(i=0,1,2,n,j=0,1,m)中相鄰兩點所形成的的空間網(wǎng)格,稱為特征網(wǎng)格。當(dāng)n=m=3時為雙三次Bezier曲面,其方程為: 用矩陣表示為:S(u,v)=UMPMTVT其中 U=u3,u2,u1,u,V= v3,v2,v1,v 2、程序設(shè)計根據(jù)用Bezier曲面的定義,輸入Bezier曲面的特征多邊形(例如雙三次Bezier曲面輸入16個型值點),用數(shù)組將坐標(biāo)點保存;然后把u從現(xiàn)01分成m等分,把v從現(xiàn)01分成n等分,按上述公式算出Bez

32、ier曲面上的點,在u方向畫出m+1條曲線,在v方向畫出n+1條曲線,就得到Bezier曲面。四、實驗分析和總結(jié)1、分析程序運行結(jié)果,進一步完善程序; 2、對程序進行分析和比較,你還能提出哪些改進和擴充?3、寫出實驗體會和小結(jié),總結(jié)通過本次實驗,學(xué)習(xí)和掌握了哪些知識點?實驗八 真實感圖形繪制一、實驗?zāi)康?、了解各種消隱算法的思想及實現(xiàn)方法,理解OpenGL中消隱處理的原理,掌握OpenGL中消隱處理技術(shù);2、了解計算機完成三維場景的真實感圖形繪制的原理及步驟,理解Phong光照明模型, 增量式光照明模型,透明算法,紋理算法,光線跟蹤算法。掌握OpenGL中光照與表面繪制函數(shù)及其操作。二、實驗要

33、求 1、利用OpenGL函數(shù)實現(xiàn)三維物體的消隱處理; 2、利用OpenGL中提供的光照、表面材質(zhì)處理、透明處理、表面繪制等函數(shù),實現(xiàn)真實感圖形的繪制。三、算法提示OpenGL的工作順序就是一個從定義幾何要素到把象素段寫入幀緩沖區(qū)的過程。在屏幕上顯示圖象的主要步驟是以下3步:(1)構(gòu)造幾何要素(點,線,多邊形,圖象,位圖),創(chuàng)建對象的數(shù)學(xué)描述。在三維空間上放置對象,選擇有利的場景觀察點。(2)計算對象的顏色,這些顏色可能直接定義,或由光照條件及紋理間接給出。(3)光柵化,把對象的數(shù)學(xué)描述和顏色信息轉(zhuǎn)換到屏幕的象素。實現(xiàn)實例可以參照教材中的案例。四、實驗分析和總結(jié)1、分析程序運行結(jié)果,進一步完善程

34、序; 2、對程序進行分析和比較,你還能提出哪些改進和擴充?3、寫出實驗體會和小結(jié),總結(jié)通過本次實驗,學(xué)習(xí)和掌握了哪些知識點? 參考文獻1、陸楓、何云峰, 計算機圖形學(xué)基礎(chǔ)(第二版), 電子工業(yè)出版社 2011-11 2、Edward Angel、Dave Shreiner,交互式計算機圖形學(xué):基于OpenGL著色器的自頂向下方法(第六版),電子工業(yè)出版社, 2012-053、孫家廣、胡事民,計算機圖形學(xué)基礎(chǔ), 清華大學(xué)出版社,2011-07 4、潘云鶴等, 計算機圖形學(xué)原理、方法及應(yīng)用(第3版) , 高等教育出版社,2011-65、孫家廣,計算機圖形學(xué)(第三版),清華大學(xué)出版社,1999。6、

35、Donald Hearn,M.Pauline Baker著, 蔡士杰等譯,計算機圖形學(xué)(第三版),電子工業(yè)出版社,2005。7、Dave Shreiner等著,鄧鄭祥譯,OpenGL編程指南(第四版),人民郵電出版社,2005。附錄A C程序繪圖基礎(chǔ)一、實驗?zāi)康?、 掌握用Turbo C繪圖時的步驟。2、 掌握C語言中的基本繪圖函數(shù)及其用法。3、 掌握簡單動畫的實現(xiàn)方法。二、用C語言繪制圖形的步驟1、為了調(diào)用C語言提供的圖形庫函數(shù),在程序的開頭寫上文件的包含命令;# include 2、圖形系統(tǒng)初始化及關(guān)閉圖形方式初始化是通過調(diào)用 initgraph( )函數(shù)來完成 ,它的調(diào)用格式為:init

36、graph (* gdriver,* gmode,* path);該函數(shù)的功能是通過從磁盤上裝入一個圖形驅(qū)動程序來初始化圖形系統(tǒng),并將顯示器設(shè)置到指定圖形方式下。參數(shù)gdriver, gmode, path的含義參見教材的有關(guān)章節(jié)。在運行圖形程序結(jié)束后,又要回到文本方式,以進行其它工作,這時應(yīng)關(guān)閉圖形方式。其格式為:closegraph()。3、圖形顯示器的工作方式1) 文本模式與字符坐標(biāo)系在未通過圖形初始化之前的屏幕上,只能顯示字符的方式稱為文本模式。C語言能在指定位置顯示字符,該坐標(biāo)系以屏幕的左上角為坐標(biāo)原點,水平向為x軸,自左向右;垂直方向為y軸,自上向下,坐標(biāo)原點為(1,1)。能顯示的

37、行數(shù)、列數(shù)及顏色與顯示方式有關(guān)。Turbo C支持6種不同的文本顯示方式。2) 圖形模式與點坐標(biāo)系在屏幕上能顯示圖形的方式稱為圖形方式。屏幕是由像素點組成的,通過initgraph函數(shù)的gmode參數(shù)來指定屏幕的分辨率,分辨率決定了像素點的多少。在圖形方式下,屏幕上每個像素的顯示位置用點坐標(biāo)系來描述。在該坐標(biāo)系中,屏幕的左上角為坐標(biāo)原點O(0,0),水平向為x軸,自左向右;垂直方向為y軸,自上向下。如圖A-1所示。O(0,0)maxxmaxy圖A-1 屏幕坐標(biāo)系分辨率不同,水平方向和垂直方向上的點數(shù)也不一樣,即其maxx、maxy的數(shù)值不同。在Turbo C中,坐標(biāo)數(shù)據(jù)有兩種形式給出:一種是絕

38、對坐標(biāo);另一種是相對坐標(biāo)。絕對坐標(biāo)的參考點是坐標(biāo)的原點O(0,0),x 和y的值只能取規(guī)定范圍內(nèi)的正整數(shù),其坐標(biāo)值在整個屏幕范圍內(nèi)確定。相對坐標(biāo)是相對于“當(dāng)前點”的坐標(biāo),所以其參考點不是坐標(biāo)系的原點,而是當(dāng)前點。要相對坐標(biāo)中,x和y的取值是相對于當(dāng)前點在X方向和Y方向上的增量,這個增量可以是正的,也可以是負(fù)的,所以x和y的值可以是正整數(shù),也可以是負(fù)整數(shù)。此外,把在一個窗口范圍內(nèi)確定的坐標(biāo)也稱為相對坐標(biāo)。三、C語言中的基本繪圖函數(shù)及其用法1、繪圖函數(shù)在用繪圖函數(shù)作圖時,有的繪圖函數(shù)坐標(biāo)是相對于坐標(biāo)原點,用絕對坐標(biāo)。有的繪圖函數(shù)用相對坐標(biāo),這時要隨時注意圖形的“當(dāng)前點位置”,它是繪圖的起始位置。也

39、就是說,圖形總是從當(dāng)前點開始畫圖。畫完一個圖形后,有的當(dāng)前點不變,仍在原來的位置;而有時會移到新的位置。1) 直線類繪圖函數(shù)用直線類函數(shù)繪制直線圖形,可以用兩種坐標(biāo):一種是絕對坐標(biāo);另一種是相對坐標(biāo)。幾個常用的函數(shù): 點的絕對定位函數(shù) moveto(x,y) 點的相對定位函數(shù) moverel(deltayx,deltay)它們不繪制圖形,只改變當(dāng)前點的位置,接著用繪圖函數(shù)繪圖。 指定兩個絕對點繪直線函數(shù): line(x1,y1,x2,y2) 該函數(shù)不改變當(dāng)前點的位置。 從當(dāng)前點到指定的絕對點繪直線函數(shù): lineto(x,y) 該函數(shù)畫線的同時,將當(dāng)前點的位置移到(x,y)。 從當(dāng)前點到指定的

40、相對點繪直線函數(shù): linerel(dx,dy) 該函數(shù)畫線的同時,將當(dāng)前點的位置移到(x+dx,y+dy)。設(shè)當(dāng)前坐標(biāo)為(x,y)則linerel(dx,dy)與lineto(x+dx,y+dy)等價。 讀取當(dāng)前點的位置x,y函數(shù)分別為: getx(void),gety(void) 讀取x,y軸的最大值函數(shù)分別為:getmaxx(void),getmaxy(void)2) 多邊形類繪圖函數(shù) 畫矩形函數(shù) rectangle(x1,y1,x2,y2); 畫多邊形函數(shù):drawpoly(n ,* polypoints)其中參數(shù),n為多邊形數(shù);* polypoints 指向一個整形數(shù)組,共有2n 個

41、整數(shù)組成,每對整數(shù)給出了一個多邊形頂點(x,y)坐標(biāo)。 2、圖形屬性的設(shè)置圖形屬性的設(shè)置包括繪制該圖形所用的顏色和線型。顏色又分為背景色和前景色:背景色指的是屏幕的顏色,即繪圖時的底色;前景是指繪圖時圖形線條所用的顏色。背景色和前景色的設(shè)置,只對設(shè)置后所繪制的顏色和線型有作用,對已經(jīng)繪制的圖形無作用。1) 設(shè)置前景色設(shè)置前景顏色所用的函數(shù) setcolor。其調(diào)用格式為:setcolor(color);其中color為一個整型數(shù)值,代表所取的顏色。2) 設(shè)置背景色設(shè)置背景顏色所用的函數(shù) sebktcolor。其調(diào)用格式為:setbkcolor(color);其中color為一個整型數(shù)值,代表所

42、取的顏色。3)設(shè)置線型設(shè)置當(dāng)前繪圖所用的線型和線寬,用函數(shù) setlinestyle。線型和線寬的設(shè)置僅限于對直線類圖形有效。其調(diào)用格式為:setlinestyle(sty,pat,b);sty:整型值,用來定義所畫直線的類型;pat用戶定義線型使用; b整型值,用來定義定義所畫直線的線寬。在屏幕上繪制出各種簡單的幾何圖形,要求設(shè)置不同的線形和顏色。3、 填充填空是指用指定的模式和顏色來填空一個指定的封閉區(qū)域。1) 設(shè)置當(dāng)前的填充模式和顏色設(shè)置填充模式和顏色,用函數(shù)setfillstyle,其調(diào)用格式為:setfillstyle(pattern,color);2) 實施填充對于指定的一塊有界的

43、封閉區(qū)域進行填充操作,用函數(shù)floodfill,其調(diào)用格式為:floodfill(x,y,bcolor);參數(shù)(x,y)指位于填充區(qū)域內(nèi)任意一點的坐標(biāo),該點作為填充的起始點,參數(shù)bcolor作為填充區(qū)域的邊界顏色。如果起始點在封閉區(qū)域內(nèi),則區(qū)域內(nèi)部被填充;如果起始點在封閉區(qū)域外,則區(qū)域外部被填充。同學(xué)們可以自行驗證。3) 其它填充函數(shù)以下幾個填充函數(shù),均須事先由setfillstyle 函數(shù)指定當(dāng)前的填充模式和顏色。 繪制并填充實橢圓函數(shù): fillellipse(x,y,rx,ry); 繪制并填充實橢圓扇區(qū)函數(shù): sector(x,y,angs,ange,rx,ry) 繪制并填充多邊形函數(shù):

44、fillpoly(nps ,*pxy)4、 屏幕管理Turbo C2.0 提供了11個函數(shù),用于對屏幕和視區(qū)進行管理。1)設(shè)置視圖區(qū)在圖形方式下,可用函數(shù)setviewport在屏幕上定義一個視圖區(qū)。視圖區(qū)相當(dāng)于一個用于繪圖的窗口。視圖區(qū)的位置和大小用屏幕的絕對坐標(biāo)定義,并且可把視圖區(qū)設(shè)置為裁剪和不裁剪兩種狀態(tài)。函數(shù)setviewport的調(diào)用格式為:setviewport(x1,y1,x2,y2,c);參數(shù)x1,y1:為視圖區(qū)矩形的左上角頂點坐標(biāo);x2,y2:為視圖區(qū)矩形的右下角頂點坐標(biāo)。c為裁剪狀態(tài)參數(shù)。c=1,超出視圖區(qū)的圖形部分被自動裁剪掉;c=0時,對超出部分不作裁剪處理。應(yīng)注意:視

45、圖區(qū)建立以后,所有的圖形輸出坐標(biāo)都是相對于當(dāng)前視圖區(qū)的,即視圖區(qū)左上角點為坐標(biāo)(0,0)點,而與視圖區(qū)和圖形在屏幕上的位置無關(guān)。在默認(rèn)情況下,整個屏幕為一個視圖區(qū)。2)清除視圖區(qū)清除視圖區(qū)用函數(shù) clearviewport。它的作用是清除掉當(dāng)前視圖區(qū),將當(dāng)前點的位置設(shè)置于屏幕左上角(0,0)點。調(diào)用格式為:clearviewport();3)清屏清屏的函數(shù)為 cleardevice ();四、簡單動畫制作1、最簡單的動畫的制作最簡單的動畫實現(xiàn)方法:先在屏幕上繪制一組圖形,用delay() 函數(shù)進行一定延時,再繪制另一組圖形。本方法實現(xiàn)的動畫有閃耀感,不連續(xù)。五、上機作業(yè)題1、編寫一個正方珙程序

46、(每一個比前一個稍小),并在其中用不同顏色畫15個正方形。2、編寫一輛自行車一公路上由右至左快速行駛的程序。自行圖案可自行設(shè)計。六、實例程序:以下實例程序在Turbo C下調(diào)試通過1、演示各種顏色的填充情況的參考源程序# include graphics.hvoid main(void) int gdriver=DETECT,gmode,errorcode; int i,c,x=5,y=6; printf(input color number:n); scanf(%d,&c); initgraph(&gdriver,&gmode,E:TC ); cleardevice(); setbkcolo

47、r(14); setcolor(9); for(i=c;ic+8;i+) setcolor(i); rectangle(x,y,x+140,y+104); x=x+70;y=y+52; setfillstyle(1,i); floodfill(x,y,i); getch(); closegraph();2、飄帶圖案的參考源程序 水平直線的起點和終點坐標(biāo)均按余弦和正弦函數(shù)的規(guī)律變化,使形成具有不同長度和不同位置的線段組成的圖案,該圖案看起來好像是隨風(fēng)飄揚起來的一條飄帶。# include graphics.h# include math.h# define PI 3.1415926 void m

48、ain(void) int gdriver=DETECT,gmode,errorcode; int x1,y1,x2,px=320,py=240; double a; initgraph(&gdriver,&gmode,E:TC ); cleardevice(); setbkcolor(9); setcolor(4); for(a=0;a=PI;a+=PI/380) x1=280*cos(1.6*a)+px; y1=497-(90*sin(8*a)*cos(a/2.5)+py); x2=280*cos(1.8*a)+px; line(x1,y1,x2,y1); getch(); closegr

49、aph();3、正多邊形繪圖程序本程序用子程序的方法來繪制正多邊形#include graphics.h#include math.hvoid polygon(int x0,int y0,int a ,int n, float af) int x,y,i,x2,y2; float dtheta,theta; if(n3) return; dtheta=6.28318/n; theta=af*0.0174533; moveto(x0,y0); x=x0; y=y0; for(i=1;i=3;i-) polygon(x,y,a,i,0.0); getch(); closegraph();5、 簡單

50、動畫源程序,設(shè)計人在跑步/* cgwexam0329b.c */#include graphics.h#include conio.h#include stdio.h#include stdlib.h#include dos.hvoid t1(int x1,int x,int y) /*繪制第一幅圖形*/ line(0,y/2+72,x,y/2+72); circle(x1,y/2,10); line(x1,y/2+10,x1-5,y/2+38); line(x1-5,y/2+38,x1+5,y/2+52); line(x1+5,y/2+52,x1-12,y/2+65); line(x1-5,

51、y/2+38,x1,y/2+54); line(x1,y/2+54,x1-8,y/2+70); line(x1-8,y/2+10,x1-8,y/2+35); line(x1,y/2+10,x1+1,y/2+25); line(x1+1,y/2+25,x1+10,y/2+32); void t2(int x1,int x,int y) /*繪制第二幅圖形*/ line(0,y/2+72,x,y/2+72); circle(x1+40,y/2,10); line(x1+40,y/2+10,x1+28,y/2+50); line(x1+28,y/2+52,x1+11,y/2+47); line(x1+30,y/2+40,x1+52,y/2+50); line(x1+52,y/2+50,x1+42,y/2+70); line(x1+39,y/2+11,x1+24,y/2+22); line(x1+24,y/2+22,x1+34,y/2+32)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論