版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編號(hào)本科生畢業(yè)設(shè)計(jì)(論文)題目: 繪圖軟件的設(shè)計(jì) 學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 二 年 月摘 要隨著多媒體技術(shù)的普及和發(fā)展,繪圖軟件在生活工作中的使用越來(lái)越頻繁.現(xiàn)在各類(lèi)繪圖軟件數(shù)不勝數(shù),但大多要么功能太簡(jiǎn)單,不能滿足畫(huà)圖需要,要么設(shè)計(jì)太復(fù)雜,功能累贅,缺乏易用性.Windows自帶的畫(huà)圖軟件(開(kāi)始附件畫(huà)圖),是一款簡(jiǎn)單,易用的畫(huà)圖軟件,能滿足一些畫(huà)點(diǎn)、畫(huà)線、畫(huà)矩形、畫(huà)圓等的簡(jiǎn)單功能.根據(jù)所學(xué)的計(jì)算機(jī)圖形學(xué)的知識(shí),使用Visual Basic 作為開(kāi)發(fā)工具,設(shè)計(jì)一個(gè)畫(huà)圖軟件.基本實(shí)現(xiàn)windows系統(tǒng)畫(huà)圖軟件的所有功能.可以為左右鍵分別指定顏色,同時(shí)使用兩種顏色畫(huà)圖.可
2、添加坐標(biāo)軸及刻度,可以繪制簡(jiǎn)單函數(shù)曲線,可控制各圖形的精準(zhǔn)位置和尺寸.可以使用純色或多種材質(zhì)使用噴槍或填充圖形.可以實(shí)時(shí)截取全屏幕或動(dòng)態(tài)窗口圖片加以編輯,保存.可以實(shí)現(xiàn)圖形的復(fù)制、剪切、粘貼、刪除,文件的打開(kāi)和保存.設(shè)計(jì)有快速啟動(dòng)頁(yè),可打開(kāi)最近文件,提高效率;多窗口操作,界面美觀,操作方便.關(guān)鍵詞: Visual Basic;隨機(jī)文件讀寫(xiě);填充;貝塞爾;BresenhamABSTRACTWith the popularization and development of multimedia technology, the use of drawing software in the life
3、 and work are increasingly frequent.There are numerous of the various types of drawing software, but most of them either function is too simple that can not meet the need of drawing or design is too complex, functional burden, lack of ease of use. Paint software that comes with Windows (Start - Acce
4、ssories - Paint), is a simple, easy-to-use and meets the simple function of the draw point, draw lines, draw a rectangle, circle, etc.According to the knowledge of the computer graphics, using Visual Basic as a development tool to design a drawing software. Basically all the features of the Microsof
5、t Paint will be included in this drawing software. For the left and right arrow keys to specify a color,you can use both color drawing. Can be added to the axis scale, and can draw the curve of the simple function, and you can control the precise location and size of the graph. You can use a solid c
6、olor or a variety of materials to use the gun or filled shapes. You can be capture real-time interception of full-screen or dynamic window picture to edit, save. Graphics to copy, cut, paste, delete, open and save files. The design of the Quick Start page to open the file, increase efficiency; multi
7、-window operation, beautiful interface, easy to operate.Keywords: Visual Basic; Random file read and write; fill; Bezier; Bresenham目 錄第1章 緒論11.1 課題背景11.2 目前現(xiàn)狀11.3 繪圖軟件概述21.3.1 基本介紹21.3.2 語(yǔ)言簡(jiǎn)介21.3.3 研究?jī)?nèi)容21.3.4 預(yù)期目標(biāo)2第2章 開(kāi)發(fā)技術(shù)與環(huán)境介紹32.1 visual bisic32.1.1 VB語(yǔ)言的特點(diǎn)32.1.2 屬性、方法和事件32.1.3 對(duì)象與類(lèi)42.2 開(kāi)發(fā)環(huán)境介紹4第3章
8、二維圖形生成技術(shù)53.1 直線掃描轉(zhuǎn)換算法53.1.1 直線DDA算法63.1.2 中點(diǎn)畫(huà)線算法73.1.3 Bresenham畫(huà)線算法83.2 圓的掃描轉(zhuǎn)換算法103.2.1 圓的性質(zhì)103.2.2 中點(diǎn)畫(huà)圓算法103.2.3 Bresenham畫(huà)圓算法123.3 填充技術(shù)133.3.1 種子填充算法13掃描線填充算法143.4 bezier曲線163.4.1 Bezier曲線的定義163.4.2 Bezier曲線的離散生成18第4章 界面設(shè)計(jì)與編碼194.1 界面設(shè)計(jì)194.1.1 主界面194.1.2 展示屏幕204.1.3 快速啟動(dòng)頁(yè)204.1.4 新建文檔214.1.5 菜單欄預(yù)覽2
9、14.1.6 工具選項(xiàng)欄224.1.7 其他窗體234.2 編碼實(shí)現(xiàn)244.2.1 直線-Bresenham畫(huà)線算法244.2.2 畫(huà)圓算法254.2.3 貝賽爾曲線284.2.4 填充-掃描線填充算法314.2.5 更新畫(huà)布UpdateArea334.2.6 各類(lèi)編輯操作344.2.7 裁剪394.2.8 圖形的翻轉(zhuǎn)424.2.9 截屏444.2.10 打開(kāi)保存454.2.11 最近打開(kāi)記錄-隨機(jī)文件讀寫(xiě)474.3 成果展示51第5章 結(jié)論與展望555.1結(jié)論555.2不足之處及未來(lái)展望55參考文獻(xiàn)56致 謝57第1章 緒論1.1 課題背景視覺(jué)是人類(lèi)最重要的感覺(jué)手段,圖形又是視覺(jué)的基礎(chǔ),隨著
10、多媒體技術(shù)的普及和發(fā)展,人們對(duì)畫(huà)面的要求越高,對(duì)畫(huà)圖工具也提出了更高更全面的要求.對(duì)于一個(gè)人用戶來(lái)說(shuō),開(kāi)發(fā)一個(gè)基本的圖形繪制處理系統(tǒng),為用戶提供一些基本的圖形繪制功能,可以方便用戶的使用.圖形和圖像有很大的不同,到目前為止,計(jì)算機(jī)圖形學(xué)和數(shù)字圖像處理還是作為兩門(mén)課程分別講授的,計(jì)算機(jī)圖形學(xué)是將點(diǎn)、線、面、等實(shí)體生成物體的模型存放在計(jì)算機(jī)里,并可以進(jìn)行修改、處理、操作和顯示的一門(mén)學(xué)科.隨著多媒體技術(shù)的普及和發(fā)展,繪圖軟件在生活工作中的使用越來(lái)越頻繁.現(xiàn)在各類(lèi)繪圖軟件數(shù)不勝數(shù),但大多要么功能太簡(jiǎn)單,不能滿足畫(huà)圖需要,要么設(shè)計(jì)太復(fù)雜,功能累贅,缺乏易用性.Windows自帶的畫(huà)圖軟件(開(kāi)始附件畫(huà)圖)
11、,是一款簡(jiǎn)單,易用的畫(huà)圖軟件,能滿足一些畫(huà)點(diǎn)、畫(huà)線、畫(huà)矩形、畫(huà)圓等的簡(jiǎn)單功能.所以,開(kāi)發(fā)一個(gè)繪圖軟件,能滿足大部分用戶的使用需求,方便用戶使用,實(shí)屬必要.該軟件通過(guò)微軟的開(kāi)發(fā)工具Visual Basic結(jié)合計(jì)算機(jī)圖形學(xué)的知識(shí)設(shè)計(jì)與開(kāi)發(fā).計(jì)算機(jī)圖形學(xué)的基本含義是使用計(jì)算機(jī)通過(guò)算法和程序在顯示設(shè)備上構(gòu)造出圖形.計(jì)算機(jī)圖形學(xué)中的圖形是指可以用數(shù)學(xué)方法描述的并且需要在計(jì)算機(jī)上顯示的圖形,也就是說(shuō),計(jì)算機(jī)圖形學(xué)中的圖形是人們通過(guò)計(jì)算機(jī)設(shè)計(jì)和構(gòu)造出來(lái)的,不是通過(guò)如數(shù)碼相機(jī)或掃描儀等設(shè)備輸入的圖像,所設(shè)計(jì)和構(gòu)造的圖形可以使現(xiàn)實(shí)世界中已經(jīng)存在的物體,也可以是完全虛無(wú)的物體.1.2 目前現(xiàn)狀隨著計(jì)算機(jī)科學(xué)技術(shù)的
12、發(fā)展,近30年來(lái),計(jì)算機(jī)圖形學(xué)得到迅猛發(fā)展,人們已經(jīng)可以通過(guò)計(jì)算機(jī)高速、有效、真實(shí)地生成圖形,計(jì)算機(jī)圖形學(xué)作為利用計(jì)算機(jī)生成圖形的技術(shù),已經(jīng)越來(lái)越廣泛地在各個(gè)領(lǐng)域等到了應(yīng)用.計(jì)算機(jī)圖形學(xué)應(yīng)用領(lǐng)域的拓寬和應(yīng)用水平的提高,使得人們?cè)絹?lái)越重視對(duì)計(jì)算機(jī)圖形學(xué)的研究和利用.當(dāng)今,計(jì)算機(jī)圖形學(xué)已經(jīng)成為了計(jì)算機(jī)科學(xué)技術(shù)領(lǐng)域的一個(gè)重要研究方向,并被廣泛地應(yīng)用于科學(xué)計(jì)算、工程設(shè)計(jì)、醫(yī)藥、工業(yè)、藝術(shù)、娛樂(lè)業(yè)、廣告業(yè)、教育與培訓(xùn)、商業(yè)及政府部門(mén)等.計(jì)算機(jī)圖形技術(shù)是隨著計(jì)算機(jī)技術(shù)在圖形處理領(lǐng)域中的應(yīng)用而發(fā)展起來(lái)的一 門(mén)新技術(shù),是伴隨著電子計(jì)算機(jī)及其外圍設(shè)備的發(fā)展而產(chǎn)生的,現(xiàn)已成為計(jì)算機(jī)應(yīng)用科學(xué)中的一個(gè)重要分支,在許多
13、行業(yè)中起著越來(lái)越大的作用.計(jì)算機(jī)的運(yùn)算能力的提高,圖形處理速度的加快,使得圖形學(xué)的各個(gè)研究方向得到充分發(fā)展,大量?jī)r(jià)格低、簡(jiǎn)單易用的圖形應(yīng)用程序促使具有圖形處理功能的計(jì)算機(jī)進(jìn)入家庭. 圖形學(xué)已廣泛應(yīng)用于計(jì)算機(jī)輔助設(shè)計(jì)與制造、計(jì)算機(jī)動(dòng)畫(huà)、科學(xué)計(jì)算可視化、虛擬現(xiàn)實(shí)、影視娛樂(lè)等各個(gè)領(lǐng)域.這必然促使計(jì)算機(jī)專(zhuān)業(yè)人員、廣大非計(jì)算機(jī)專(zhuān)業(yè)的應(yīng)用人員,從計(jì)算機(jī)圖形學(xué)的理論高度和計(jì)算機(jī)繪圖的實(shí)用角度來(lái)研究和開(kāi)發(fā)計(jì)算機(jī)圖形的生成技術(shù)及軟件.1.3 繪圖軟件概述1.3.1 基本介紹該繪圖軟件參照Windows系統(tǒng)自帶畫(huà)圖,在其基礎(chǔ)上,優(yōu)化界面,添加功能,加以實(shí)現(xiàn),以達(dá)到,功能齊全,界面簡(jiǎn)潔,使用方面的目的1.3.2 語(yǔ)
14、言簡(jiǎn)介Visual Basic是一種由微軟公司開(kāi)發(fā)的包含協(xié)助開(kāi)發(fā)環(huán)境的事件驅(qū)動(dòng)編程語(yǔ)言.從任何標(biāo)準(zhǔn)來(lái)說(shuō),VB都是世界上使用人數(shù)最多的語(yǔ)言不僅是盛贊VB的開(kāi)發(fā)者還是抱怨VB的開(kāi)發(fā)者的數(shù)量.它源自于BASIC編程語(yǔ)言.VB擁有圖形用戶界面(GUI)和快速應(yīng)用程序開(kāi)發(fā)(RAD)系統(tǒng),可以輕易的使用DAO、RDO、ADO連接數(shù)據(jù)庫(kù),或者輕松的創(chuàng)建ActiveX控件.程序員可以輕松的使用VB提供的組件快速建立一個(gè)應(yīng)用程序通過(guò)幾年的發(fā)展,它已成為一種專(zhuān)業(yè)化的開(kāi)發(fā)語(yǔ)言和環(huán)境.用戶可用Visual Basic快速創(chuàng)建Windows程序,現(xiàn)在還可以編寫(xiě)企業(yè)水平的客戶端/服務(wù)器程序及強(qiáng)大的數(shù)據(jù)庫(kù)應(yīng)用程序.VB會(huì)吸
15、引更多的贊譽(yù)和批評(píng),也會(huì)繼續(xù)為廣大的用戶和程序員使用.它非常適合用來(lái)開(kāi)發(fā)擁有友好界面的程序(比如針對(duì)終端的數(shù)據(jù)),但是不適合開(kāi)發(fā)其它程序(比如聯(lián)合計(jì)算程序).1.3.3 研究?jī)?nèi)容通過(guò)參考現(xiàn)有的各類(lèi)繪圖軟件(主要參考了Windows畫(huà)圖的功能)并詳細(xì)了解繪圖的主要功能及應(yīng)用完成系統(tǒng)的需求分析;根據(jù)需求分析完成系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)圖;根據(jù)系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)圖完成系統(tǒng)的結(jié)構(gòu)設(shè)計(jì),包括系統(tǒng)的界面設(shè)計(jì)以及功能模塊設(shè)計(jì);根據(jù)設(shè)計(jì)文檔,設(shè)計(jì)系統(tǒng)界面,完成各模塊編碼;完成單元測(cè)試和系統(tǒng)測(cè)試,及功能測(cè)試.1.3.4 預(yù)期目標(biāo)軟件預(yù)期完成以下功能:(1) 基本實(shí)現(xiàn)windows系統(tǒng)畫(huà)圖軟件的所有功能.(2) 可以為左右鍵分
16、別指定顏色,同時(shí)使用兩種顏色畫(huà)圖.(3) 具有基本的圖形繪制功能,例如:矩形、圓形、點(diǎn)、線等.(4) 可添加坐標(biāo)軸及刻度,可以繪制簡(jiǎn)單貝塞爾曲線,可控制各圖形的精準(zhǔn)位置和尺寸.(5) 可以使用純色或多種材質(zhì)使用噴槍或填充圖形.(6) 對(duì)于每一種圖形的繪制,可以選擇不同的顏色,不同的線條.(7) 可以實(shí)時(shí)截取全屏幕或動(dòng)態(tài)窗口圖片加以編輯,保存.(8) 可以實(shí)現(xiàn)圖形的復(fù)制、剪切、粘貼、刪除,文件的打開(kāi)和存儲(chǔ).(9) 設(shè)計(jì)有快速啟動(dòng)頁(yè),可打開(kāi)最近文件,提高效率;多窗口操作,界面美觀,操作方便.第2章 開(kāi)發(fā)技術(shù)與環(huán)境介紹2.1 Visual BisicVisual Basic(簡(jiǎn)稱(chēng)VB)是近年來(lái)在國(guó)內(nèi)
17、外得到迅速推廣應(yīng)用的可視化程序設(shè)計(jì)語(yǔ)言,具有簡(jiǎn)單易學(xué),功能強(qiáng)大,軟件費(fèi)用支出低,見(jiàn)效快等特點(diǎn).它提供了開(kāi)發(fā)Windows應(yīng)用程序最迅速,最簡(jiǎn)捷的方法,不但是專(zhuān)業(yè)人員得心應(yīng)手的開(kāi)發(fā)工具,而且易于被非專(zhuān)業(yè)人員掌握使用.目前,全世界數(shù)以百萬(wàn)計(jì)的程序設(shè)計(jì)人員正在用Visual Basic開(kāi)發(fā)各種類(lèi)型的軟件.2.1.1 VB語(yǔ)言的特點(diǎn)(1) 可視化Visual Basic是可視化的程序設(shè)計(jì)語(yǔ)言,開(kāi)發(fā)人員只需要按照設(shè)計(jì)要求對(duì)屏幕進(jìn)行布局,用集成開(kāi)發(fā)環(huán)境來(lái)直接拖和畫(huà)出各個(gè)菜單、按鈕、滾動(dòng)條、窗口等不同類(lèi)型的對(duì)象.(2) 面向?qū)ο笤赩isual Basic中,窗體及控件都稱(chēng)為對(duì)象,有這些對(duì)象構(gòu)成了用戶界面,V
18、isual Basic是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它是將代碼和數(shù)據(jù)結(jié)合在每個(gè)對(duì)象中,用戶只需要了解每個(gè)對(duì)象能完成什么任務(wù),不必知道對(duì)象是如何工作的,而程序設(shè)計(jì)人員只要編寫(xiě)實(shí)現(xiàn)程序功能的那部分代碼,這樣大大提高了程序設(shè)計(jì)的效率,但是Visual Basic里面沒(méi)有多態(tài)等面向?qū)ο蟮奶匦?,所以有人稱(chēng)Visual Basic是準(zhǔn)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言.(3) 事件驅(qū)動(dòng)Visual Basic通過(guò)事件來(lái)執(zhí)行對(duì)象的操作,一個(gè)對(duì)象可能會(huì)產(chǎn)生多個(gè)事件,每個(gè)事件都可以通過(guò)一段程序來(lái)響應(yīng),而各個(gè)事件之間卻不一定有聯(lián)系,這樣的應(yīng)用程序代碼較短,使程序既易于編寫(xiě)又易于維護(hù).(4) 沿用結(jié)構(gòu)化的程序設(shè)計(jì)的思想Visual
19、Basic具有豐富的數(shù)據(jù)類(lèi)型,眾多的函數(shù),并采 用了結(jié)構(gòu)化的程序 設(shè) 計(jì)方法,簡(jiǎn)單易學(xué).(5) 易學(xué)易用的集成開(kāi)發(fā)環(huán)境 Visual basic提供了易學(xué)易用的集成開(kāi)發(fā)環(huán)境,在該開(kāi)發(fā)環(huán)境中,用戶可設(shè)計(jì)用戶界面,編寫(xiě)代碼,調(diào)試程序,直至把應(yīng)用程序編譯成可執(zhí)行文件使其直接在windows環(huán)境下運(yùn)行 (6) Visual Basic支持多種數(shù)據(jù)庫(kù)的訪問(wèn) 采用了對(duì)象的鏈接與嵌入(OLE,Object linking and embedding)技術(shù)可以很方便的開(kāi)發(fā)出集聲音、圖像、動(dòng)畫(huà)、子處理、web等對(duì)象于一體的應(yīng)用程序.2.1.2 屬性、方法和事件在Visual Basic中,可以通過(guò)屬性、方法和事
20、件來(lái)說(shuō)明和衡量一個(gè)對(duì)象的特征.事件(Event)事件是指發(fā)生在某一對(duì)象上的事情.事件又可分為鼠標(biāo)事件和鍵盤(pán)事件.例如,在命令按鈕(Command Button)這一對(duì)象上可能發(fā)生鼠標(biāo)單擊(Click)、鼠標(biāo)移動(dòng)(Mouse Move)、鼠標(biāo)按下(Mouse Down)等鼠標(biāo)事件,也可能發(fā)生鍵盤(pán)按下(Key Down)等鍵盤(pán)事件.總之,事件指明了對(duì)象“什么情況下做?”,常用于定義對(duì)象發(fā)生某種反映的時(shí)機(jī)和條件.方法(Method)方法是用來(lái)控制對(duì)象的功能及操作的內(nèi)部程序.例如,人具有說(shuō)話、行走、學(xué)習(xí)、睡覺(jué)等功能,在visual Basic中,對(duì)象所能提供的這些功能和操作,就稱(chēng)作“方法”.以窗體為例
21、,它具有顯示(show)或隱藏(hide)的方法.總之,方法指明了對(duì)象“能做什么?”,常用于定義對(duì)象的功能和操作.屬性(Property)屬性是指用于描述對(duì)象的名稱(chēng)、位置、顏色、字體等特征的一些指標(biāo).可以通過(guò)屬性改變對(duì)象的特性.有些屬性可以在設(shè)計(jì)時(shí)通過(guò)屬性窗口來(lái)設(shè)置,不用編寫(xiě)任何代碼;而有些屬性則必須通過(guò)編寫(xiě)代碼,在運(yùn)行程序的同時(shí)進(jìn)行設(shè)置.可以在運(yùn)行時(shí)讀取和設(shè)置取值的屬性成為讀寫(xiě)屬性,只能讀取的屬性成為只讀屬性.總之屬性指明了對(duì)象“是什么樣的?”,常用于定義對(duì)象的外觀.2.1.3 對(duì)象與類(lèi)(1) 對(duì)象(object)Visual basic 具有“面向?qū)ο蟆钡奶匦?,Visual Basic 應(yīng)
22、用種程序的基本單元是對(duì)象,用Visual Basic 編程就是用“對(duì)象”組裝程序.這種“面向?qū)ο蟆钡木幊谭椒ㄅc傳統(tǒng)的全部用代碼編制程序的方法有很大區(qū)別,就像用集成電路芯片組裝電視機(jī)和用三極管,二極管組裝電視機(jī)的區(qū)別一樣.顯然,“面向?qū)ο蟆钡木幊谭椒ū葌鹘y(tǒng)的編程方法更簡(jiǎn)單,更方便,并且編寫(xiě)出的程序也更加穩(wěn)定.因此,“對(duì)象”可以被看做 Visual Basic 程序設(shè)計(jì)的核心. 在 Visual Basic 程序設(shè)計(jì)中,對(duì)象中還可以包含頭,手,腿,腳等部位,其中的每個(gè)部位又可以單獨(dú)作為作為被研究的對(duì)象.在 Visual Basic 程序設(shè)計(jì)中,整個(gè)應(yīng)用程序就是一個(gè)對(duì)象,應(yīng)用程序中又包含著窗體(Fr
23、ame),命令按鈕(Command),菜單(Menu)等對(duì)象.(2) 類(lèi)(Class)在 Visual Basic 中,對(duì)象是由類(lèi)創(chuàng)建的,因此對(duì)象可以說(shuō)是類(lèi)的具體實(shí)例,這就好比是蛋糕和做蛋糕的模具之間的關(guān)系.各種不同的對(duì)象分屬于各種不同的種類(lèi).同一類(lèi)對(duì)象可能具有一些不同的特征(或是說(shuō)同一類(lèi)對(duì)象不一定具有完全相同的特性);具有某些相同的特性的對(duì)象,不一定是同一類(lèi)對(duì)象,這就好比是人和猴子雖然都有身高、性別等特征,但二者之間還存在著智商、語(yǔ)言等特性差異,這兩個(gè)對(duì)象之間的特性相差很多,根本就不能算是同一類(lèi)對(duì)象.而男人和女人,有著性別、生理等方面的差異,但他們絕大部分特性相同,可以算是同一種類(lèi).由此,可
24、以歸結(jié)為一句話:同一類(lèi)對(duì)象的絕大部分特性相同.2.2 開(kāi)發(fā)環(huán)境介紹操作系統(tǒng):Windows XP開(kāi)發(fā)語(yǔ)言:Visual Basic開(kāi)發(fā)工具:Microsoft Visual Basic 6.0 中文版第3章 二維圖形生成技術(shù)在顯示器上生成一個(gè)圖形,實(shí)質(zhì)上市往顯示器緩存的相應(yīng)單元中填入數(shù)據(jù).將計(jì)算機(jī)中表示的向量圖形在顯示器上顯示的過(guò)程稱(chēng)為圖形的掃描轉(zhuǎn)換俗稱(chēng)光柵化.圖形掃描轉(zhuǎn)換的關(guān)鍵是尋找合適的算法,利用計(jì)算機(jī)中圖形的向量表示和圖形的數(shù)學(xué)表示,計(jì)算出落在或充分接近圖形的像素,并以此像素的集合近似代替圖形.例如話一條從點(diǎn)(X0,Y0)到點(diǎn)(X1,Y1)的直線,實(shí)質(zhì)上是一個(gè)發(fā)現(xiàn)最佳逼近直線的像素序列,
25、并按直線的顏色屬性填入色彩的過(guò)程.由于一個(gè)復(fù)雜圖形是由許多基本的圖形構(gòu)成的,在一個(gè)圖形中,可能包含成千上萬(wàn)個(gè)基本圖形,所以要求進(jìn)行圖形掃描轉(zhuǎn)換時(shí)應(yīng)盡可能地高效率、速度快.又由于圖形的掃描轉(zhuǎn)換一般是由硬件直接完成的,因此,所涉及的掃描轉(zhuǎn)換算法,應(yīng)該便于硬件實(shí)現(xiàn).圖形的掃描轉(zhuǎn)換首先需要確定圖形像素的位置,然后再設(shè)置圖形的顏色或其他屬性.3.1 直線掃描轉(zhuǎn)換算法數(shù)學(xué)意義上的直線式指沒(méi)有寬度的、由連續(xù)的無(wú)數(shù)個(gè)點(diǎn)構(gòu)成的集合,因此顯示器只能近似地顯示直線.對(duì)直線進(jìn)行掃描轉(zhuǎn)換時(shí),需要在顯示器的有限像素中,確定最佳逼近該直線的一組像素,對(duì)這些像素進(jìn)行寫(xiě)操作,這個(gè)過(guò)程稱(chēng)為直線的掃描轉(zhuǎn)換.一下介紹一個(gè)像素寬度的3
26、種常用的直線繪制算法,即直線DDA算法,中點(diǎn)畫(huà)線算法及Bresenham畫(huà)線算法.在介紹這3種常用算法之前,首先介紹直線的直接畫(huà)線算法.xOkby圖3-1 直線的表示如圖3-1所示的直線方程為: (3-1)其中k為直線斜率,b為直線與y軸的交點(diǎn).如果已知直線段的兩個(gè)端點(diǎn)(x0, y0)和(x1, y1 ),直線也可以用兩點(diǎn)式表示: (3-2)通過(guò)兩點(diǎn)式,可以得到直線的斜率是: (3-3)利用直線方程,已知直線兩個(gè)端點(diǎn)(x0,y0)和( x1,y1 )的直線段,如給出直線上某一點(diǎn)的x坐標(biāo)值,可以計(jì)算出該點(diǎn)的y值.這就是直線的直接畫(huà)圖算法.為了便于計(jì)算機(jī)的計(jì)算,我們讓x坐標(biāo)從x0變化到x1 ,每一
27、步遞增1,這樣可以保證x坐標(biāo)落在對(duì)應(yīng)的柵格上,進(jìn)而計(jì)算對(duì)應(yīng)的y坐標(biāo),并舍入取整.用這種方法既直觀,又可行,然而效率較低.這是因?yàn)槊坎竭\(yùn)算都需要一個(gè)浮點(diǎn)乘法與一個(gè)舍入運(yùn)算.直線的浮點(diǎn)運(yùn)算占用大量的計(jì)算機(jī)資源,且運(yùn)算速度慢,所以直線的直接畫(huà)線算法沒(méi)有實(shí)際的應(yīng)用價(jià)值.3.1.1 直線DDA算法DDA是數(shù)字微分分析式(Digital Differential Analyzer)的縮寫(xiě).設(shè)直線段的兩個(gè)端點(diǎn)(x0, y0)和(x1, y1),直線掃描轉(zhuǎn)換的最簡(jiǎn)單方法是先算出直線的斜率,然后,從直線的起點(diǎn)開(kāi)始,確定最佳逼近于直線的y坐標(biāo).(xi , yi)(xi +1, yi+k)(xi +1, round
28、(yi+k)(xi ,round(yi) 圖3-2 直線數(shù)值微分示意圖假定端點(diǎn)坐標(biāo)均為整數(shù),表示端點(diǎn)恰在柵格上,讓x從起點(diǎn)變化到終點(diǎn),每步遞增Dx,,利用直線方程可以計(jì)算出對(duì)應(yīng)的y坐標(biāo):(3-4)取Dx=1時(shí),有yi+1 = yi + k,即當(dāng)x每遞增1時(shí),y遞增的值是直線斜率k.DDA算法取直線起點(diǎn)( x0, y0 )作為初始坐標(biāo),每一步x遞增1,通過(guò)上式計(jì)算出y坐標(biāo),這樣就可以寫(xiě)出直線掃描轉(zhuǎn)換的數(shù)值微分算法.用直線微分算法繪制的直線如圖3-2. 算法中的變量說(shuō)明與前面的分析保持一致,算法主體是一個(gè)循環(huán),每一次循環(huán)中,變量x 遞增1,y遞增k.注意上述分析和算法僅適用于k1的情形.這種情況下
29、,x每增加1, y最多增加1,從而保證在迭代循環(huán)的過(guò)程中,當(dāng)x方向遞增1時(shí),y方向不可能有像素的跳躍.如果直線的端點(diǎn)為(100,100)和(101,200),采用上面的算法將只畫(huà)出了兩個(gè)像素,顯然不能表示出我們要畫(huà)的一條直線.當(dāng)直斜率k的絕對(duì)值超過(guò)1時(shí),必須把x、y在算法中的地位交換,即循環(huán)變量改為y,y每增加1, x相應(yīng)增加 1/k,算法的實(shí)現(xiàn)可以通過(guò)前面的k1情形下的DDA算法改寫(xiě).數(shù)值微分算法的本質(zhì),是用數(shù)值方法解微分方程,通過(guò)同時(shí)對(duì)x和y各增加一個(gè)小增量,計(jì)算下一步的x、y值.在一個(gè)迭代算法中,如果每一步的x、y值是用前一步的值加上一個(gè)增量來(lái)獲得的,那么,這種算法就稱(chēng)為增量算法.因此,
30、DDA算法是一個(gè)增量算法.增量算法通過(guò)循環(huán)簡(jiǎn)化了比較復(fù)雜的問(wèn)題,在圖形學(xué)中有較多的應(yīng)用.DDA方法計(jì)算像素位置,消除了直線方程中的乘法,在x和y方向使用合適的增量來(lái)逐步沿直線推出各像素位置,比直接使用直線方程快.但浮點(diǎn)增量誤差的連續(xù)疊加積累會(huì)使長(zhǎng)線段所計(jì)算的像素位置有所偏離.而且程序中的k與y 必須用浮點(diǎn)數(shù)表示,每一步運(yùn)算必須對(duì)y進(jìn)行舍入取整,取整操作和浮點(diǎn)運(yùn)算十分耗時(shí),不利于在硬件中實(shí)現(xiàn).3.1.2 中點(diǎn)畫(huà)線算法不失一般性,在對(duì)中點(diǎn)畫(huà)線法的討論中,假定直線斜率在0、1之間.如圖3-3所示,若直線在x方向上增加一個(gè)單位,則在y方向上的增量只能在0、1之間.假設(shè)x坐標(biāo)為xi的與直線最近的像素已經(jīng)
31、決定為P(xi, yi), 則下一個(gè)與直線最接近的像素只能是正右方的P1點(diǎn)(xi+1,yi)或右上方P2點(diǎn)(xi+1,yi +1).P2 (xi+1 , yi+1)QMP (xi , yi)P1 (xi+1 , yi)圖3-3中點(diǎn)畫(huà)線法中直線與中點(diǎn)、侯選點(diǎn)的關(guān)系以M(xi+1,yi+0.5)表示P1與 P2 的中點(diǎn),用Q表示理想直線與x=xi+1直線的交點(diǎn).很明顯,當(dāng)M在Q的下方,表明P2離直線更近,應(yīng)該取P2 為下一個(gè)直線上的點(diǎn); 當(dāng)M在Q的上方, 表明P1離直線更近, 應(yīng)該取P1 為下一個(gè)直線上的點(diǎn),如果M與Q重合,可以任取P1、P2中的一點(diǎn).這就是中點(diǎn)畫(huà)線的基本思想.中點(diǎn)畫(huà)線的算法實(shí)現(xiàn),
32、關(guān)鍵是建立判別式判斷M和Q的位置關(guān)系, 以及如何合理方便地利用增量算法計(jì)算判別式.假設(shè)直線的起點(diǎn)和終點(diǎn)分別是(x0,y0)和(x1,y1),如果直線方程采用隱式方程表示為: (3-5)通過(guò)簡(jiǎn)單計(jì)算, 直線隱式方程中的a、b、c分別為:由于假定直線斜率在0、1之間, 且x0 <x1, 所以a<0.依據(jù)直線的基本常識(shí), 如果一個(gè)點(diǎn)(x,y)在直線的上面,有F(x,y)>0; 如果一個(gè)點(diǎn)(x,y)在直線的下面,有F(x,y)<0; 如果一個(gè)點(diǎn)(x,y)在直線上,有F(x,y)=0;因此,欲判斷前述Q在M的上方還是下方,只要把M坐標(biāo)代入直線方程構(gòu)造出下面的判別式并判斷它的符號(hào).
33、 (3-6)當(dāng)d0時(shí),M在直線下方(即在Q的下方),應(yīng)取右上方的P2作為下一個(gè)像素;當(dāng)d0時(shí), M在直線上方(即在Q的上方),應(yīng)取正右方的P1作為下一個(gè)像素;當(dāng)d0時(shí),可以隨便取一個(gè).約定取正右方的P1.為了簡(jiǎn)化判別式的計(jì)算, 注意到di是xi和yi的線性函數(shù), 可以采用增量算法.當(dāng)d>0,取正右方像素P1,令再下一個(gè)像素的判別式為d1:(3-7)此時(shí)表示判別式的增量為a. 當(dāng)d<0,取右上方像素P2,令再下一個(gè)像素的判別式(3-8)此時(shí)表示判別式的增量為a+b.直線的最左端是端點(diǎn)(x0,y0), 所以d的初始值計(jì)算是:(3-9)上式的推導(dǎo)中考慮到了(x0,y0)在直線上,所以F(
34、x0, y0)=0.在實(shí)際使用中我們只關(guān)心d的符號(hào),又因?yàn)閍、b都是整數(shù),因此在算法實(shí)現(xiàn)中以2d的正負(fù)代替d的正負(fù),這樣可以化簡(jiǎn)掉d的初始值中得小數(shù),寫(xiě)出僅包含整數(shù)運(yùn)算的算法.中點(diǎn)畫(huà)線算法中,只包含整數(shù)變量和加法運(yùn)算,不包含浮點(diǎn)數(shù)和乘除法,適合硬件實(shí)現(xiàn).3.1.3 Bresenham畫(huà)線算法Bresenham算法是計(jì)算機(jī)圖形學(xué)領(lǐng)域使用最廣泛的直線掃描轉(zhuǎn)換算法,是一個(gè)更好的算法.為了說(shuō)明簡(jiǎn)便,仍然假定直線斜率在0到1之間.該方法采用了類(lèi)似于中點(diǎn)畫(huà)線算法的思想,用一個(gè)判別式的符號(hào)決定下一個(gè)像素點(diǎn).算法原理如下:過(guò)各行各列像素中心構(gòu)造一組虛擬網(wǎng)格線.按直線從起點(diǎn)到終點(diǎn)的順序計(jì)算直線與各垂直網(wǎng)格線的交
35、點(diǎn),然后確定該列像素中與此交點(diǎn)最近的像素.該算法的在采用增量計(jì)算的同時(shí),對(duì)于每一列,只需檢查一個(gè)誤差項(xiàng)的符號(hào),就可以確定該列的所求像素.P1 (xi+1 , yi)P (xi , yi)圖3-4 Bresenham算法設(shè)直線方程為: (3-10)假設(shè)已經(jīng)確定的像素為P(xi yi).那么下一個(gè)像素如圖3-4所示,可選擇的像素點(diǎn)為 (xi1, yi)和(xi1, yi1) )兩者中的一個(gè),在x=xi1處直線上點(diǎn)y=k(xi1)+b,,該點(diǎn)到點(diǎn)到(xi1, yi)和(xi1, yi1)的距離分別令為d1和d2:兩個(gè)距離的差是:若此差值為正,則d1d2,下一個(gè)像素點(diǎn)應(yīng)取(xi1, yi1);若此差值
36、為負(fù),d1<d2,下一個(gè)像素點(diǎn)應(yīng)取(xi1, yi);若此差值為零,則d ld2,下一個(gè)像素點(diǎn)可取兩個(gè)像素點(diǎn)中的任意一個(gè).為了簡(jiǎn)化,引入一個(gè)新的同正負(fù)的判別變量d:因此將上兩式做減法得:注意到當(dāng)di0時(shí),yi+1=yi+1,所以上式可改寫(xiě)為:當(dāng)di0時(shí),yi+1=yi,所以上式可改寫(xiě)為: (3-11)確定初始判別量d0.因?yàn)榫€段上第一個(gè)像素點(diǎn)可取起點(diǎn)(x0, y0) ,計(jì)算求出 (3-12)歸納后可以得到Bresenham的畫(huà)線算法至此,我們用數(shù)學(xué)方法推導(dǎo)了Bresenham算法及判別式的增量遞推算法.實(shí)際上,Bresenham算法還可以根據(jù)直的直線的簡(jiǎn)單幾何特性,直接通過(guò)對(duì)圖形的分析得
37、到算法,大家可以參考其它文獻(xiàn). 3.2 圓的掃描轉(zhuǎn)換算法與直線的掃描轉(zhuǎn)換類(lèi)似,圓的掃描轉(zhuǎn)換要在光柵網(wǎng)格中挑選出最靠近圓周的像素,為了簡(jiǎn)便,這里僅討論位于原點(diǎn),半徑為r的圓的掃描轉(zhuǎn)換.至于圓心不在遠(yuǎn)點(diǎn)的圓,可以先將圓心移到原點(diǎn),然后進(jìn)行掃描轉(zhuǎn)換,最后再將圓心移回到原來(lái)位置.3.2.1 圓的性質(zhì)與直線的掃描轉(zhuǎn)換類(lèi)似,圓的掃描轉(zhuǎn)換要在光柵網(wǎng)格中挑選出最靠近圓周的像素.當(dāng)圓心在圓點(diǎn)時(shí),圓方程為x2+y2=r2,可以得到最直接的掃描轉(zhuǎn)換算法是:令x以單位步長(zhǎng)從0增加至r,每步用解出y,再將y舍入到最接近的整數(shù),就可以得到14圓周.這個(gè)算法中有乘方和開(kāi)方運(yùn)算,效率不高.并且在x接近r時(shí),圓周上計(jì)算求得的點(diǎn)
38、間隔較大.也可以讓x以單位步長(zhǎng)從0增加至,用同樣的方法計(jì)算y,就可以得到18圓周.圖3-5 八個(gè)對(duì)稱(chēng)點(diǎn)畫(huà)圓圓心位于原點(diǎn)的圓有四條對(duì)稱(chēng)軸x=0, y=0, x=y和x=-y.若已知圓弧上一點(diǎn)(x, y),可以得到其關(guān)于四條對(duì)稱(chēng)軸的其它7個(gè)點(diǎn),他們分別是:(x, -y)、(-x, y)、(-x, -y)、(y, x)、(y, -x)、(-y, x)和(-y, -x).這種性質(zhì)稱(chēng)為八對(duì)稱(chēng)性.因此,只要掃描轉(zhuǎn)換八分之一圓弧,就可以求出整個(gè)圓弧的像素集.如圖3-5.3.2.2 中點(diǎn)畫(huà)圓算法我們來(lái)討論如何從點(diǎn)(0,R)至的1/8圓周順時(shí)針地確定最佳逼近于圓弧的像素序列.假定橫坐標(biāo)為xi的像素中與該圓弧最近
39、者己確定,為P(xi, yi)素只能是正右方點(diǎn)P1(xi +1, yi)和點(diǎn)P(xi+1, yi+1)中兩者之一,如圖3-6所示.構(gòu)造圓函數(shù)為: (3-13)對(duì)于圓上的點(diǎn)(x, y),F(xiàn)(x, y)=0;對(duì)于圓外的點(diǎn)(x, y), F(x, y)>0;對(duì)于圓內(nèi)的點(diǎn)(x, y), F(x, y)<0 .P(xi , yi)MP2(xi +1, yi-1)圖3-6 中點(diǎn)畫(huà)圓算法中當(dāng)前像素與下一像素的候選關(guān)系與中點(diǎn)畫(huà)線法一樣,構(gòu)造判別式: (3-14)若 則應(yīng)取P1為下一像素,再下一像素的判別式為:(3-15)若, 則應(yīng)取P2為下一像素,而且下一像素的判別式為:(3-16)這里討論的是按
40、順時(shí)針?lè)较蛏傻诙€(gè)八分圓.則第一個(gè)像素是(0,R),判別式d的初始值為: (3-17)現(xiàn)在我們已經(jīng)得到了一個(gè)畫(huà)圓的增量算法,但考慮到判別式的初值d0中有浮點(diǎn)數(shù)將一直參與算法運(yùn)算.為了將浮點(diǎn)算法化為整數(shù)算法,令ei=di - 0.25代替di.此時(shí),di<0等同于ei<-0.25, di>0等同于ei-0.25. 同時(shí)考慮到初始值e0=1-R是整數(shù),且e的每一次迭代變量也為整數(shù),所以ei<-0.25等價(jià)于ei<0;ei-0.25等價(jià)于ei0.歸納中點(diǎn)畫(huà)圓算法,判別條件為:如果ei<0,則下以像素應(yīng)取P1, e的增量為2xi+3;如果ei0,則下一像素應(yīng)取P2
41、, e的增量為2xi-2yi+5;將e改寫(xiě)為d,就可以得到中點(diǎn)畫(huà)圓算法:上述算法只包含了整數(shù)運(yùn)算,其中的乘法可以用移位來(lái)完成,基本達(dá)到圖形轉(zhuǎn)換掃描的要求.然而算法還有可能進(jìn)一步改進(jìn),提高運(yùn)算效率.在此請(qǐng)注意判別式的增量是x、y的線性函數(shù).3.2.3 Bresenham畫(huà)圓算法本節(jié)要介紹的Bresenham畫(huà)圓算法是一種最常用的有效算法,為了保持與前幾節(jié)的一致,并不失一般性,同樣假定圓心在原點(diǎn),考慮第一象限的八分之一圓,取(0,R)為起點(diǎn),按順時(shí)針?lè)较虍?huà)之間的圓弧.圖3-7 Bresenham畫(huà)圓算法中候選像素如圖3-7所示,設(shè)Pi(xi, yi)是已經(jīng)選取的一個(gè)像素點(diǎn),根據(jù)這段圓的特點(diǎn),可以判
42、定下一個(gè)像素將從Hi(xi+1, yi)和Di(xi+1, yi-1)兩點(diǎn)中選取.Bresenham畫(huà)圓算法的基本思想是在算法的每一步都選擇距離圓周最近的點(diǎn).因此分別計(jì)算Hi(xi+1, yi)和Di(xi+1, yi-1)到圓周的距離.引入判別式由此判斷di的符號(hào)可以選擇像素.如果di0,則應(yīng)選取Di; 如果di0,則應(yīng)選取Hi,由于判別式中涉及絕對(duì)值的計(jì)算,效率非常低,因此需要簡(jiǎn)化判別式的計(jì)算.分析當(dāng)一個(gè)像素被選定后圓的走向,圓的走向有5種如圖(3-8 )的情況,它們分別是:DiPiHi圖3-8 5種圓走向的情況 Hi和Di在圓內(nèi); Hi在圓上,Di在圓內(nèi); Hi在圓外,Di在圓內(nèi); Hi
43、在圓外,Di在圓上; Hi在圓外,Di在圓外;分析情況,因?yàn)镠i在圓外,Di在圓內(nèi),所以(Hi)>0,(Di)<0將判別式改寫(xiě)為:如果di0 選擇Di; 如果di<0 選擇Hi;分析情況 , 通過(guò)圖上分析,應(yīng)選擇Hi.注意到由于情況 表示Hi在圓內(nèi)或在圓上,Di在圓內(nèi),所以,(Hi)0,(Di)>0, 可以將上式作為判別式, 分析情況時(shí)的判別條件同樣適用.分析情況 , 通過(guò)圖上分析,應(yīng)選擇Di.此時(shí)Hi在圓外,Di在圓外或在圓上;所以,(Hi)>0,(Di)0, 同樣滿足判別式的判別條件;所以我們選用 作為整個(gè)算法的判別式.下面我們用增量遞推得方法,簡(jiǎn)化di的計(jì)算
44、(3-18)如果di<0,應(yīng)選擇Hi,則下一點(diǎn)(xi+1,yi)的判別式是(3-19) 如果di>0,應(yīng)選擇Di,則下一點(diǎn) ( xi+1,yi-1)的判別式是(3-20)對(duì)于初值d0, x0=0, y0=R, d0的計(jì)算是:(3-21)到此,我們已經(jīng)得到了完整的基于整數(shù)的Bresenham畫(huà)圓算法.3.3 填充技術(shù)在圖形學(xué)的應(yīng)用中,常常需要在指定的區(qū)域內(nèi)填充上某種顏色或圖案,一個(gè)封閉區(qū)域確定以后,填充要解決的問(wèn)題是如何確定填充的像素以及如何高效地填充.3.3.1 種子填充算法區(qū)域的定義有兩種,一種是區(qū)域采用邊界定義,即區(qū)域邊界上所有像素均具有某個(gè)特定值,區(qū)域內(nèi)部所有像素均不取這一特
45、定值,而邊界外的像素則可具有與邊界相同的值;另一種是區(qū)域內(nèi)的像素用同一種顏色表示.在許多填充算法中,種子填充法是一種比較直觀簡(jiǎn)單的方法,基本的思想是在一個(gè)封閉區(qū)域內(nèi)部有一已知像素,由此出發(fā)通過(guò)某種方法找到區(qū)域內(nèi)的所有像素.在討論種子填充算法前,先討論區(qū)域的連通性.區(qū)域的連通性是指從區(qū)域上一點(diǎn)出發(fā),通過(guò)幾個(gè)方向移動(dòng)的組合,在不越出區(qū)域的前提下,到達(dá)區(qū)域的任意像素.區(qū)域可以分為四向連通區(qū)域和八向連通區(qū)域兩種:四向連通區(qū)域指的是從區(qū)域上一點(diǎn)出發(fā),可通過(guò)四個(gè)方向,即上、下、左、右移動(dòng)的組合,到達(dá)區(qū)域的任意像素;八向連通區(qū)域指的是從區(qū)域內(nèi)每一個(gè)像素,可通過(guò)八個(gè)方向,即上、下、左、右、左上、右上、左下、右
46、下這八個(gè)方向的移動(dòng)的組合來(lái)到達(dá).圖3-9 左圖為四向連通區(qū)域,右圖為八向連通區(qū)域種子填充法要求被填充區(qū)域是連通的,只有在連通區(qū)域內(nèi),才有可能將區(qū)域內(nèi)的一點(diǎn)擴(kuò)散到區(qū)域內(nèi)的其它像素.種子填充法中允許從四個(gè)方向?qū)ふ蚁乱幌袼氐?,稱(chēng)為四向算法;允許從八個(gè)方向探索下一像素的,稱(chēng)為八向算法.八向算法可以填充八向連通區(qū)域,也可以填充四向連通區(qū)域.但四向算法只能填充四向連通區(qū)域,而不能填充八向連通區(qū)域.如果圖3-9中右邊的是一個(gè)八向連通區(qū)域,按四向連通區(qū)域則是兩個(gè)分離的區(qū)域,用四向算法可以將兩個(gè)區(qū)域填成不同的顏色,而用八向算法會(huì)使兩個(gè)區(qū)域填上同一顏色.以下我們只討論四向算法.只要把搜索方向從四個(gè)改變成八個(gè),即可
47、得到八向算法.簡(jiǎn)單的種子填充算法可以采用遞歸算法.遞歸的基本方法是設(shè)種子像素為(x,y)是四向連通區(qū)域內(nèi)的一點(diǎn),old_color為區(qū)域內(nèi)的原有像素的顏色,new_color是要填充的顏色,遞歸填充的過(guò)程是如果種子像素是區(qū)域內(nèi)原有顏色old_color,說(shuō)明該種子像素在區(qū)域內(nèi),則將像素置為被填充顏色new_color,同時(shí)將種子像素的上、下、左、右像素當(dāng)作種子遞歸調(diào)用填充遞歸算法;否則說(shuō)明該像素已被填充,不再處理. 3.3.2掃描線填充算法遞歸算法的原理和程序都很簡(jiǎn)單,但由于多次遞歸,費(fèi)時(shí)、費(fèi)內(nèi)存,計(jì)算機(jī)的效率將非常低.因此可以使用棧結(jié)構(gòu)來(lái)實(shí)現(xiàn)簡(jiǎn)單的種子填充算法.算法原理如下:種子像素入棧;當(dāng)
48、棧非空時(shí)重復(fù)執(zhí)行如下三步操作:(1) 找頂像素出棧;(2) 將出棧像素置成填充色;(3) 按某一個(gè)順序如左、上、右、下檢查與出棧像素相鄰的四個(gè)像素,若其中某個(gè)像素還是區(qū)域中原有顏色,或不為邊界,則把該像素入棧.如圖3-10所示,像素1到9 是一個(gè)區(qū)域,具有同一種顏色.用簡(jiǎn)單的種子填充算法對(duì)該區(qū)域進(jìn)行填充,如圖3-11表示了像素的入棧和出棧順序和棧的變化.最下面一行表示出棧順序,每一列表示棧的變化情況.從中看到有些像素反復(fù)出現(xiàn),說(shuō)明它們被重復(fù)入棧,也就重復(fù)出棧時(shí)需要判斷后決定是否填充.這一方面降低了算法的效率,另一方面還要求很大的存儲(chǔ)空間以實(shí)現(xiàn)棧結(jié)構(gòu),改進(jìn)的方法是掃描線填充算法,基本思想是在任意
49、一個(gè)掃描線與邊界的相交區(qū)間(含若干個(gè)連續(xù)像素)中,只取一個(gè)種子像素,一次填充操作針對(duì)區(qū)域內(nèi)掃描線上連續(xù)的像素.算法原理如下.54312S11698圖3-10 種子填充圖3-11 種子填充(堆棧)種子像素入棧;當(dāng)棧非空時(shí)作如下四步操作:(1) 棧頂像素出棧;(2) 沿掃描線對(duì)出棧像素的左右像素進(jìn)行填充,直至遇到邊界像素為止,即每出棧一個(gè)像素,就對(duì)包含該像素的整個(gè)區(qū)間進(jìn)行填充;(3) 上述區(qū)間內(nèi)最左、右的像素分別記為xl 和xr ;(4) 在區(qū)間檢查與當(dāng)前掃描線相鄰的上下兩條掃描線的有關(guān)像素是否全為邊界像素或已填充的像素,若存在非邊界,未填充的像素,則把每一區(qū)間的最右像素取作種子像素入棧.3.4
50、Bezier曲線1962年,法國(guó)雷諾汽車(chē)公司的P.E.Bezier構(gòu)造了一種以逼近為基礎(chǔ)的參數(shù)曲線和曲面的設(shè)計(jì)方法,并用這種方法完成了一種稱(chēng)為UNISURF的曲線和曲面設(shè)計(jì)系統(tǒng).Bezier方將函數(shù)逼近同幾何表示結(jié)合起來(lái),使得設(shè)計(jì)師在計(jì)算機(jī)上就象使用作圖工具一樣得心應(yīng)手.Bezier曲線的形狀是通過(guò)一組多邊折線(特征多邊形)的各頂點(diǎn)唯一地定義出來(lái)的.在這組頂點(diǎn)中:(1) 只有第一個(gè)頂點(diǎn)和最后一個(gè)頂點(diǎn)在曲線上;(2) 其余的頂點(diǎn)則用于定義曲線的導(dǎo)數(shù)、階次和形狀;(3) 第一條邊和最后一條邊則表示了曲線在兩端點(diǎn)處的切線方向.3.4.1 Bezier曲線的定義Bezier曲線是由多項(xiàng)式混合函數(shù)推導(dǎo)出
51、來(lái)的,給定空間n+1個(gè)點(diǎn)的位置矢量Pi(i=0,1,2,n),則定義一個(gè) n次Bezier參數(shù)曲線,其各點(diǎn)坐標(biāo)的插值公式是:其中,Pi構(gòu)成該Bezier曲線的特征多邊形,BENi,n(t)是n次Bernstein基函數(shù).Bezier曲線如圖3-12所示:P2P2P0P1P3P1P0P3圖3-12 三次Bezier曲線Bernstein基函數(shù)具有如下形式:這里規(guī)定:00=1,0!=1.則t=0時(shí),k=0 ,BENk,n(t)=1,k0 ,BENk,n(t)=0.t=1時(shí),k=n ,BENk,n(t)=1,kn ,BENk,n(t)=0.(1) 一次Bezier曲線(n=1) n=1時(shí),有2個(gè)控制
52、點(diǎn)P0和P1,Bezier多項(xiàng)式是一次多項(xiàng)式:一次Bezier曲線是連接起點(diǎn)P0和終點(diǎn)P1的直線段.(2) 二次Bezier曲線(n=2)n=2時(shí),有3個(gè)控制點(diǎn)P0、P1和P2,Bezier多項(xiàng)式是二次多項(xiàng)式:二次Bezier曲線是一條拋物線,如下圖所示.P0PmP2P'(1/2)P(1/2)P1 圖3-13 二次Bezier曲線(3) 三次Bezier曲線(n=3) n=3時(shí),有4個(gè)控制點(diǎn)P0、P1、P2和P3,Bezier多項(xiàng)式是三次多項(xiàng)式:其中,它們是三次Bezier曲線的基函數(shù),它們均為三次曲線,任何三次Bezier曲線都是這4條曲線的線性組合.由于每個(gè)基函數(shù)的參數(shù)t在整個(gè)(0
53、,1)的開(kāi)區(qū)間內(nèi)不為零,使得Bezier曲線不可能對(duì)曲線的形狀進(jìn)行局部控制,如果改變?nèi)我豢刂泣c(diǎn)的位置,整個(gè)曲線受到影響.將三次Bezier曲線表示為矩陣形式:其中,Mbe是三次Bezier曲線的系數(shù)矩陣,為常數(shù),Gbe是4個(gè)控制點(diǎn)的位置矢量.3.4.2 Bezier曲線的離散生成要計(jì)算Bezier曲線上的點(diǎn),可用Bezier曲線方程,但使用de Casteljau提出的遞推算法則要簡(jiǎn)單的多.該算法把一個(gè)復(fù)雜的幾何計(jì)算問(wèn)題轉(zhuǎn)化為一系列的線性運(yùn)算,所以計(jì)算穩(wěn)定可靠,具有通用性,易于在計(jì)算機(jī)上實(shí)現(xiàn).下面用幾何作圖的過(guò)程來(lái)對(duì)該算法進(jìn)行說(shuō)明,如下圖所示.)3/1(30PP=011/30P1P2P3P10
54、P11P12P20P21P圖3-14 幾何作圖法求Bezier曲線已知控制點(diǎn),稱(chēng)為,構(gòu)成n條邊的控制多邊形.首先依次對(duì)控制多邊形進(jìn)行定比分割,分割比例為t:(1-t),得到第一級(jí)遞推的中間頂點(diǎn).然后再對(duì)這些中間頂點(diǎn)構(gòu)成的控制多邊形進(jìn)行同樣的定比分割,得到第二級(jí)遞推的中間頂點(diǎn).如此繼續(xù),直到n次分割得到中間頂點(diǎn),即為所求的Bezier曲線P(t).以上的遞推過(guò)程可以用公式表示為:de casteljau算法遞推出的呈直角三角形,對(duì)應(yīng)結(jié)果下圖所示.從左向右遞推,最右邊點(diǎn)即為曲線上的點(diǎn). 0P1P2P3P10P11P12P20P21P30P圖3-15 Bezier曲線的遞推過(guò)程第4章 界面設(shè)計(jì)與編碼4.1 界面設(shè)計(jì)4.1.1 主界面本程序主窗體采用Visua
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省內(nèi)江市2023-2024學(xué)年高三三模英語(yǔ)試題
- 2019-2025年中國(guó)谷物及谷物粉市場(chǎng)前景預(yù)測(cè)及投資規(guī)劃研究報(bào)告
- 【可行性報(bào)告】2024年高純超細(xì)石英粉相關(guān)行業(yè)可行性分析報(bào)告
- 煤化工有限責(zé)任公司年產(chǎn)46萬(wàn)噸合成氨80萬(wàn)噸尿素工程環(huán)評(píng)報(bào)告
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專(zhuān)項(xiàng)練習(xí)集錦
- 海鰻養(yǎng)殖知識(shí)培訓(xùn)課件
- 中醫(yī)藥知識(shí)培訓(xùn)
- 車(chē)輛檢修工知識(shí)培訓(xùn)課件
- 春節(jié)購(gòu)房 壯志凌云
- 春分市場(chǎng)突圍
- 《論拒不執(zhí)行判決、裁定罪“執(zhí)行能力”之認(rèn)定》
- 工業(yè)設(shè)計(jì)基礎(chǔ)知識(shí)單選題100道及答案解析
- 山西省晉中市2023-2024學(xué)年高一上學(xué)期期末考試 化學(xué) 含解析
- 過(guò)程審核表(產(chǎn)品組評(píng)分矩陣評(píng)審提問(wèn)表(評(píng)分))-2024年百度過(guò)
- 操作手冊(cè)模板【范本模板】
- 2025年湖北省武漢市高考數(shù)學(xué)模擬試卷附答案解析
- 【工作總結(jié)】建筑中級(jí)職稱(chēng)專(zhuān)業(yè)技術(shù)工作總結(jié)
- 江蘇省2022年普通高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試題(考試版)
- 2023年二輪復(fù)習(xí)解答題專(zhuān)題三:一次函數(shù)的應(yīng)用方案選取型(原卷版+解析)
- 2024版小學(xué)英語(yǔ)新課程標(biāo)準(zhǔn)測(cè)試題及答案
- 2024年村級(jí)意識(shí)形態(tài)工作計(jì)劃
評(píng)論
0/150
提交評(píng)論