版權(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)報(bào)告班級(jí) 計(jì)算機(jī)科學(xué)與技術(shù) 姓名 學(xué)號(hào) 2014 年 6 月 2 日實(shí)驗(yàn)一 基本圖形生成算法一、實(shí)驗(yàn)?zāi)康模?1、掌握中點(diǎn)bresenham繪制直線的原理; 2、設(shè)計(jì)中點(diǎn)bresenham算法; 3、掌握八分法中點(diǎn)bresenham算法繪制圓的原理; 4、設(shè)計(jì)八分法繪制圓的中點(diǎn)bresenham算法; 5、掌握繪制1/4橢圓弧的上半部分和下半部分的中點(diǎn)bresenham算法原理; 6、掌握下半部分橢圓偏差判別式的初始值計(jì)算方法; 7、設(shè)計(jì)順時(shí)針?biāo)姆址ɡL制橢圓的中點(diǎn)bresenham算法。二、實(shí)驗(yàn)過(guò)程:1、 實(shí)驗(yàn)描述 實(shí)驗(yàn)1:使用中點(diǎn)bresenham算法繪制斜率為0<=k&
2、lt;=1的直線。 實(shí)驗(yàn)2:使用中點(diǎn)bresenham算法繪制圓心位于屏幕客戶區(qū)中心的圓。 實(shí)驗(yàn)3:使用中點(diǎn)bresenham算法繪制圓心位于屏幕客戶區(qū)中心的橢圓。2、實(shí)驗(yàn)過(guò)程 1)用mfc(exe)建立一個(gè)單文檔工程; 2)編寫(xiě)對(duì)話框,生成相應(yīng)對(duì)象,設(shè)置相應(yīng)變量; 3)在類clineview中聲明相應(yīng)函數(shù),并在相關(guān)的cpp文件中實(shí)現(xiàn); 4)在ondraw()函數(shù)里調(diào)用函數(shù)實(shí)現(xiàn)繪制直線、圓、橢圓; 5)運(yùn)行程序,輸入相應(yīng)值,繪制出圖形。3、 源代碼實(shí)驗(yàn)1:直線中點(diǎn)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); /直線中點(diǎn)bresenham函數(shù).3、/ line.cpp /*直線中點(diǎn)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);實(shí)驗(yàn)2:圓中點(diǎn)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); /八分法畫(huà)圓函數(shù)void mbcirc
8、le(double); /圓中點(diǎn)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);/畫(huà)圓4、/ccircleview.cpp/*八分法畫(huà)圓*/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);/*圓中點(diǎn)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)用八分法畫(huà)圓子函數(shù)if(d<0)d+=2*x+3;elsed+=2*(x-y)+5;y-;實(shí)驗(yàn)3:橢圓中點(diǎn)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); /四分法畫(huà)橢圓void mbellipse(double a, double b); /橢圓中點(diǎn)bresenham函數(shù).3、/ellipse.cpp/*四分法畫(huà)橢圓*/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);/*橢圓中點(diǎn)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);/畫(huà)橢圓4、 實(shí)結(jié)果驗(yàn)實(shí)驗(yàn)1:直線中點(diǎn)bresenham算法實(shí)驗(yàn)2:圓中點(diǎn)bresenham算法實(shí)驗(yàn)3:橢圓中點(diǎn)bresenham算法實(shí)驗(yàn)二 有效邊表填充算法一、實(shí)驗(yàn)
16、目的:1、設(shè)計(jì)有效邊表結(jié)點(diǎn)和邊表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu);2、設(shè)計(jì)有效邊表填充算法;3、編程實(shí)現(xiàn)有效邊表填充算法。2、 實(shí)驗(yàn)過(guò)程:1、實(shí)驗(yàn)描述 下圖1 所示多邊形覆蓋了 12 條掃描線,共有 7 個(gè)頂點(diǎn)和 7 條邊。7 個(gè)頂點(diǎn)分別為:p0(7,8) ,p1(3,12) ,p2(1,7) ,p3(3,1), p4(6,5), p5(8,1), p6(12,9)。在 1024×768 的顯示分辯率下,將多邊形頂點(diǎn)放大為 p0(500,400) ,p1(350,600) ,p2(250,350),p3(350,50), p4(500,250), p5(600,50), p6(800,450)。請(qǐng)使用有
17、效邊表算法填充該多邊形。2、 實(shí)驗(yàn)過(guò)程 (1)建立aet類和bucket類; (2)初始化桶,并在建立桶結(jié)點(diǎn)時(shí)為其表示的掃描線初始化為帶頭結(jié)點(diǎn)的鏈表; (3)對(duì)每個(gè)桶結(jié)點(diǎn)進(jìn)行循環(huán),將桶內(nèi)每個(gè)結(jié)點(diǎn)的邊表合并為有效邊表,并進(jìn)行有效邊表循環(huán); (4)按照掃描線從小到大的移動(dòng)順序,計(jì)算當(dāng)前掃描線與多邊形各邊的交點(diǎn),然后把這些交點(diǎn)按x值遞增的順序進(jìn)行排序,配對(duì),以確定填充區(qū)間; (5)用指定顏色點(diǎn)亮填充區(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+)/訪問(wèn)每個(gè)頂點(diǎn)currentb=headb;/從桶鏈表的頭節(jié)點(diǎn)開(kāi)
19、始循環(huán)int j=i+1;/邊表第二個(gè)頂點(diǎn),pointi和pointj構(gòu)成邊if(j=number)j=0;/保證多邊形的閉合if(pointj.y>pointi.y)/終點(diǎn)比起點(diǎn)高while(currentb->scanline!=pointi.y)/在桶內(nèi)尋找該邊的ymincurrentb=currentb->next;/移到下一個(gè)桶結(jié)點(diǎn)ei.x=pointi.x;/計(jì)算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;/第一個(gè)邊表直接連接到對(duì)應(yīng)的桶中elsewhile(currente->next!=null)/如果當(dāng)前邊已連有邊結(jié)點(diǎn)currente=currente->next;/移動(dòng)指針到當(dāng)前邊的最后一個(gè)結(jié)點(diǎn)currente->next=&ei;/把當(dāng)前邊接上去if(pointj.y<pointi.y)/終比起點(diǎn)低while(currentb->scanline!=poi
21、ntj.y)/在桶內(nèi)尋找該邊的ymincurrentb=currentb->next;/移到下一個(gè)桶結(jié)點(diǎn)ei.x=pointj.x;/計(jì)算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;/第一個(gè)邊表直接連接到對(duì)應(yīng)的桶中elsewhile(current
22、e->next!=null)/如果當(dāng)前邊已連有邊結(jié)點(diǎn)currente=currente->next;/移動(dòng)指針到當(dāng)前邊的最后一個(gè)結(jié)點(diǎn)currente->next=&ei;/把當(dāng)前邊接上去currentb=null;currente=null;void ctest2view:addedge(aet *newedge)/插入臨時(shí)邊表函數(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()/對(duì)邊表進(jìn)行排序函數(shù)t1=heade;if(t1=null)return;if(t1->next=null)/如果該邊表沒(méi)有再連邊表return;/桶結(jié)點(diǎn)只有一條邊,不需要排序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)/訪問(wèn)所有桶結(jié)點(diǎn)for(currente=currentb->p;currente!=null;currente=currente->next)/桶中所有結(jié)點(diǎn)aet *tempedge= new aet;tempedge->x=currente->x;tempedge->ymax=currente->ymax; tempedge->k=currente->k; tempedge->next=null; addedge(tempedge);/將該邊插入臨時(shí)ae
26、t表edegeorder();/邊表按照x遞增的順序存放 t1=heade;/根據(jù)ymax拋棄掃描完的邊結(jié)點(diǎn)if(t1=null)return;while(currentb->scanline>=t1->ymax)/放棄該結(jié)點(diǎn),aet表指針后移,下閉上開(kāi)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)/跳過(guò)一個(gè)結(jié)點(diǎn) t2->next=t
27、1->next; t1->next=null; t1=t2->next;elset2=t1;t1=t2->next;bool in=false;/設(shè)置一個(gè)bool變量in,初始值為假double xb,xe;/掃描線的起點(diǎn)和終點(diǎn)for(t1=heade;t1!=null;t1=t1->next)/填充掃描線和多邊形相交的區(qū)間if(in=false)xb=t1->x;in=true;/,每訪問(wèn)一個(gè)結(jié)點(diǎn),把in值取反一次else/如果in值為真,則填充從當(dāng)前結(jié)點(diǎn)的x值開(kāi)始到下一個(gè)結(jié)點(diǎn)的x值結(jié)束的區(qū)間xe=t1->x-1;/左閉右開(kāi)cclientdc dc(
28、this);for(double x=xb;x<=xe;x+)dc.setpixel(int(x),currentb->scanline,rgb);/填充 sleep(1);/延時(shí)1ms,提高填充過(guò)程的可視性 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é)點(diǎn)if(scanmin = i) /桶頭結(jié)點(diǎn)headb = new bucket; /建立桶的頭結(jié)點(diǎn)currentb = headb; /currentb為bucket當(dāng)前節(jié)點(diǎn)指針currentb->scanline = scanmin;currentb->p = null; /沒(méi)有連接邊鏈表currentb->next = null;else /建立桶的其他節(jié)點(diǎn)currentb->next =
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)三通模具市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)MP3反折板市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)豬爪脫毛機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)牛腹肉行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)香菇蠔油數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)硅橡膠增爬裙數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)熱敏收銀紙數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)帶電腦豪華型生化分析儀數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 二零二五年度地鐵隧道水電暖消防安全保障合同2篇
- 二零二五個(gè)人住房貸款合同范本參考8篇
- 二零二五版電力設(shè)施維修保養(yǎng)合同協(xié)議3篇
- 最經(jīng)典凈水廠施工組織設(shè)計(jì)
- 2025年度版權(quán)授權(quán)協(xié)議:游戲角色形象設(shè)計(jì)與授權(quán)使用3篇
- 心肺復(fù)蘇課件2024
- 《城鎮(zhèn)燃?xì)忸I(lǐng)域重大隱患判定指導(dǎo)手冊(cè)》專題培訓(xùn)
- 湖南財(cái)政經(jīng)濟(jì)學(xué)院專升本管理學(xué)真題
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第一章運(yùn)動(dòng)技能學(xué)習(xí)與控制概述
- 工程設(shè)計(jì)費(fèi)取費(fèi)標(biāo)準(zhǔn)
- 清華大學(xué)考生自述
- 人機(jī)工程學(xué)與眼鏡
- 中層后備干部培訓(xùn)心得體會(huì)范本
評(píng)論
0/150
提交評(píng)論