![計算機(jī)圖形學(xué)課程設(shè)計實驗報告_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/1/3a5006bc-5725-48ae-9830-337573c66577/3a5006bc-5725-48ae-9830-337573c665771.gif)
![計算機(jī)圖形學(xué)課程設(shè)計實驗報告_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/1/3a5006bc-5725-48ae-9830-337573c66577/3a5006bc-5725-48ae-9830-337573c665772.gif)
![計算機(jī)圖形學(xué)課程設(shè)計實驗報告_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/1/3a5006bc-5725-48ae-9830-337573c66577/3a5006bc-5725-48ae-9830-337573c665773.gif)
![計算機(jī)圖形學(xué)課程設(shè)計實驗報告_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/1/3a5006bc-5725-48ae-9830-337573c66577/3a5006bc-5725-48ae-9830-337573c665774.gif)
![計算機(jī)圖形學(xué)課程設(shè)計實驗報告_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/1/3a5006bc-5725-48ae-9830-337573c66577/3a5006bc-5725-48ae-9830-337573c665775.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、計算機(jī)圖形學(xué)實驗報告班級 計算機(jī)科學(xué)與技術(shù) 姓名 學(xué)號 2014 年 6 月 2 日實驗一 基本圖形生成算法一、實驗?zāi)康模?1、掌握中點bresenham繪制直線的原理; 2、設(shè)計中點bresenham算法; 3、掌握八分法中點bresenham算法繪制圓的原理; 4、設(shè)計八分法繪制圓的中點bresenham算法; 5、掌握繪制1/4橢圓弧的上半部分和下半部分的中點bresenham算法原理; 6、掌握下半部分橢圓偏差判別式的初始值計算方法; 7、設(shè)計順時針?biāo)姆址ɡL制橢圓的中點bresenham算法。二、實驗過程:1、 實驗描述 實驗1:使用中點bresenham算法繪制斜率為0<=k&
2、lt;=1的直線。 實驗2:使用中點bresenham算法繪制圓心位于屏幕客戶區(qū)中心的圓。 實驗3:使用中點bresenham算法繪制圓心位于屏幕客戶區(qū)中心的橢圓。2、實驗過程 1)用mfc(exe)建立一個單文檔工程; 2)編寫對話框,生成相應(yīng)對象,設(shè)置相應(yīng)變量; 3)在類clineview中聲明相應(yīng)函數(shù),并在相關(guān)的cpp文件中實現(xiàn); 4)在ondraw()函數(shù)里調(diào)用函數(shù)實現(xiàn)繪制直線、圓、橢圓; 5)運行程序,輸入相應(yīng)值,繪制出圖形。3、 源代碼實驗1:直線中點bresenham算法1./ cline.cpp : implementation file/ cline dialogcline:
3、cline(cwnd* pparent /*=null*/): cdialog(cline:idd, pparent)/afx_data_init(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;/afx_data_initvoid cline:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(cline)ddx_text(pdx, idc_x0, m_x0);ddx_text(pdx, idc_y0, m_y0);ddx_text(pdx, idc_x1,
4、 m_x1);ddx_text(pdx, idc_y1, m_y1);/afx_data_mapbegin_message_map(cline, cdialog)/afx_msg_map(cline)/afx_msg_mapend_message_map()2、 / lineview.hclass clineview : public cviewpublic:clinedoc* getdocument();.void mbline(double,double,double,double); /直線中點bresenham函數(shù).3、/ line.cpp /*直線中點bresenham函數(shù)*/voi
5、d clineview:mbline(double x0, double y0, double x1, double y1) cclientdc dc(this); colorref rgb=rgb(0,0,255); /定義直線顏色為藍(lán)色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x+)dc.setpixel(int)x,(int)y,rgb);if(d<0)y+;d+=1-k;elsed-=k;4、/lineview.cppvoid clineview:ondraw(cdc* pdc)
6、clinedoc* pdoc = getdocument();assert_valid(pdoc);/ todo: add draw code for native data herecline a;a.domodal();/初始化clineview:mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1);實驗2:圓中點bresenham算法 1、/cricle.cpp/ ccricle dialogccricle:ccricle(cwnd* pparent /*=null*/): cdialog(ccricle:idd, pparent)/afx_data_init(ccri
7、cle)m_r = 0;/afx_data_initvoid ccricle:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(ccricle)ddx_text(pdx, r_edit, m_r);/afx_data_map 2、/ccircleview.hclass cccircleview : public cview.public:cccircledoc* getdocument();void circlepoint(double,double); /八分法畫圓函數(shù)void mbcirc
8、le(double); /圓中點bresenham函數(shù). 3、/ccircleview.cppvoid cccircleview:ondraw(cdc* pdc)cccircledoc* pdoc = getdocument();assert_valid(pdoc);/ todo: add draw code for native data hereccricle r;r.domodal();cccircleview:mbcircle(r.m_r);/畫圓4、/ccircleview.cpp/*八分法畫圓*/void cccircleview:circlepoint(double x,doub
9、le y)cclientdc dc(this);colorref rgb=rgb(0,0,255);dc.setpixel(int)(300+x),(int)(300+y),rgb);dc.setpixel(int)(300-x),(int)(300+y),rgb);dc.setpixel(int)(300+x),(int)(300-y),rgb);dc.setpixel(int)(300-x),(int)(300-y),rgb);dc.setpixel(int)(300+y),(int)(300+x),rgb);dc.setpixel(int)(300-y),(int)(300+x),rgb
10、);dc.setpixel(int)(300+y),(int)(300-x),rgb);dc.setpixel(int)(300-y),(int)(300-x),rgb);/*圓中點bresenham函數(shù)*/void cccircleview:mbcircle(double r)double x,y,d;colorref rgb=rgb(0,0,255);d=1.25-r;x=0; y=r;for(x=0;x<y;x+)circlepoint(x,y); /調(diào)用八分法畫圓子函數(shù)if(d<0)d+=2*x+3;elsed+=2*(x-y)+5;y-;實驗3:橢圓中點bresenham
11、算法1、/ellipse1.cpp/ cellipse dialogcellipse:cellipse(cwnd* pparent /*=null*/): cdialog(cellipse:idd, pparent)/afx_data_init(cellipse)m_a = 0;m_b = 0;/afx_data_initvoid cellipse:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(cellipse)ddx_text(pdx, idc_edit1, m_a);ddx_text(
12、pdx, idc_edit2, m_b);/afx_data_map2、/ellipseview.hclass cellipseview : public cview.public:cellipsedoc* getdocument();void ellipsepoint(double,double); /四分法畫橢圓void mbellipse(double a, double b); /橢圓中點bresenham函數(shù).3、/ellipse.cpp/*四分法畫橢圓*/void cellipseview:ellipsepoint(double x,double y)cclientdc dc(th
13、is);colorref rgb=rgb(0,0,255); dc.setpixel(int)(300+x),(int)(300+y),rgb);dc.setpixel(int)(300-x),(int)(300+y),rgb);dc.setpixel(int)(300+x),(int)(300-y),rgb);dc.setpixel(int)(300-x),(int)(300-y),rgb);/*橢圓中點bresenham函數(shù)*/void cellipseview:mbellipse(double a, double b)double x,y,d1,d2;x=0;y=b;d1=b*b+a*a
14、*(-b+0.25);ellipsepoint(x,y);while(b*b*(x+1)<a*a*(y-0.5)/橢圓ac弧段if(d1<0)d1+=b*b*(2*x+3);elsed1+=b*b*(2*x+3)+a*a*(-2*y+2);y-;x+;ellipsepoint(x,y);d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;/橢圓cb弧段while(y>0)if(d2<0)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;elsed2+=a*a*(-2*y+3);y-;ellipsepoint(x,y
15、);4、/ellipseview.cppvoid cellipseview:ondraw(cdc* pdc)cellipsedoc* pdoc = getdocument();assert_valid(pdoc);/ todo: add draw code for native data herecellipse el;el.domodal();/初始化cellipseview:mbellipse(el.m_a, el.m_b);/畫橢圓4、 實結(jié)果驗實驗1:直線中點bresenham算法實驗2:圓中點bresenham算法實驗3:橢圓中點bresenham算法實驗二 有效邊表填充算法一、實驗
16、目的:1、設(shè)計有效邊表結(jié)點和邊表結(jié)點數(shù)據(jù)結(jié)構(gòu);2、設(shè)計有效邊表填充算法;3、編程實現(xiàn)有效邊表填充算法。2、 實驗過程:1、實驗描述 下圖1 所示多邊形覆蓋了 12 條掃描線,共有 7 個頂點和 7 條邊。7 個頂點分別為:p0(7,8) ,p1(3,12) ,p2(1,7) ,p3(3,1), p4(6,5), p5(8,1), p6(12,9)。在 1024×768 的顯示分辯率下,將多邊形頂點放大為 p0(500,400) ,p1(350,600) ,p2(250,350),p3(350,50), p4(500,250), p5(600,50), p6(800,450)。請使用有
17、效邊表算法填充該多邊形。2、 實驗過程 (1)建立aet類和bucket類; (2)初始化桶,并在建立桶結(jié)點時為其表示的掃描線初始化為帶頭結(jié)點的鏈表; (3)對每個桶結(jié)點進(jìn)行循環(huán),將桶內(nèi)每個結(jié)點的邊表合并為有效邊表,并進(jìn)行有效邊表循環(huán); (4)按照掃描線從小到大的移動順序,計算當(dāng)前掃描線與多邊形各邊的交點,然后把這些交點按x值遞增的順序進(jìn)行排序,配對,以確定填充區(qū)間; (5)用指定顏色點亮填充區(qū)間內(nèi)的所有像素,即完成填充工作。3、 源代碼1、/aet.hclass aet public:aet();virtual aet();double x;int ymax;double k;/代替1/ka
18、et *next;/aet.cppaet:aet()aet:aet()2、 /bucket.h#include "aet.h"class bucket public:bucket();virtual bucket();int scanline;aet *p;/桶上的邊表指針bucket *next;/ bucket.cppbucket:bucket()bucket:bucket()3、/test2.cppvoid ctest2view:et()/構(gòu)造邊表函數(shù)for(int i=0;i<number;i+)/訪問每個頂點currentb=headb;/從桶鏈表的頭節(jié)點開
19、始循環(huán)int j=i+1;/邊表第二個頂點,pointi和pointj構(gòu)成邊if(j=number)j=0;/保證多邊形的閉合if(pointj.y>pointi.y)/終點比起點高while(currentb->scanline!=pointi.y)/在桶內(nèi)尋找該邊的ymincurrentb=currentb->next;/移到下一個桶結(jié)點ei.x=pointi.x;/計算aet表的值ei.ymax=pointj.y;ei.k=double(pointj.x-pointi.x)/(pointj.y-pointi.y);/代表1/kei.next=null;currente=
20、currentb->p;/獲得桶上連接邊表的地址if(currentb->p=null)currente=&ei;/邊表的起始地址currentb->p=currente;/第一個邊表直接連接到對應(yīng)的桶中elsewhile(currente->next!=null)/如果當(dāng)前邊已連有邊結(jié)點currente=currente->next;/移動指針到當(dāng)前邊的最后一個結(jié)點currente->next=&ei;/把當(dāng)前邊接上去if(pointj.y<pointi.y)/終比起點低while(currentb->scanline!=poi
21、ntj.y)/在桶內(nèi)尋找該邊的ymincurrentb=currentb->next;/移到下一個桶結(jié)點ei.x=pointj.x;/計算aet表的值ei.ymax=pointi.y;ei.k=double(pointi.x-pointj.x)/(pointi.y-pointj.y);/代表1/kei.next=null;currente=currentb->p;/獲得桶上連接邊表的地址if(currente=null)currente=&ei;/邊表的起始地址currentb->p=currente;/第一個邊表直接連接到對應(yīng)的桶中elsewhile(current
22、e->next!=null)/如果當(dāng)前邊已連有邊結(jié)點currente=currente->next;/移動指針到當(dāng)前邊的最后一個結(jié)點currente->next=&ei;/把當(dāng)前邊接上去currentb=null;currente=null;void ctest2view:addedge(aet *newedge)/插入臨時邊表函數(shù)t1=heade;if(t1=null)/邊表為空,將邊表置為tempedget1=newedge;heade=t1;elsewhile(t1->next!=null)/邊表不為空,將tempedge連在該邊之后t1=t1->n
23、ext;t1->next=newedge;void ctest2view:edegeorder()/對邊表進(jìn)行排序函數(shù)t1=heade;if(t1=null)return;if(t1->next=null)/如果該邊表沒有再連邊表return;/桶結(jié)點只有一條邊,不需要排序elseif(t1->next->x<t1->x)/邊表按x值排序t2=t1->next;t1->next=t2->next;t2->next=t1;heade=t2; t2=heade; t1=heade->next; while(t1->next!=
24、null)/繼續(xù)兩兩比較相連的邊表的x值,進(jìn)行排序 if(t1->next->x<t1->x) t2->next=t1->next; t1->next=t1->next->next; t2->next->next=t1;t2=t2->next; else t2=t1; t1=t1->next; void ctest2view:polygonfill()/多邊形填充函數(shù)cclientdc dc(this);colorref rgb=rgb(0,0,255); heade=null;for(currentb=headb;
25、currentb!=null;currentb=currentb->next)/訪問所有桶結(jié)點for(currente=currentb->p;currente!=null;currente=currente->next)/桶中所有結(jié)點aet *tempedge= new aet;tempedge->x=currente->x;tempedge->ymax=currente->ymax; tempedge->k=currente->k; tempedge->next=null; addedge(tempedge);/將該邊插入臨時ae
26、t表edegeorder();/邊表按照x遞增的順序存放 t1=heade;/根據(jù)ymax拋棄掃描完的邊結(jié)點if(t1=null)return;while(currentb->scanline>=t1->ymax)/放棄該結(jié)點,aet表指針后移,下閉上開t1=t1->next;heade=t1;if(heade=null)return;if(t1->next!=null)t2=t1;t1=t2->next;while(t1!=null)if(currentb->scanline>=t1->ymax)/跳過一個結(jié)點 t2->next=t
27、1->next; t1->next=null; t1=t2->next;elset2=t1;t1=t2->next;bool in=false;/設(shè)置一個bool變量in,初始值為假double xb,xe;/掃描線的起點和終點for(t1=heade;t1!=null;t1=t1->next)/填充掃描線和多邊形相交的區(qū)間if(in=false)xb=t1->x;in=true;/,每訪問一個結(jié)點,把in值取反一次else/如果in值為真,則填充從當(dāng)前結(jié)點的x值開始到下一個結(jié)點的x值結(jié)束的區(qū)間xe=t1->x-1;/左閉右開cclientdc dc(
28、this);for(double x=xb;x<=xe;x+)dc.setpixel(int(x),currentb->scanline,rgb);/填充 sleep(1);/延時1ms,提高填充過程的可視性 in=false;for(t1=heade;t1!=null;t1=t1->next)/邊連貫性 t1->x=t1->x+t1->k;/x=x+1/kdelete headb;delete currentb;delete currente;delete heade;/*初始化桶*void ctest2view:creatbucket() int sca
29、nmax,scanmin;scanmax = scanmin = point0.y;for(int i=1;i<number;i+)if(pointi.y<scanmin)scanmin = pointi.y; /掃描線的最小值if(pointi.y>scanmax)scanmax = pointi.y; /掃描線的最大值for( i=scanmin;i<=scanmax;i+) /建立桶節(jié)點if(scanmin = i) /桶頭結(jié)點headb = new bucket; /建立桶的頭結(jié)點currentb = headb; /currentb為bucket當(dāng)前節(jié)點指針currentb->scanline = scanmin;currentb->p = null; /沒有連接邊鏈表currentb->next = null;else /建立桶的其他節(jié)點currentb->next =
溫馨提示
- 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è)內(nèi)部承包合同爭議解決機(jī)制
- 2025年度個人信用貸款合同模板匯編
- 2025年度建筑抗震加固安裝工程承包合同(安全耐久)
- 鹽城江蘇鹽城市大豐區(qū)住房和城鄉(xiāng)建設(shè)局招聘勞務(wù)派遣工作人員4人筆試歷年參考題庫附帶答案詳解
- 滁州2025年安徽滁州來安縣司法局招聘5名司法協(xié)理員筆試歷年參考題庫附帶答案詳解
- 湖北2025年湖北理工學(xué)院專項招聘97人筆試歷年參考題庫附帶答案詳解
- 浙江浙江省衛(wèi)生健康綜合保障中心招聘編外人員筆試歷年參考題庫附帶答案詳解
- 洛陽2024年河南洛陽市孟津區(qū)引進(jìn)研究生學(xué)歷人才50人筆試歷年參考題庫附帶答案詳解
- 承德2025年河北承德市中心醫(yī)院招聘筆試歷年參考題庫附帶答案詳解
- 2025年中國五礦機(jī)械市場調(diào)查研究報告
- 數(shù)學(xué)-河南省三門峽市2024-2025學(xué)年高二上學(xué)期1月期末調(diào)研考試試題和答案
- 2025年春新人教版數(shù)學(xué)七年級下冊教學(xué)課件
- 《心臟血管的解剖》課件
- 心肺復(fù)蘇課件2024
- 2024-2030年中國并購基金行業(yè)發(fā)展前景預(yù)測及投資策略研究報告
- 河道清淤安全培訓(xùn)課件
- 2024各科普通高中課程標(biāo)準(zhǔn)
- 7.3.1印度(第1課時)七年級地理下冊(人教版)
- 教師培訓(xùn)校園安全
- 北師大版語文四年級下冊全冊教案
- 《湖南師范大學(xué)》課件
評論
0/150
提交評論