




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
(雍俊海)JAVA程序設(shè)計(jì)教程-第2版-課后答案LtD第一章:P561、列出在你過(guò)去學(xué)習(xí)工作中用過(guò)與計(jì)算機(jī)圖形學(xué)有關(guān)的程序c語(yǔ)言:#include<graphics.h>main(){intgraphdriver=VGA,graphmode=VGAHI;initgraph(&graphdriver,&graphmode,””);setbkcolor(BLUE);setcolor(WHITE);setfillstyle(1,LIGHTRED);bar3d(100,200,400,350,100,1);floodfill(450,300,WHITE);floodfill(250,450,WHITE);setcolor(LIGHTGREEN);rectangle(450,400,500,450);floodfill(470,420,LIGHTGREEN);getch();closegraph();}可顯示“圖像”菜單:3、列出你所用過(guò)的圖形輸入、顯示及輸出設(shè)備的名稱、型號(hào)、生產(chǎn)廠商、出廠時(shí)間及其主要優(yōu)缺點(diǎn)。略4、比較個(gè)人計(jì)算機(jī)與工作站的圖形功能個(gè)人計(jì)算機(jī)僅限于符合二維,又是單任務(wù)操作方式工作站可處理二、三維,多任務(wù)操作方式區(qū)別個(gè)人計(jì)算機(jī)工作站顯示分別率640X4801024X900以上具有8個(gè)以上位面顯示器尺寸12~14英寸16、19、27英寸圖形處理能力符號(hào)或二維具有反走樣、線和面消隱、光照模型等處理硬件;同時(shí)還具有豐富的圖形生成和處理軟件主要處理二維或三維圖形、圖象計(jì)算機(jī)性能主要取決于微處理器的性具有更強(qiáng)的處理功能,在操能作系統(tǒng)、頁(yè)面虛擬存儲(chǔ)器和主要用途都有所不同操作方式單任務(wù)多任務(wù)、多進(jìn)程l個(gè)人計(jì)算機(jī)的主要功能是字符處理,而工作站不僅有字符處理功能,還有較強(qiáng)的圖形處理功能l個(gè)人計(jì)算機(jī)的顯示分辨率較小,一般在640X480的圖形處理符號(hào)或二維圖形;而工作站為了滿足強(qiáng)大的圖形處理,顯示分辨率為一般為1024x1024的二維或三維圖形l個(gè)人計(jì)算機(jī)的顯示器相對(duì)工作站較小l個(gè)人計(jì)算機(jī)的圖形系統(tǒng)是由個(gè)人計(jì)算機(jī)加上圖形輸入輸出設(shè)備和有關(guān)的圖形支撐軟件集成起來(lái)的系統(tǒng),其性能取決于個(gè)人計(jì)算機(jī)所采用的微處理器芯片,個(gè)人計(jì)算機(jī)的圖形功能由于受到軟件和硬件的限制,只適合處理比較簡(jiǎn)單的事情;個(gè)人計(jì)算機(jī)的顯示分辨率一般在640X480的圖形處理符號(hào)或二維圖形l而工作站在處理器、總線設(shè)計(jì)、存儲(chǔ)器、操作系統(tǒng)等多個(gè)方面都有比個(gè)人計(jì)算機(jī)優(yōu)越的地方,它配有專業(yè)的圖形輸入輸出設(shè)備,并配有圖形處理器以處理大量的復(fù)雜的圖形運(yùn)算;它可以處理多任務(wù)進(jìn)程、處理顯示分辨率為1024x1024的二維或三維圖形、具有高速的科學(xué)計(jì)算能力、豐富的圖形處理、靈活的窗口及網(wǎng)絡(luò)管理功能的交互式計(jì)算機(jī)系統(tǒng),它的圖形功能比個(gè)人計(jì)算機(jī)圖形系統(tǒng)強(qiáng)德多,但在造價(jià)上遠(yuǎn)高于個(gè)人計(jì)算機(jī)。6、具有相同分辨率的彩色光柵顯示器與黑白光柵在結(jié)構(gòu)上有何區(qū)別?彩色:對(duì)于紅、綠、藍(lán)的三個(gè)原色有三個(gè)位面的幀緩存和三個(gè)電子槍,每個(gè)位面的幀緩沖對(duì)應(yīng)一個(gè)電子槍即對(duì)應(yīng)一種顏色;對(duì)每個(gè)顏色的電子槍可以通過(guò)增加幀緩存位面來(lái)提高顏色種類和灰度級(jí),通過(guò)三種原色的組合可以產(chǎn)生不同種類的顏色。彩色光柵顯示器主要是有紅、綠、藍(lán)的三個(gè)原色所組成,每種原色電子槍有8個(gè)位面的幀緩存和8位的數(shù)模轉(zhuǎn)換器,每種原色有256種亮度,三種原色組合可為16771216種顏色,也可以通過(guò)顏色查找表查找,故幀緩存位數(shù)至少24位。黑白:黑白光柵顯示器的幀緩存是一塊連續(xù)的計(jì)算機(jī)存儲(chǔ)器,每個(gè)像素需1位存儲(chǔ)器,每個(gè)存儲(chǔ)器只有0或1兩個(gè)狀態(tài)。因此一個(gè)位面的幀緩存只能產(chǎn)生黑白圖形??梢栽黾酉笏攸c(diǎn)的位面數(shù),通過(guò)多個(gè)位面顯示出多種灰度級(jí)。7、在光柵顯示器上顯示斜線的45o角時(shí)常會(huì)發(fā)生鋸齒狀,請(qǐng)考慮減少鋸齒狀效果的各種方法并說(shuō)明采用這些方法的代價(jià)。在光柵圖形顯示器上顯示斜線時(shí)常會(huì)發(fā)生鋸齒,這是由于直線或多邊形邊界在光柵圖形顯示器的對(duì)應(yīng)圖形都是由一系列相同亮度的離散象素構(gòu)成的。這種用離散量表示連續(xù)亮引起的失真稱為走樣,而用于減少或消除這種效果的技術(shù),稱為反走樣。一般而言,減少鋸齒有三種方法,下面以直線掃描轉(zhuǎn)換為例,分別介紹三種方法:(1)提高分辨率假設(shè)把顯示器的分辨率提高一倍,雖然直線經(jīng)過(guò)2倍的象素,鋸齒也會(huì)增加一倍。但由于每個(gè)鋸齒在X方向和Y方向都只有低分辨率的一半,所以效果看起來(lái)會(huì)好一些,這種改進(jìn)方法是以4倍的存儲(chǔ)器代價(jià)和4倍的掃描轉(zhuǎn)換時(shí)間獲得的。因此增加分辨率是不經(jīng)濟(jì)的方法,它只能減輕,不能消除鋸齒。(2)簡(jiǎn)單的區(qū)域取樣在直線掃描算法假定象素是數(shù)學(xué)上的一個(gè)點(diǎn),象素的顏色是由對(duì)應(yīng)于象素中心的圖形中一點(diǎn)的顏色決定的。但是,實(shí)際上象素不是一個(gè)點(diǎn),而是一個(gè)有限區(qū)域。屏幕上所畫的直線段不是數(shù)學(xué)意義上的無(wú)寬度的理想線段,而是一個(gè)寬度至少為一個(gè)象素單位的線條。因此,把屏幕上的直線看成是長(zhǎng)方條形更為合理。在繪制直線條時(shí),所有與該長(zhǎng)方條相交的象素都采用適當(dāng)?shù)膶挾冉o予顯示。這要求顯示器各象素可以用多灰度顯示。例,設(shè)象素中心是在網(wǎng)格點(diǎn)上的不相交的正方形,象素的灰度與它落在直線條內(nèi)的面積成正比。在多灰度黑白顯示器上,若一個(gè)象素整個(gè)落在線條上,則將它置成前景色。若一個(gè)象素與線條部分相交,根據(jù)相交部分的大小來(lái)選擇不同的灰度,相交部分大的象素前景色成分更多一些,相交部分小的象素前景色成分更少一些。這種方法將產(chǎn)生模糊的邊界,以此來(lái)減輕鋸齒效應(yīng)。在實(shí)際應(yīng)用中,常采用盒式濾波器(3)加權(quán)區(qū)域取樣加權(quán)區(qū)域取樣方法采用更為優(yōu)化的圓錐形濾波器。圓錐的底圓中心在當(dāng)前象素中心,底圓半徑為一個(gè)單位,錐高為1。當(dāng)直線條經(jīng)過(guò)該象素時(shí),該象素的灰度值是在二者相交區(qū)域上對(duì)濾波器進(jìn)行積分的積分值。用這種圓錐形濾波器有如下特點(diǎn):一是接近理想直線的象素將被分配更多的灰度值。二是相鄰兩個(gè)象素的濾波器相交,所以直線條經(jīng)過(guò)該相交區(qū)域時(shí),將對(duì)這兩個(gè)象素分配給適當(dāng)?shù)幕叶戎?,這有利于縮小直線條上相鄰象素的灰度差。第二章:P1281、為什么要制定和采用計(jì)算機(jī)圖形標(biāo)準(zhǔn)?已經(jīng)ISO批準(zhǔn)的計(jì)算機(jī)圖形標(biāo)準(zhǔn)軟件有哪些?為了提高計(jì)算機(jī)圖形軟件、計(jì)算機(jī)圖形的應(yīng)用軟件以及相關(guān)軟件的編程人員在不同的計(jì)算機(jī)和圖形設(shè)備之間的可移植性。已獲ISO批準(zhǔn)的計(jì)算機(jī)圖形標(biāo)準(zhǔn)軟件有:l計(jì)算機(jī)圖形核心系統(tǒng)(GKS)及其語(yǔ)言聯(lián)編l程序員層次交互式圖形系統(tǒng)(PHIGS)及其語(yǔ)言聯(lián)編l三維圖形核心系統(tǒng)(GKS-3D)及其語(yǔ)言聯(lián)編l計(jì)算機(jī)圖形元文件(CGM)l計(jì)算機(jī)圖形接口(CGI)l基本圖形轉(zhuǎn)換規(guī)范(IGES)l產(chǎn)品數(shù)據(jù)轉(zhuǎn)換規(guī)范(STEP)等2、CGI標(biāo)準(zhǔn)的主要功能是什么?試用CGI中的圖形輸出功能繪制一副機(jī)械零件圖。CGI的目的是提供控制圖形硬件的一種與設(shè)備無(wú)關(guān)的方法,它可以看成是圖形設(shè)備驅(qū)動(dòng)程序的一種標(biāo)準(zhǔn)。CGI在用戶程序和虛擬設(shè)備之間,以一種獨(dú)立于設(shè)備的方式提供圖形信息的描述和通信,使有經(jīng)驗(yàn)的用戶最大限度地、靈活地直接控制圖形設(shè)備。它所提供的功能集包括:l控制功能集l獨(dú)立于設(shè)備的圖形對(duì)象輸出功能集l圖段功能集l輸入和應(yīng)答功能集l產(chǎn)生修改、檢索和顯示以像素?cái)?shù)據(jù)形式存儲(chǔ)的光柵功能集3、CGM對(duì)文件管理的存儲(chǔ)結(jié)構(gòu)是采用何種形式?你認(rèn)為應(yīng)用這種結(jié)構(gòu)有什么優(yōu)缺點(diǎn)?采用生成多個(gè)與設(shè)備無(wú)關(guān)的圖形定義,提供隨機(jī)存取、傳送、簡(jiǎn)潔定義圖象的圖形生成元文件的存儲(chǔ)結(jié)構(gòu),它不是應(yīng)用程序員的標(biāo)準(zhǔn),而是為系統(tǒng)和系統(tǒng)開(kāi)發(fā)而設(shè)計(jì)的,與CGI配套供用戶使用。優(yōu)點(diǎn)是:它具有通用性,即CGM應(yīng)能廣泛適應(yīng)各種設(shè)備、應(yīng)用系統(tǒng)。例如同一個(gè)文件即可在低分辯率的單色圖形終端上輸出,也可在高分辨率的多筆繪圖儀上輸出,或在高性能的光柵圖形顯示器上輸出。這種結(jié)構(gòu)的缺點(diǎn)是:它只是一個(gè)靜態(tài)的圖形生成元文件,即它不能產(chǎn)生和定義圖形的動(dòng)態(tài)效果,例如不能實(shí)現(xiàn)動(dòng)態(tài)的幾何變換。4、GKS、PHIGS、GI在應(yīng)用程序中起的作用?試比較它們?cè)谳斎胼敵龉δ苌系南嗤筒煌??GKS在應(yīng)用程序和圖形輸入輸出設(shè)備之間提供了功能接口,包括:控制功能、輸出功能、輸出屬性、變換功能、圖段功能、輸入功能、詢問(wèn)功能、實(shí)用程序、元文件處理和出錯(cuò)處理。PHIGS向應(yīng)用程序提供控制圖形設(shè)備的圖形系統(tǒng)接口,能夠在系統(tǒng)中高效率地描述應(yīng)用模型,迅速地修改圖形模型的數(shù)據(jù);并能夠繪制顯示修改后的圖形模型。GL是工作站或UNIX上廣泛應(yīng)用的一個(gè)工業(yè)標(biāo)準(zhǔn)圖形程序庫(kù),和PHIGS同樣是提供用戶與程序圖形系統(tǒng)接口。包括基本圖素、坐標(biāo)變換、設(shè)置屬性和顯示方式、輸入/輸出處理、真實(shí)圖形顯示。相同點(diǎn):三個(gè)都是提供用戶與輸入輸出設(shè)備之間的圖形系統(tǒng)接口的標(biāo)準(zhǔn)圖形程序庫(kù)。不同點(diǎn):不同的數(shù)據(jù)結(jié)構(gòu)可修改性屬性的存儲(chǔ)輸出流水線等具體而言:lGKS有6種輸入功能和6種輸出圖素,在輸入功能上可對(duì)各種設(shè)備初始化,設(shè)定設(shè)備工作方式、確定請(qǐng)求采樣和事件輸入;在輸出功能上,可確定輸出圖形的類型lPHIGS的輸出流水線有5個(gè)坐標(biāo)系;具有高度的動(dòng)態(tài)性、輸出交互性的三維圖形,可以在系統(tǒng)中高效率地描述應(yīng)用模型,迅速修改圖形模型的數(shù)據(jù),并能繪制顯示修改后的圖形模型lGL的輸入/輸出處理用于啟動(dòng)輸入輸出設(shè)備,并對(duì)相應(yīng)的事件隊(duì)列進(jìn)行處理,提供了更豐富的圖元,如各種曲面。6、GKS-3D與PHIGS的主要區(qū)別是什么?用GKS-3D輸出圖形的過(guò)程是什么?主要區(qū)別:(1)數(shù)據(jù)結(jié)構(gòu)GKS-3D:提供了單層、平面的圖形數(shù)據(jù)結(jié)構(gòu)其圖段用來(lái)表示的是圖象信息而不是圖形的構(gòu)造信息,其圖段數(shù)據(jù)經(jīng)過(guò)坐標(biāo)規(guī)格化變換后,不再是定義該圖段的坐標(biāo)空間的數(shù)據(jù)PHIGS:其結(jié)構(gòu)始終是在造型空間中定義的數(shù)據(jù)(2)可修改性GKS-3D:產(chǎn)生的圖段,其內(nèi)容不能修改,但影響圖段整體特征的某些屬性,如可見(jiàn)性、可檢測(cè)性、圖段的幾何變換等是可以修改PHIGS:其任何結(jié)構(gòu),結(jié)構(gòu)中的任何一部分元素則可以在任何時(shí)候進(jìn)行修改(3)屬性的存儲(chǔ)GKS-3D:把圖素屬性和圖素一起存入圖形數(shù)據(jù)結(jié)構(gòu)中,為了修改某圖段中某個(gè)圖素的屬性,必須去除該圖素的舊屬性,重新生成一個(gè)新屬性PHIGS:只要當(dāng)遍歷一個(gè)結(jié)構(gòu)并要顯示該結(jié)構(gòu)時(shí),其中的圖素才能變成輸出圖素,此時(shí),那些屬性結(jié)構(gòu)元素是靈活的,圖形數(shù)據(jù)的修改也是容易的。(4)輸出流水線GKS-3D:采用三種坐標(biāo)系,用戶坐標(biāo)系、設(shè)備坐標(biāo)系和規(guī)格化設(shè)備坐標(biāo)系PHIGS:采用五種坐標(biāo)系,造型坐標(biāo)系、用戶坐標(biāo)系、觀察坐標(biāo)系、規(guī)格化的投影(空間)坐標(biāo)系、設(shè)備坐標(biāo)系過(guò)程:圖素→規(guī)格化變換→圖段變換→規(guī)格化裁減→視圖變換→裁減操作和視圖映象→工作站裁剪和變換→顯示輸出10、IGES和STEP有什么共同點(diǎn)和不同點(diǎn)?共同點(diǎn):IGES和STEP都是與CAD/CAM系統(tǒng)提供中性產(chǎn)品數(shù)據(jù)的公共資源和應(yīng)用模型,它涉及到土建工程、機(jī)械、結(jié)構(gòu)、電氣、電子工程及船舶結(jié)構(gòu)等領(lǐng)域,為了解決數(shù)據(jù)在不同的CAD/CAM系統(tǒng)之間進(jìn)行數(shù)據(jù)傳送的問(wèn)題,定義了一套表示CAD/CAM系統(tǒng)中常用的幾何和非幾何數(shù)據(jù)格式以及相應(yīng)的文件結(jié)構(gòu)。不同點(diǎn):IGES是1982年ANSI標(biāo)準(zhǔn),而STEP是ISO/IECJTCL下的SC4開(kāi)發(fā)的ISO標(biāo)準(zhǔn),它克服了IGES的一些缺點(diǎn):(1)不能精確地完整地轉(zhuǎn)換數(shù)據(jù),其原因是不同的CAD/CAM系統(tǒng)之間許多概念不一樣,使得某些定義數(shù)據(jù)像表面定義數(shù)據(jù)會(huì)丟失(2)不能轉(zhuǎn)換屬性信息(3)層信息常丟失(4)不能把兩個(gè)零部件的信息放在一個(gè)文件中(5)產(chǎn)生的數(shù)據(jù)量太大,以至許多CAD系統(tǒng)難以處理(無(wú)論是時(shí)間還是存儲(chǔ)容量上都不適應(yīng))(6)在轉(zhuǎn)換數(shù)據(jù)的過(guò)程發(fā)生的錯(cuò)誤很難確定,常常需要人工去處理IGES文件,對(duì)此要花費(fèi)大量的時(shí)間和精力。而STEP克服了IGES中存在的問(wèn)題,擴(kuò)大了轉(zhuǎn)換CAD/CAM系統(tǒng)中幾何拓?fù)鋽?shù)據(jù)的范圍,STEP即產(chǎn)品模型數(shù)據(jù)的公共資源和應(yīng)用模型。STEP的產(chǎn)品模型數(shù)據(jù)是覆蓋產(chǎn)品整個(gè)生命周期的應(yīng)用而全面定義的產(chǎn)品所有數(shù)據(jù)元。在STEP中采用了形狀特征信息模型進(jìn)行各種產(chǎn)品模型定義數(shù)據(jù)的轉(zhuǎn)換,強(qiáng)調(diào)建立能存入數(shù)據(jù)庫(kù)中的一個(gè)產(chǎn)品模型的完整表示,而不只是它的圖形或可視的表示IGES采用了對(duì)實(shí)體單元進(jìn)行數(shù)據(jù)描述的文件結(jié)構(gòu),而STEP采用了形狀特征信息模型進(jìn)行各種產(chǎn)品模型定義數(shù)據(jù)的轉(zhuǎn)換的概念模式;IGES的文件格式為目錄入口、參數(shù)節(jié)、整體節(jié)、結(jié)束節(jié)和定義信息5個(gè)節(jié);STEP的產(chǎn)品信息分為應(yīng)用層、邏輯層和物理層3個(gè)層結(jié)構(gòu)。第三章:P1631、你所用的圖形軟件是屬于子程序庫(kù)、專業(yè)語(yǔ)言和交互命令,還是這三種形式的混合形式,或是其他的形式。你認(rèn)為你所用的圖形軟件的成功和不足之處是什么?有哪些改進(jìn)意見(jiàn)?(1)使用的圖形軟件采用C語(yǔ)言作為主語(yǔ)言,屬于子程序庫(kù)、專用語(yǔ)言和交互命令混合;(2)成功之處:使用方便、便于擴(kuò)充、便于用戶加入用戶自己編寫的源程序或目標(biāo)代碼;不足之處是格式隨所用主語(yǔ)言格式而定,修改源程序比較麻煩;(3)實(shí)現(xiàn)與其他語(yǔ)言(非主語(yǔ)言)的兼容運(yùn)行,交互式修改運(yùn)行結(jié)果,而不需要人為地查看、修改源程序。2、面向應(yīng)用程序的接口通常有哪幾種形式?你認(rèn)為哪一種形式更方便應(yīng)用和擴(kuò)充應(yīng)用功能?面向應(yīng)用程序的接口有子程序庫(kù)、專用語(yǔ)言和交互命令三種形式;交互任務(wù)是用戶最關(guān)注的事,交互技術(shù)是完成交互任務(wù)的手段,故交互命令是用戶接口中應(yīng)用最普遍、效率最高的一種形式,對(duì)交互設(shè)備、交互任務(wù)、交互技術(shù)以及控制方式等的綜合處理是完成交互命令和實(shí)現(xiàn)交互命令的依據(jù)。總的來(lái)說(shuō),交互命令更方便應(yīng)用和擴(kuò)充應(yīng)用功能。3、請(qǐng)列出你所用的交互系統(tǒng)中所涉及到的交互任務(wù)和交互技術(shù),是否有本章書中沒(méi)有提及的交互任務(wù)和交互技術(shù)?若有,能否對(duì)其進(jìn)行分解,使之和本章書中介紹的交互任務(wù)和交互技術(shù)相匹配。就目前有用過(guò)的交互任務(wù)和交互技術(shù)而言,均在本章范圍內(nèi);(1)交互任務(wù):區(qū)域選擇、文本輸入、定路徑和控制(2)交互技術(shù):選擇技術(shù)、定位技術(shù)、定路徑技術(shù)、文本技術(shù)、徒手畫技術(shù)和拖動(dòng)技術(shù)。6、常見(jiàn)的交互任務(wù)有哪幾種?你認(rèn)為哪一種交互任務(wù)最難完成?常見(jiàn)的交互任務(wù)有8種定位、選擇、文本、定向、定路徑、定量、三維交互任務(wù)、組合交互任務(wù)其中三維交互任務(wù)和組合交互任務(wù)最難完成,因?yàn)槿S交互任務(wù)涉及定位、選擇和旋轉(zhuǎn),用戶難以區(qū)分屏幕上游標(biāo)選擇到對(duì)象的深度值和其他顯示對(duì)象的深度值。組合交互任務(wù)主要包含對(duì)話框、構(gòu)造和動(dòng)態(tài)控制三種,其實(shí)現(xiàn)前面幾種的結(jié)合,是動(dòng)態(tài)的,故其完成難度最大。7、常見(jiàn)的交互技術(shù)有哪幾種?你認(rèn)為哪一種交互技術(shù)最容易使用?交互技術(shù)指通過(guò)計(jì)算機(jī)輸入、輸出設(shè)備,以有效的方式實(shí)現(xiàn)人與計(jì)算機(jī)對(duì)話的技術(shù)。它包括機(jī)器通過(guò)輸出或顯示設(shè)備給人提供大量有關(guān)信息及提示請(qǐng)示等,人通過(guò)輸入設(shè)備給機(jī)器輸入有關(guān)信息及提示請(qǐng)示等,人通過(guò)輸入設(shè)備給機(jī)器輸入有關(guān)信息,回答問(wèn)題等。人機(jī)交互技術(shù)是計(jì)算機(jī)用戶界面設(shè)計(jì)中的重要內(nèi)容之一。它與認(rèn)知學(xué)、人機(jī)工程學(xué)、心理學(xué)等學(xué)科領(lǐng)域有密切的聯(lián)系。常見(jiàn)的交互技術(shù)有:選擇技術(shù)、定位技術(shù)、定向技術(shù)、定路徑技術(shù)、定量技術(shù)、文本技術(shù)、橡皮筋技術(shù)、徒手畫技術(shù)、拖動(dòng)技術(shù);其中定量技術(shù)最容易使用。11、交互式用戶接口常見(jiàn)的工作方式有幾種?你認(rèn)為哪一種較實(shí)用?用戶接口工具箱使你能夠?yàn)槟愕膽?yīng)用程序建立復(fù)雜的用戶接口。用戶接口可以包括窗口、對(duì)話、菜單條、附件(域、列表框,等等)、標(biāo)記和公用對(duì)話(文件選擇對(duì)話、信息對(duì)話,等等)。用戶接口工具箱包括各種公用對(duì)話,例如選擇一個(gè)文件或顯示錯(cuò)誤信息的對(duì)話。為了使用一個(gè)公用的對(duì)話,只需簡(jiǎn)單地實(shí)例化它,設(shè)置合適的參數(shù),以及把它連接到你的應(yīng)用程序中。固定域輸入輸出方式問(wèn)答方式表處理方式命令語(yǔ)言菜單方式圖形符號(hào)方式12、請(qǐng)用菜單驅(qū)動(dòng)方式、數(shù)據(jù)表格驅(qū)動(dòng)方式和事件驅(qū)動(dòng)方式完成同一個(gè)實(shí)際的交互任務(wù)。并比較它們之間的難易程度和工作量。事件驅(qū)動(dòng)的真實(shí)工作過(guò)程數(shù)據(jù)表格驅(qū)動(dòng)方式:程序和表格關(guān)聯(lián),用表格(如EXCEL)的形式將變量傳遞到程序中進(jìn)行一系列操作,或再用表格輸出,不同于消息驅(qū)動(dòng)的WINDOWS程序機(jī)制。使用表格驅(qū)動(dòng)建立菜單,可以很方便很簡(jiǎn)單地管理自定義菜單,節(jié)約開(kāi)發(fā)與維護(hù)成本?!短窖蟊kU(xiǎn)終端系統(tǒng)》交易界面實(shí)現(xiàn)了參數(shù)化的配置方式,系統(tǒng)使用屏幕定義文件和表格定義文件來(lái)定義交易屏幕,表格定義文件定義了表格的基本屬性和表格的列,屏幕定義文件定義了屏幕的基本屬性和屏幕上的欄位和表格的位置。屏幕和表格定義文件都需要引用數(shù)據(jù)字典里面的欄位定義。界面驅(qū)動(dòng)包括屏幕驅(qū)動(dòng)和表格驅(qū)動(dòng),其功能包括設(shè)置欄位缺省值和缺省屬性(是否可輸入、是否必輸入、是否綁定下拉菜單pklist),響應(yīng)各種系統(tǒng)事件(屏幕前后事件、欄位前后事件、最后欄位后事件等),響應(yīng)熱鍵(ESC、DEL、PAGEUP、PAGEDOWN、CTRL_XX等),動(dòng)態(tài)改變屏幕屬性(多頁(yè)顯示的翻頁(yè)、拆分屏幕等),發(fā)起二段式交易等等。屏幕驅(qū)動(dòng)和表格驅(qū)動(dòng)是提供給開(kāi)發(fā)人員的統(tǒng)一接口,開(kāi)發(fā)人員通過(guò)實(shí)現(xiàn)該接口的方式開(kāi)發(fā)功能模塊。事件驅(qū)動(dòng)方式:1、啟動(dòng)應(yīng)用程序,裝載和顯示窗體,產(chǎn)生Form_Load和Form_Show事件2、窗體或窗體上的控件接收事件,事件可由用戶引發(fā)(例如鍵盤或鼠標(biāo)操作),可由系統(tǒng)引發(fā)(例如定時(shí)器事件),也可由代碼間接引發(fā)(例如當(dāng)代碼裝載其他窗體時(shí)產(chǎn)生的Load事件)3、如果在相應(yīng)的事件過(guò)程中存在代碼,就執(zhí)行代碼4、應(yīng)用程序等待下一次事件例:.獲取和修改計(jì)算機(jī)名字的方法1.)插入一個(gè)新模塊,在其中添加如下代碼:′聲明GetComputerNameDeclareFunctionGetComputerNameLib〃kernel32〃Alias〃GetComputerNameA〃(ByvallpBufferAsString,nSizeAsLong)AsLong′聲明SetComputerNameDeclareFunctionSetComputerNameLib〃kernel32〃Alias〃SetComputerNameA〃(ByvallpComputerNameAsString)AsLong′定義一個(gè)獲取計(jì)算機(jī)名字的函數(shù)PublicFunctionGetCName(CName)AsBooleanDimsComputerNameAsString?計(jì)算機(jī)的名字DimlComputerNameAsLong?計(jì)算機(jī)名字的長(zhǎng)度DimlResultAsLong?GetComputerName的返回值DimRVAsBoolean′GetCName返回值,若為TRUE則表示操作成功lComputerNameLen=256sComputerName=Space(lComputerNameLen)lResult=GetComputerName(sComputerName,lCompputerNameLen)IflResult〈〉0ThenCname=Left$(sComputerName,lComputerNameLen)RV=TrueElseRV=FalseEndIfGetCName=RVEndFunction′定義一個(gè)修改計(jì)算機(jī)名字的函數(shù)PublicFunctionSetCName(CName)AsBooleanDimlResultAsLongDimRVAsBooleanlResult=SetComputerName(CName)IflResult〈〉0ThenRV=True′修改成功ElseRV=FalseEndIfSetCName=RVEndFunction2).在窗體中添加一命令按鈕Command1,雙擊該按鈕并在其中添加如下代碼:SubCommand1-Click()DIMCNASStringx=GetCName(CN)Print〃ThisComputerNameis:〃,CNCN=〃MYCOMPUTER〃x=SetCName(CN)Print〃NowtheComputernameis:〃,CNEndSub1)對(duì)于完成同一個(gè)實(shí)際的任務(wù)來(lái)說(shuō),一般而言菜單驅(qū)動(dòng)方式較數(shù)據(jù)表格驅(qū)動(dòng)方式和事件驅(qū)動(dòng)方式容易2)相對(duì)于用戶的工作量來(lái)說(shuō),菜單驅(qū)動(dòng)方式較數(shù)據(jù)表格驅(qū)動(dòng)方式和事件驅(qū)動(dòng)方式的工作量大。第四章:P2151、將中點(diǎn)畫線算法推廣以便能畫出任意斜率的直線算法設(shè)計(jì):(1)輸入直線的起點(diǎn)坐標(biāo)P0(x0,y0)和終點(diǎn)坐標(biāo)P1(x1,y1).(2)定義直線當(dāng)前點(diǎn)坐標(biāo)x和y,定義中點(diǎn)偏差判別式d、直線斜率k、像素點(diǎn)顏色rgb(3)x=x0,y=y0計(jì)算d=0.5-k,k=(y1-y0)/(x1-x0),rgb=RGB=(0,0,255).(4)繪制點(diǎn)(x,y),判斷d的符號(hào),若d<0,則(x,y)更新為(x+1,y+1),d更新為d+1-k,否則(x,y)更新為(x+1,y),d更新為d-k.(5)如果當(dāng)前點(diǎn)x小于(x1,重復(fù)步驟(4),否則結(jié)束。程序主要代碼:MidPointLine(x0,y0,x1,y1,color){inta,b,delta1,delta2,d,x,y;a=y0–y1;b=x1–x0;d=2*a–b;delta1=2*a;delta2=2*(a+b);x=x0;y=y0;if(a<b)drawpixel(x,y,color);elsedrawpixel(y,x,color);while(x>x1){If(d<0){x++;y++;d+=delta2;}Else{X++;D+=delta1;}Putpixel(x,y,color);}ElseWhile(x<x1){If(d<0){x--;y++;d-=delta3;}Else{x--;d-=delta1;}Putpixel(x,y,color);}}2、采用整數(shù)Bresenham算法,為一臺(tái)計(jì)算機(jī)編制直線掃描轉(zhuǎn)換程序。從鍵盤敲入兩端點(diǎn)坐標(biāo),就能在顯示器屏幕上畫出對(duì)應(yīng)的直線。VoidDrawLine(intcolor){intx0,y0,x1,y1,color,I;scanf(“%d,%d,%d,%d”,&x0,&y0,&x1,&y1);dx=x1–x0;dy=y1–y0;e=-dx;x=x0;y=y0;for(i=0;i<=dx;i++){putpixel(x,y,color);x=x+1;e=e+2*dy;if(e>=0){y=y+1;e=e–2*dy;}}}4、試編寫按逆時(shí)針?lè)较蛏傻诙€(gè)8分圓的中點(diǎn)算法算法設(shè)計(jì):(1)輸入圓的半徑(2)定義圓當(dāng)前點(diǎn)坐標(biāo)x和y、中點(diǎn)偏差判別式d、像素點(diǎn)顏色rgb(3)計(jì)算d=1.25-R,x=0,y=R,rgb=RGB=(0,0,255).(4)繪制點(diǎn)(x,y),及其在八分圓中的另外7個(gè)對(duì)稱點(diǎn)?(5)判斷d的符號(hào),若d<0,則(x,y)更新為(x+1,y),d更新為d+2x+3,否則(x,y)更新為(x+1,y-1),d更新為d+2(x-y)+5.(6)當(dāng)x小于等于y,重復(fù)步驟(4)和(5),否則結(jié)束。MidpointCircle(r,color)intr,color;{floatx,y;floatd;x=0;y=r;d=1.25–r/1.414;drawpixel(x,y,color);while(x<y){if(d<0){d+=2*x+3;x++;}else{d+=5+2*(x-y);x++;y--;}drawpixel(x,y,color);}}5、假設(shè)圓的圓心不在原點(diǎn),試編寫算法對(duì)整個(gè)圓進(jìn)行掃描轉(zhuǎn)換算法設(shè)計(jì):(1)輸入圓的半徑r,圓心坐標(biāo)為(xc,yc)(2)定義圓當(dāng)前點(diǎn)坐標(biāo)x和y、中點(diǎn)偏差判別式d、像素點(diǎn)顏色rgb(3)計(jì)算d=1.25-R,x=0,y=R,rgb=RGB=(0,0,255).(4)繪制點(diǎn)(x+xc,y+yc),及其在八分圓中的另外7個(gè)對(duì)稱點(diǎn)?(5)判斷d的符號(hào),若d<0,則(x,y)更新為(x+1,y),d更新為d+2x+3,否則(x,y)更新為(x+1,y-1),d更新為d+2(x-y)+5.(6)當(dāng)x小于等于y,重復(fù)步驟(4)和(5),否則結(jié)束。(1)用bresenham畫圓法,設(shè)圓心坐標(biāo)為(xc,yc)bresenham_circle(r,color)intr,color;{intx,y,delta,delta1,delta2,direction;x=xc;y=yc+r;delta=2*(1-r);while(y>=0){drawpixel(x,y,color);if(delta<0){delta1=2*(delta+y-b)-1;if(delta1<=0)direction=1;elsedirection=2;}elseif(delta>0){delta2=2*(delta-x+xc)-1;if(delta2<=0)direction=2;elsedirection=3;}elsedirection=2;switch(direction){case1:x++;delta+=2*(x-xc)+1;break;case2:x++;y++;delta+=2*(x-a-y+yc+1);break;case3:y--;delta+=-2*(y-yc)+1;break;}}}(2)采用中點(diǎn)畫圓算法#include<stdio.h>#include<conio.h>#include<graphics.h>MidpointCircle(r,color)intr,color;{floatx,y;floatd;x=0;y=r;d=1.25–r/1.414;putpixel(xc+x,yc+y,color);while(x<y){if(d<0){d+=2*x+3;x++;}else{d+=5+2*(x-y);x++;y--;}putpixel(xc+x,yc+y,color);}}putpixel(x,y,color);putpixel(xc+yc-y,yc+xc-x,color);putpixel(xc+yc-y,yc+xc-x,color);putpixel(x,yc+yc-y,color);putpixel(xc+xc-x,yc+yc-y,color);putpixel(xc-yc+y,yc-xc+x,color);putpixel(xc-yc+y,yc+xc-x,color);putpixel(xc+xc-x,y,color);}voidmain(){intgdriver=DETECT,gmode,xc,yc,r;initgraph(&gdriver,&gmode,“”);printf(“Pleaseenterthexc:”);scanf(“%d”,&xc);printf(“Pleaseentertheyc:”);scanf(“%d”,&yc);printf(“PleaseentertheR:”);scanf(“%d”,&r);cleardevice();MidpointCircle(xc,yc,r,RED);getch();closegraph();}6、試編寫可以對(duì)一段任意圓弧進(jìn)行掃描轉(zhuǎn)換的算法將360度的區(qū)域分成8個(gè)部分32415867編寫可以對(duì)一段任意圓弧進(jìn)行掃描轉(zhuǎn)換的算法的關(guān)鍵在于,對(duì)這段圓弧的起點(diǎn)和終點(diǎn)分別判定是否在同一區(qū)域如果起點(diǎn)和終點(diǎn)在同一區(qū)域,調(diào)用中點(diǎn)畫圓算法,但要根據(jù)實(shí)際情況對(duì)參數(shù)進(jìn)行修正;如果起點(diǎn)和終點(diǎn)不在同一區(qū)域,則要根據(jù)實(shí)際情況對(duì)圓弧段進(jìn)行分割,分割的原則是將每一段的起點(diǎn)和終點(diǎn)放在同一區(qū)域,然后分別調(diào)用中點(diǎn)畫圓算法畫圓弧,同樣在畫的過(guò)程中,要根據(jù)實(shí)際情況對(duì)參數(shù)進(jìn)行修正及算法進(jìn)行修正;設(shè)圓弧的起點(diǎn)為(x1,y1),終點(diǎn)為(x2,y2),半徑為r如圖A(x1,y1)D(x0-r,y0)C(x0,y0)B(x2,y2)將整個(gè)圓弧分為兩段,弧AC和弧CB,分別進(jìn)行掃描轉(zhuǎn)換,轉(zhuǎn)換過(guò)程中利用中點(diǎn)畫圓方法進(jìn)行,代碼如下:midpoint(x1,y1,x2,y2,r,color,k){intx,y;floatd;x=x1;y=y1;d=(x1+1)^2+(y1-0.5)^2-r^2;putpixel(x,y,color);while(x<=x2){if(d<0){d+=2*x+3;x++;}else{d+=2*(x-y)+5;x++;y=y+k;}}putpixel(x,y,color);main(){scanf(“%d”,&n);//分割的圓弧數(shù)for(i=1;i<=n;i++){scanf(“%d,%d,%d,%d,%d”,&x1,&y1,&x2,&y2,,&k);//要求x1<x2midpoint(x1,y1,x2,y2,r,color,k);7、設(shè)計(jì)一個(gè)多邊形區(qū)域填充算法,使其邊界像素具有一個(gè)值,而內(nèi)部的像素具有另一個(gè)值。算法設(shè)計(jì):(1)使用畫線語(yǔ)句繪制多邊形(2)計(jì)算窗口客戶區(qū)的水平邊界最大值MaxX和垂直邊界最大值MaxY(3)調(diào)用系統(tǒng)調(diào)色板,設(shè)置顏色值FillColor為調(diào)色板上取得的顏色,CBackColor為白色。(4)對(duì)于每一條邊,y從ymin開(kāi)始,執(zhí)行下面的循環(huán)。(5)x從掃描線和邊的交點(diǎn)處開(kāi)始到窗口客戶區(qū)右邊界,先獲得(x,y)位置的像素顏色,如果是填充色,則置成背景色,否則所有填充色填充。執(zhí)行x=x+1/k,計(jì)算下一個(gè)x起點(diǎn)值。(6)如果y=ymin,則掃描結(jié)束,否則y++,轉(zhuǎn)(5)。主要代碼:intMaxX,MaxY;VoidGetMaxX()//求屏幕最大x值{CRectrect;GetClientRect(rect);MaxX=rect.riht;}VoidGetMaxY()//求屏幕最大y值{CRectrect;GetClientRect(rect);MaxX=rect.bottom;}VoidDraw()//填充多邊形函數(shù){COLORREFCBackColor=RGB(255,255,255);//白色CClientDCdc(this);intm,n,ymin,ymax;doublex,y,k;for(inti=0;i<=6;i++){m=i,n=i+1;if(7==n)n=0;k=(double(Point[m].x-Point[n].x)/(Point[m].y-Point[n].y);//計(jì)算1/k;if((Point[m].y<Point[n].y)//得到每條邊y的最大和y最小值{ymin=Point[m].y;ymax=Point[n].y;x=Point[m].x;//得到x|ymin}else{ymin=Point[n].y;ymax=Point[m].y;x=Point[n].x;}For(y=ymin;y<ymax;y++){For(intj=ROUND(x);j<MaxX;j++)//對(duì)每一條掃描線與邊的交點(diǎn)的右側(cè)像素循環(huán){If(dc.GetPixel(j,ROUND(y)==FillColor)//如果像素的顏色是填充色{dc.SetPixel(j,ROUND(y),CBackColor);//改為背景色}else{dc.SetPixel(j,ROUND(y),FillColor);//改為填充色}}x+=k;//計(jì)算下一個(gè)x起點(diǎn)值}}}DrawPolygon()//繪制多邊形函數(shù){CClientDCdc(this);intm,n;for(intj=0;j<=6;j++){M=j;n=j+1;If(7==n)n=0;dc.MoveTo(Point[m]);dc.LineTo(Point[n]);}}10、試設(shè)計(jì)一個(gè)生成具有寬度的直線條的算法,使得在直線條連接處不出現(xiàn)圖示的缺口對(duì)于第一種方案:cdeabf可以把整個(gè)線條分成兩個(gè)部分,對(duì)于左半部分:先計(jì)算出線條的四個(gè)頂點(diǎn),a,b,c,d再用直線段把相鄰角點(diǎn)連接起來(lái),最后調(diào)用多邊形填充算法把所得的四邊形進(jìn)行填色同樣,對(duì)于右半部分,依法處理對(duì)于第二種方案:cedfgabh可以把整個(gè)線條分成三個(gè)部分,對(duì)于左半部分:先計(jì)算出線條的四個(gè)頂點(diǎn),a,b,c,d再用直線段把相鄰角點(diǎn)連接起來(lái),最后調(diào)用多邊形填充算法把所得的四邊形進(jìn)行填色對(duì)于中間部分:先計(jì)算出線條的四個(gè)頂點(diǎn),c,d,e,f再用半徑為某個(gè)值如R圓弧分別把c,e和d,f連接起來(lái),最后調(diào)用區(qū)域填充算法把所得的圓環(huán)段c,e,d,f進(jìn)行填色同樣,對(duì)于右半部分,依法處理先計(jì)算出線條的四個(gè)頂點(diǎn),e,f,g,h再用直線段把相鄰角點(diǎn)連接起來(lái),最后調(diào)用多邊形填充算法把所得的四邊形進(jìn)行填色12、為26個(gè)英文大寫字母設(shè)計(jì)5X7的字符掩膜矩陣。13、編寫一程序?qū)崿F(xiàn)線段裁剪的中點(diǎn)分割算法算法設(shè)計(jì):(1)輸入直線段的兩端點(diǎn)坐標(biāo):P0(x0,y0),P1(x1,y1)繪制坐標(biāo)為(wxl,wyt),(wxr,wyb)的窗口(2)P0點(diǎn)的編碼為RC0,P1點(diǎn)的編碼為RC1。(3)若RC0|RC1=0,對(duì)直線段應(yīng)“取”,轉(zhuǎn)步驟(6);否則若RC0|RC1≠0,對(duì)直線段應(yīng)“棄”,轉(zhuǎn)步驟(6)。(4)如果直線段有一個(gè)端點(diǎn)在窗口內(nèi),則計(jì)算該直線的中點(diǎn)坐標(biāo)P[x=(x0+x1)/2,y=(y0+y1)/2],并計(jì)算其編碼RC。如果中點(diǎn)P和P0在規(guī)定的誤差范圍內(nèi)(例如10-6)不重合,則判斷中點(diǎn)是否也在窗口內(nèi),如果在,PP0“取”之,否則,PP0“棄”之。將中點(diǎn)P賦給點(diǎn)P1,轉(zhuǎn)步驟(6)。(5)如果直線段的兩個(gè)端點(diǎn)都不在窗口內(nèi),則必定與窗口相交,求該直線中點(diǎn)坐標(biāo)P[x=(x0+x1)/2,y=(y0+y1)/2]和其編碼RC。當(dāng)中點(diǎn)P在窗口外時(shí),如果RC0&RC1=0,則PP1在窗口外,“棄”之;否則PP0在窗口外,“棄”之,直到中點(diǎn)P在窗口內(nèi)。對(duì)于中點(diǎn)在窗口內(nèi)的直線段PP1和PP0,重復(fù)步驟(4)。(6)輸出裁減后的線段。主要代碼:VoidMidClip(doubleP0x,doubleP0y,doubleP1x,doubleP1y,BOOLflag){Doublex,y;UnsignedintRCT0,RCT1;RCT0=EnCode(P0x,P0y);RCT1=EnCode(P1x,P1y);x=(P0x+P1x)/2;y=(P0y+P1y)/2;RCT=EnCode(x,y);while(abs(x-P0x)>1e-6||abs(y-P0y)>1e-6){if(RCT==0)//中點(diǎn)也在窗口內(nèi),則P=P0{P0x=x;P0y=y;RCT0=RCT;}else//否則舍棄P1點(diǎn){P1x=x;P1y=y;RCT1=RCT;}x=(P0x+P1x)/2;y=(P0y+P1y)/2;RCT=EnCode(x,y);}if(flag==true){Pointx[1]=x;Pointy[1]=y;}else{Pointx[0]=x;Pointy[0]=y;}}14編寫一程序?qū)崿F(xiàn)逐次多邊形裁剪算法算法設(shè)計(jì):(1)輸入第一個(gè)頂點(diǎn)坐標(biāo):F(x0,y0)第二個(gè)頂點(diǎn)坐標(biāo):S(x1,y1)(2)當(dāng)頂點(diǎn)輸入完畢,轉(zhuǎn)(7)(3)輸入頂點(diǎn)P坐標(biāo):P(x2,y2)(4)SP與裁剪線相交嗎?是,求SP與裁剪線的交點(diǎn)I(x,y),并輸出I坐標(biāo):I(x,y)(5)P位于可見(jiàn)一側(cè)嗎?是,輸出頂點(diǎn)P坐標(biāo):P(x2,y2)(6)將頂點(diǎn)P坐標(biāo):P(x2,y2)=》頂點(diǎn)S坐標(biāo):S(x1,y1),轉(zhuǎn)(2)(7)將頂點(diǎn)F坐標(biāo):F(x0,y0)=》頂點(diǎn)P坐標(biāo):S(x2,y2),形成閉合,(8)SP與裁剪線相交嗎?是,求SP與裁剪線的交點(diǎn)I(x,y),并輸出I坐標(biāo):I(x,y)(9)P位于可見(jiàn)一側(cè)嗎?是,輸出頂點(diǎn)P坐標(biāo):P(x2,y2)(10)結(jié)束程序代碼:/*Sutherland-Hodgman算法*/#defineLENsizeof(structnode)#include<math.h>#include"display.h"structnode{intdx,dy;structnode*next;};structnode*creat(){structnode*h,*q,*r;intp[8][2]={100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,190};inti;setcolor(12);for(i=0;i<7;i++)line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]);line(p[0][0],p[0][1],p[7][0],p[7][1]);rectangle(120,200,230,70);h=NULL;for(i=0;i<8;i++){q=(structnode*)malloc(LEN);q->dx=p[i][0];q->dy=p[i][1];if(h==NULL)h=q;elser->next=q;r=q;}r->next=NULL;return(h);}structnode*builx(h,x)structnode*h;intx;{ints[2],j[2];structnode*hh,*p,*r,*q;intmax,min;p=h;hh=NULL;s[0]=p->dx;s[1]=p->dy;p=p->next;while(p!=NULL){j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]);max=s[0];min=p->dx;if(s[0]<p->dx){max=p->dx;min=s[0];}if((j[0]>=min)&&(j[0]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dx>=x){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}s[0]=p->dx;s[1]=p->dy;p=p->next;}p=h;j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]);max=s[0];min=p->dx;if(s[0]<p->dx){max=p->dx;min=s[0];}if((j[0]>=min)&&(j[0]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dx>=x){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}r->next=NULL;return(hh);}structnode*builxx(h,x)structnode*h;intx;{ints[2],j[2];structnode*hh,*p,*r,*q;intmax,min;p=h;hh=NULL;s[0]=p->dx;s[1]=p->dy;p=p->next;while(p!=NULL){j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]+0.1);max=s[0];min=p->dx;if(s[0]<p->dx){max=p->dx;min=s[0];}if((j[0]>=min)&&(j[0]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dx<=x){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}s[0]=p->dx;s[1]=p->dy;p=p->next;}p=h;j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]+0.1);max=s[0];min=p->dx;if(s[0]<p->dx){max=p->dx;min=s[0];}if((j[0]>=min)&&(j[0]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dx<=x){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}r->next=NULL;return(hh);}structnode*buily(h,y)structnode*h;inty;{ints[2],j[2];structnode*hh,*p,*r,*q;intmax,min;p=h;hh=NULL;s[0]=p->dx;s[1]=p->dy;p=p->next;while(p!=NULL){j[1]=y;j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1);max=s[1];min=p->dy;if(s[1]<p->dy){max=p->dy;min=s[1];}if((j[1]>=min)&&(j[1]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dy>=y){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}s[0]=p->dx;s[1]=p->dy;p=p->next;}p=h;j[1]=y;j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1);max=s[1];min=p->dy;if(s[1]<p->dy){max=p->dy;min=s[1];}if((j[1]>=min)&&(j[1]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dy>=y){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}r->next=NULL;return(hh);}structnode*builyy(h,y)structnode*h;inty;{ints[2],j[2];structnode*hh,*p,*r,*q;intmax,min;p=h;hh=NULL;s[0]=p->dx;s[1]=p->dy;p=p->next;while(p!=NULL){j[1]=y;j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1);max=s[1];min=p->dy;if(s[1]<p->dy){max=p->dy;min=s[1];}if((j[1]>=min)&&(j[1]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dy<=y){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}s[0]=p->dx;s[1]=p->dy;p=p->next;}p=h;j[1]=y;j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1);max=s[1];min=p->dy;if(s[1]<p->dy){max=p->dy;min=s[1];}if((j[1]>=min)&&(j[1]<=max)){q=(structnode*)malloc(LEN);q->dx=j[0];q->dy=j[1];if(hh==NULL)hh=q;elser->next=q;r=q;}if(p->dy<=y){q=(structnode*)malloc(LEN);q->dx=p->dx;q->dy=p->dy;if(hh==NULL)hh=q;elser->next=q;r=q;}r->next=NULL;return(hh);}main(){intmax,min;structnode*head,*r,*q;inti;ints[2];Initialize();head=creat();q=head;while(q->next!=NULL){putpixel(q->dx,q->dy,14);q=q->next;}putpixel(q->dx,q->dy,14);/*左邊界進(jìn)行裁減*/q=builx(head,120);head=q;while(q->next!=NULL){putpixel(q->dx,q->dy,15);q=q->next;}putpixel(q->dx,q->dy,15);/*上邊界進(jìn)行裁減*/q=buily(head,70);head=q;while(q->next!=NULL){putpixel(q->dx,q->dy,2);q=q->next;}putpixel(q->dx,q->dy,2);/*右邊界進(jìn)行裁減*/q=builxx(head,230);head=q;while(q->next!=NULL){putpixel(q->dx,q->dy,1);q=q->next;}putpixel(q->dx,q->dy,1);/*下邊界進(jìn)行裁減*/q=builyy(head,200);head=q;s[0]=q->dx;s[1]=q->dy;q=q->next;setcolor(14);outtextxy(100,100,"abc");while(q!=NULL){line(s[0],s[1],q->dx,q->dy);s[0]=q->dx;s[1]=q->dy;q=q->next;getch();}q=head;outtextxy(200,200,"def");line(s[0],s[1],q->dx,q->dy);getch();}第六章曲線和曲面3、參照Hermite三次曲線的幾何形式,試用B[P0P1P0uP1uP0uuP1uu]T,推導(dǎo)相應(yīng)五次曲線的調(diào)和函數(shù)和系數(shù)矩陣M。解:設(shè)Hermite五次曲線的幾何形式為:P(t)=a5t5+a4t4+a3t3+a2t2+a1t+a0其中t∈[0,1]按題意,已知曲線兩端點(diǎn)的坐標(biāo)值P0P1曲線兩端點(diǎn)的一階導(dǎo)數(shù)值P0uP1u曲線兩端點(diǎn)的二階導(dǎo)數(shù)值P0uuP1uu則求出系數(shù)a5,a4,a3,a2,a1,a0則P(t)就可確定;由于P(t)=a5t5+a4t4+a3t3+a2t2+a1t+a0其中t∈[0,1]P?(t)=5a5t4+4a4t3+3a3t2+2a2t+a1P”(t)=20a5t3+12a4t2+6a3t+2a2P0=P(0)=a0P1=P(1)=a5+a4+a3+a2+a1+a0P0?=P?(0)=a1P1?=P?(1)=5a5+4a4+3a3+2a2+a1P0”=P”(0)=2a2P1”=P”(1)=20a5+12a4+6a3+2a2所以a0=P(0)a1=P?(0)a2=P”(0)/2a3=10P(1)-10P(0)-4P?(1)-6P?(0)+P”(1)/2-3P”(0)/2a4=-15P(1)+15P(0)+7P?(1)+8P?(0)-P”(1)-3P”(0)/2a5=6P(1)-6P(0)-3P?(1)-3P?(0)-P”(0)/2+P”(1)/2=>P(t)=[-6P(0)+6P(1)-3P?(0)-3P?(1)-P”(0)/2+P”(1)/2]t5+[+15P(0)-15P(1)+8P?(0)+7P?(1)+3P”(0)/2]t4+[-10P(0)+10P(1)-6P?(0)-4P?(1)-3P”(0)/2+P”(1)/2]t3+[P”(0)/2]2+[P?(0)]+P(0)整理得:P(t)=(-6ttt5+15t4-10t3+1)P(0)+(6t5-15t4+10t3)P(1)+(-3t5+8t4-6t3+t)P?(0)+(-3t5+7t4-4t3)P?(1)+(-t5/2+3t4/2-3t3/2+t2/2)P”(0)+(t5/2-t4+t3/2)P”(1)故調(diào)和函數(shù)為:F(0)=-6t5+15t4-10t3+1F(1)=6t5-15t4+10t3F(2)=-3t5+8t4-6t3+tF(3)=-3t5+7t4-4t3F(4)=-t5/2+3t4/2-3t3/2+t2/2F(5)=t5/2-t4+t3/2系數(shù)矩陣為:-6615-15-3-387-1/21/23/2-1-1010-6-4-3/21/200001/200010001000009.試求兩段三次Hermite曲線達(dá)C1和G1連續(xù)的條件解:兩段三次Hermite曲線分別為:Q1(t1)=a3t13+a2t12+a1t1+a0t1∈[01]Q2(t2)=b3t23+b2t22+b1t2+b0t2∈[01](1)依據(jù)G1連續(xù)充要條件為:Q1(1)和Q2(0)在P點(diǎn)處重合,且其在P點(diǎn)處的切矢量方向相同,大小不等即Q1(1)=Q2(0),Q1?(1)≠Q(mào)2?(0),Q1”(1)=Q2”(0)而Q1(1)=a3+a2+a1+a0Q2(0)=b0Q1?(t1)=3a3t12+2a2t1+a1Q2?(t2)=3b3t22+2b2t2+b1Q1?(1)=3a3+2a2+a1Q2?(0)=b1Q1”(t1)=6a3t1+2a2Q2”(t2)=6b3t2+2b2Q1”(1)=6a3+2a2Q2”(0)=2b2=>兩段三次Hermite曲線:Q1(t1)=a3t13+a2t12+a1t1+a0t1∈[01]Q2(t2)=b3t23+b2t22+b1t2+b0t2∈[01]要達(dá)到G1連續(xù),其系數(shù)必須滿足下列關(guān)系式:a3+a2+a1+a0=b03a3+2a2+a1≠b16a3+2a2=2b2(2)依據(jù)C1連續(xù)充要條件為:Q1(1)和Q2(0)在P點(diǎn)處重合,且其在P點(diǎn)處的切矢量方向相同,大小相等即Q1(1)=Q2(0),Q1?(1)=Q2?(0),Q1”(1)=Q2”(0)而Q1(1)=a3+a2+a1+a0Q2(0)=b0Q1?(t1)=3a3t12+2a2t1+a1Q2?(t2)=3b3t22+2b2t2+b1Q1?(1)=3a3+2a2+a1Q2?(0)=b1Q1”(t1)=6a3t1+2a2Q2”(t2)=6b3t2+2b2Q1”(1)=6a3+2a2Q2”(0)=2b2=>兩段三次Hermite曲線:Q1(t1)=a3t13+a2t12+a1t1+a0t1∈[01]Q2(t2)=b3t23+b2t22+b1t2+b0t2∈[01]要達(dá)到C1連續(xù),其系數(shù)必須滿足下列關(guān)系式:a3+a2+a1+a0=b03a3+2a2+a1=b16a3+2a2=2b210.給定四點(diǎn)P1(0,0,0),P2(1,1,1),P3(2,-1,-1),P4(3,0,0),用其作為特征多邊形來(lái)構(gòu)造一條三次Bezier曲線,并計(jì)算參數(shù)為0,1/3,2/3,1的值。解:三次Bezier曲線的一般式為:P(t)=(1-t)3P1+3t(1-t)2P2+3t2(1-t)P3+t3P4t∈[01]其矩陣表達(dá)式為-13-31P1P(t)=[t3t2t1]3-630P2-3300P31000P4-13-31000=[t3t2t1]3-630111-33002-1-11000300066=>P(t)=[t3t2t1]0-9-9333000然后分別令t=0,1/3,2/3,1計(jì)算上述式子即可當(dāng)t=0時(shí)P(0)=00010660-9-9333000=000當(dāng)t=1/3時(shí)P(1/3)=1/331/321/310660-9-9333000=12/92/9當(dāng)t=2/3時(shí)P(2/3)=(2/3)3(2/3)22/310660-9-9333000=2-2/92/9當(dāng)t=1時(shí)P(0)=11110660-9-9333000=30011.已知由P1(0,0,0),P2(2,2,-2),P3(2,-1,-1),P4(3,0,0),Q1(4,0,0),Q2(6,-2,1),Q3(8,-3,2),Q4(10,0,1)確定的兩段三次Bezier曲線,試求其在P4(Q1)處達(dá)到C1連續(xù)的條件解:設(shè)兩段連續(xù)的三次Bezier曲線分別為:P(t),Q(t)t∈[01]則P(t1)=(1-t1)3P1+3t1(1-t1)2P2+3t12(1-t1)P3+t13P4t1∈[01]Q(t2)=(1-t2)3Q1+3t2(1-t2)2Q2+3t22(1-t2)Q3+t23Q4t2∈[01]將P1、P2、P3、P4的分量分別代入P(t)得到相應(yīng)的分量Px(t)=(1-t)3*0+3t(1-t)2*2+3t2(1-t)*2+t3*4=4t3–6t2+6tPy(t)=(1-t)3*0+3t(1-t)2*2+3t2(1-t)*(-1)+t3*0=9t3–15t2+6tPz(t)=(1-t)3*0+3t(1-t)2*(-2)+3t2(1-t)*(-1)+t3*0=-3t3+9t2-6t即三次Bezier曲線的矩陣式為:P(t)=[t3t2t1]49-30-6-159066-600000將Q1、Q2、Q3、Q4的分量分別代入Q(t)得到相應(yīng)的分量Qx(t)=(1-t)3*4+3t(1-t)2*6+3t2(1-t)*8+t3*10=6t+4Qy(t)=(1-t)3*0+3t(1-t)2*(-2)+3t2(1-t)*(-3)+t3*0=3t3+3t2-6tQz(t)=(1-t)3*0+3t(1-t)2*1+3t2(1-t)*2+t3*1=-2t3+3t即三次Bezier曲線的矩陣式為:Q(t)=[t3t2t1]03-2003006-6304004P(t)和Q(t)在P4(Q1)處達(dá)到C1連續(xù)的條件是:P(1)和Q(0)在P4(Q
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貨運(yùn)技術(shù)轉(zhuǎn)讓協(xié)議書
- 綠化安全生產(chǎn)協(xié)議書
- 2025年度建筑行業(yè)個(gè)人述職述德述廉報(bào)告范文
- 上級(jí)政府及安全專家檢查企業(yè)典型隱患問(wèn)題匯-總
- 孵化器投資協(xié)議范本
- 食堂外包價(jià)格調(diào)整協(xié)議
- 能量效率材料采購(gòu)協(xié)議
- 房產(chǎn)投資風(fēng)險(xiǎn)說(shuō)明協(xié)議
- 垃圾分類服務(wù)合同履約金條款
- 初中語(yǔ)文教學(xué)設(shè)計(jì)
- (高清版)DZT 0347-2020 礦山閉坑地質(zhì)報(bào)告編寫規(guī)范
- 部編版語(yǔ)文二年級(jí)下冊(cè)第四單元整體教學(xué)設(shè)計(jì)教案
- 工器具管理臺(tái)帳
- (完整)中醫(yī)癥候積分量表
- 藥學(xué)實(shí)踐教學(xué)設(shè)計(jì)
- 《物業(yè)管理概論》試題及答案匯總
- 濕疹中醫(yī)護(hù)理查房課件
- 人人講安全個(gè)個(gè)會(huì)應(yīng)急主題班會(huì)
- JCT595-2017 干磨云母粉標(biāo)準(zhǔn)
- (完整版)建筑工程技術(shù)畢業(yè)論文
- 國(guó)開(kāi)形成性考核《人類與社會(huì)》形考作業(yè)(1)試題及答案
評(píng)論
0/150
提交評(píng)論