




已閱讀5頁(yè),還剩2頁(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)介
實(shí)驗(yàn)三 多邊形的有效邊表填充算法一、實(shí)驗(yàn)?zāi)康呐c要求1、理解多邊形的掃描轉(zhuǎn)換原理、方法; 2、掌握有效邊表填充算法;3、掌握鏈表的建立、添加結(jié)點(diǎn)、刪除節(jié)點(diǎn)的基本方法;3、掌握基于鏈表的排序操作。二、實(shí)驗(yàn)內(nèi)容在實(shí)驗(yàn)二所實(shí)現(xiàn)工程的基礎(chǔ)上,實(shí)現(xiàn)以下內(nèi)容并把實(shí)現(xiàn)函數(shù)封裝在類CMyGL 中。 1、C+實(shí)現(xiàn)有效邊表算法進(jìn)行多邊形掃描轉(zhuǎn)換 2、利用1進(jìn)行多邊形掃描轉(zhuǎn)換和區(qū)域填充的實(shí)現(xiàn); 三、實(shí)驗(yàn)原理 請(qǐng)同學(xué)們根據(jù)教材及上課的PPT獨(dú)立完成。四、實(shí)驗(yàn)步驟(程序?qū)崿F(xiàn))。1、建立并選擇工程項(xiàng)目。打開(kāi)VC6.0-菜單File 的New 項(xiàng),在projects 屬性頁(yè)選擇MFC AppWizard(exe)項(xiàng),在Project name 中輸入一個(gè)工程名,如“Sample”。單文檔。2、新建一個(gè)圖形類。選擇菜單Insert New class,Class type 選擇“Generic Class”,Name 輸入類名,如“CMyCG。3、向新建的圖形類中添加成員函數(shù)(實(shí)際就是加入實(shí)驗(yàn)要求實(shí)現(xiàn)的圖形生成算法的實(shí)現(xiàn)代碼)。在工作區(qū)中直接鼠標(biāo)右鍵單擊,選擇“Add Member Function”項(xiàng),添加繪制圓的成員函數(shù)。void PolygonFill(int number, CPoint *p, COLORREF color, CDC* pDC)添加其他成員函數(shù):CreatBucket();CreatET();AddEdge();EdgeOrder();4、成員函數(shù)的實(shí)現(xiàn)。實(shí)現(xiàn)有效邊表填充算法。這一部分需要同學(xué)們?nèi)?shí)現(xiàn)。參考實(shí)現(xiàn):多邊形的有效邊表填充算法的基本過(guò)程為:1、定義多邊形:2、初始化桶3、建立邊表4、多邊形填充1) 對(duì)每一條掃描線,將該掃描線上的邊結(jié)點(diǎn)插入到臨時(shí)AET表中,HeadE.2) 對(duì)臨時(shí)AET表排序,按照x遞增的順序存放。3) 根據(jù)AET表中邊表結(jié)點(diǎn)的ymax拋棄掃描完的邊結(jié)點(diǎn),即ymax=scanline4) 掃描AET表,填充掃描線和多邊形相交的區(qū)間。5) 根據(jù)的邊連貫性,更新AET表。0、構(gòu)造桶結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)和有效邊表的數(shù)據(jù)結(jié)構(gòu):有效邊表的數(shù)據(jù)結(jié)構(gòu):類AETclass AET public:AET();virtual AET();double x;int yMax;double k;/代替1/kAET *next;桶結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu):類Bucketclass Bucket public:Bucket();virtual Bucket();int ScanLine;AET *p;/桶上的邊表指針Bucket *next;1、定義多邊形:CPoint Point7;/定義多邊形/設(shè)置多邊形的7個(gè)頂點(diǎn)Point0=CPoint(550,400);/P0Point1=CPoint(350,600);/P1Point2=CPoint(250,350);/P2Point3=CPoint(350,50);/P3Point4=CPoint(500,250);/P4Point5=CPoint(600,50);/P5Point6=CPoint(800,450);/P62、初始化桶Bucket* CreatBucket(int number,CPoint *Point)int ScanMin,ScanMax;Bucket *HeadB,*CurrentB;ScanMin = ScanMax = Point0.y;for(int i = 1;inumber;i+)/找最低和最高掃描線for(i = ScanMin;iScanLine = i;CurrentB-p = NULL; /沒(méi)有連接邊鏈表CurrentB-next = NULL;Else/建立桶的其它結(jié)點(diǎn)return HeadB;3、建立邊表Bucket * CreatET(int number,CPoint *Point)Bucket *HeadB;Bucket *CurrentB;AET *CurrentE,*Edge;HeadB = CreateBucket(number,Point);for (int i = 0;inumber;i+)/訪問(wèn)每個(gè)頂點(diǎn)int j = i + 1; /邊的第二個(gè)頂點(diǎn),Pointi和Pointj構(gòu)成邊if (j = number)/保證多邊形的閉合j = 0;CurrentB = HeadB;/從桶鏈表的頭結(jié)點(diǎn)開(kāi)始搜索邊(i,j)放入哪個(gè)桶if(Pointi.yCurrentB.ScanLine)/在桶內(nèi)尋找該邊的yMinCurrentB = CrrentB-next;/移到下一個(gè)桶結(jié)點(diǎn)Edge = new AET();/構(gòu)造有效邊表結(jié)點(diǎn),計(jì)算AET表的值Edge-x = Pointi.x;Edge-ymax = Pointj.y;Edge-k = double(Pointj.x-Pointi.x)/(Pointj.y-Pointi.y);/代表1/kif(CurrentB-p = NULL)/當(dāng)前桶結(jié)點(diǎn)上沒(méi)有鏈接邊結(jié)點(diǎn)Current-p = Edge;/第一個(gè)邊結(jié)點(diǎn)直接連接到對(duì)應(yīng)的桶中else/如果當(dāng)前邊已連有邊結(jié)點(diǎn)CurrentE = CurrentB-p;/移動(dòng)指針到當(dāng)前邊的最后一個(gè)邊結(jié)點(diǎn)/把當(dāng)前邊接上去if(Pointj.y=scanline4) 掃描AET表,填充掃描線和多邊形相交的區(qū)間。5) 根據(jù)的邊連貫性,更新AET表。void PolygonFill (int number,CPoint *p,COLORREF fillcolor,CDC *pDC)/多邊形填充HeadE=NULL;for(CurrentB=HeadB;CurrentB!=NULL;CurrentB=CurrentB-next)/訪問(wèn)所有桶結(jié)點(diǎn)1) 對(duì)每一條掃描線,將該掃描線上的邊結(jié)點(diǎn)插入到臨時(shí)AET表中,HeadEfor(CurrentE=CurrentB-p;CurrentE!=NULL;CurrentE=CurrentE-next)/訪問(wèn)桶中排序前的邊結(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í)Aet表2) 對(duì)臨時(shí)AET表排序,按照x遞增的順序存放。EdgeOrder();/使得邊表按照x遞增的順序存放3) 根據(jù)AET表中邊表結(jié)點(diǎn)的ymax拋棄掃描完的邊結(jié)點(diǎn),即ymax=scanlineT1=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)/根據(jù)AET表中邊表結(jié)點(diǎn)的ymax拋棄掃描完的邊結(jié)點(diǎn),即ymax=ScanLine4) 掃描AET表,填充掃描線和多邊形相交的區(qū)間。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)始到下一結(jié)點(diǎn)的x值結(jié)束的區(qū)間xe=T1-x-1;/左閉右開(kāi)/填充Sleep(1);/延時(shí)1ms,提高填充過(guò)程的可視性In=FALSE;5) 根據(jù)的邊連貫性,更新AET表。/利用邊的連貫性,更新交點(diǎn)信息delete HeadB; delete CurrentB;delete CurrentE;delete HeadE;5、圖形類的使用 (1)、圖形類對(duì)象的定義。首先在“C*View”(本例中是CSampleView)類的頭文件中加入圖形類的頭文件,使圖形類能在C*View 中被辨識(shí)和使用;然后,在C*View 類頭文件中實(shí)例化圖形類,即定義一個(gè)圖形類的對(duì)象。在public屬性區(qū)加入:CmyCG m_cg;(2)、圖形類對(duì)象的使用。在“C*View”類中有一個(gè)成員函數(shù)void OnDraw(CDC* pDC),找到該函數(shù)的實(shí)現(xiàn)。在其中加入對(duì)圖形類對(duì)象的使用代碼:m_cg- PolygonFill(_,_,_,_);/測(cè)試:填充的多邊形的七個(gè)頂點(diǎn)為:Point0=CPoint(550,400);/P0Point1=CPoint(350,600);/P1Point2=CPoint(250,350);/P2Point3=CPoint(350,50);/P3Point4=CPoint(500,250);/P4Point5=CPoint(600,50);/P5Point6=CPoint(800,450);/P6在進(jìn)行填充之前先繪制多邊形的輪廓。6、程序的調(diào)試、運(yùn)行。五、實(shí)驗(yàn)結(jié)果抓圖與結(jié)果分析 1、請(qǐng)給出頂點(diǎn)數(shù)7個(gè),Point0=CPoint(550,400);/P0Point1=CPoint(350,600);/P1Point2=CPoint(250,350);/P2Point3=CPoint(350,50);/P3Point4=CPoint(500,250);/P4Point5=CPoint(600,50);/P5Point6=CPoint(800,450);/P6的多邊形,填充顏色為紅色的填充效果。2、請(qǐng)給出頂點(diǎn)數(shù)6個(gè),Point0
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 具有振震雙控功能的模塊化層并聯(lián)橡膠支座及組合隔振(震)層研究
- 管理與護(hù)理管理學(xué)
- 倉(cāng)庫(kù)人員安全意識(shí)提升方案
- 保護(hù)牙齒健康教案說(shuō)課
- 腎挫傷患者的常規(guī)護(hù)理
- 超聲波泵技術(shù)解析與應(yīng)用
- 師德警示教育案例解析與應(yīng)用
- 《智能網(wǎng)聯(lián)汽車技術(shù)》課件-智能網(wǎng)聯(lián)汽車發(fā)展目標(biāo)的認(rèn)知
- 預(yù)防職業(yè)病危害課件
- 小學(xué)教師常規(guī)培訓(xùn)
- 實(shí)驗(yàn)室培育鉆石行業(yè)技術(shù)發(fā)展趨勢(shì)報(bào)告
- 2025年領(lǐng)英大制造行業(yè)人才全球化報(bào)告-馬來(lái)西亞篇
- 專題:閱讀理解 30篇 中考英語(yǔ)高分提升之新題速遞第二輯【含答案+解析】
- 企業(yè)面試題目和答案大全
- 抖音房產(chǎn)直播課件
- 2025至2030中國(guó)近視眼治療儀市場(chǎng)競(jìng)爭(zhēng)力剖析及企業(yè)經(jīng)營(yíng)形勢(shì)分析報(bào)告
- 2025年高考化學(xué)試卷(廣東卷)(空白卷)
- 體育老師招聘試題及答案
- 自然生態(tài)探險(xiǎn)之旅行業(yè)跨境出海項(xiàng)目商業(yè)計(jì)劃書
- 2025年北京市高考英語(yǔ)試卷真題(含答案解析)
- 西藏自治區(qū)拉薩市達(dá)孜區(qū)孜縣2025年七下英語(yǔ)期中質(zhì)量檢測(cè)模擬試題含答案
評(píng)論
0/150
提交評(píng)論