《計算機圖形學》課后習題參考答案_第1頁
《計算機圖形學》課后習題參考答案_第2頁
《計算機圖形學》課后習題參考答案_第3頁
《計算機圖形學》課后習題參考答案_第4頁
《計算機圖形學》課后習題參考答案_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第一章

1、試述計算機圖形學研究的基本內(nèi)容?

答:見課本P5-6頁的1.1.4節(jié)。

2、計算機圖形學、圖形處理與模式識別本質(zhì)區(qū)別是什么?請各舉一例說明。

答:計算機圖形學是研究根據(jù)給定的描述,用計算機生成相應的圖形、圖像,且所生成的圖形、

圖像可以顯示屏幕上、硬拷貝輸出或作為數(shù)據(jù)集存在計算機中的學科。計算機圖形學研究的是從數(shù)

據(jù)描述到圖形生成的過程.例如計算機動畫制作。

圖形處理是利用計算機對原來存在物體的映像進行分析處理,然后再現(xiàn)圖像。例如工業(yè)中的射

線探傷。

模式識別是指計算機對圖形信息進行識別和分析描述,是從圖形(圖像)到描述的表達過程。

例如郵件分撿設備掃描信件上手寫的郵政編碼,并將編碼用圖像復原成數(shù)字。

3、計算機圖形學與CAD、CAM技術關系如何?

答:見課本P4-5頁的1.1.3節(jié)。

4、舉3個例子說明計算機圖形學的應用。

答:①事務管理中的交互繪圖

應用圖形學最多的領域之一是繪制事務管理中的各種圖形。通過從簡明的形式呈現(xiàn)出數(shù)據(jù)的模

型和趨勢以增加對復雜現(xiàn)象的理解,并促使決策的制定。

②地理信息系統(tǒng)

地理信息系統(tǒng)是建立在地理圖形基礎上的信息管理系統(tǒng)。利用計算機圖形生成技術可以繪制地

理的、地質(zhì)的以及其它自然現(xiàn)象的高精度勘探、測量圖形。

③計算機動畫

用圖形學的方法產(chǎn)生動畫片,其形象逼真、生動,輕而易舉地解決了人工繪圖時難以解決的問

題,大大提高了工作效率。

5、計算機繪圖有哪些特點?

答:見課本P8頁的1.3.1節(jié)。

6、計算機生成圖形的方法有哪些?

答:計算機生成圖形的方法有兩種:矢量法和描點法。

①矢量法:在顯示屏上先給定一系列坐標點,然后控制電子束在屏幕上按一定的順序掃描,

逐個“點亮”臨近兩點間的短矢量,從而得到一條近似的曲線。盡管顯示器產(chǎn)生的只是一些短直線

的線段,但當直線段很短時,連成的曲線看起來還是光滑的。

②描點法:把顯示屏幕分成有限個可發(fā)亮的離散點,每個離散點叫做一個像素,屏幕上由像

素點組成的陣列稱為光柵,曲線的繪制過程就是將該曲線在光柵上經(jīng)過的那些像素點串接起來,使

它們發(fā)亮,所顯示的每?曲線都是山?定大小的像素點組成的。當像素點具有多種顏色或多種灰度

等級時,就可以顯示彩色圖形或具有不同灰度的圖形。

7、當前計算機圖形學研究的課題有哪些?

答:見課本P10-1I頁的1.4節(jié)。

8、簡述三維圖形生成和輸出的流水線?

答:見課本P13頁1.56節(jié)。

9、向量圖形和點陣圖形之間的區(qū)別有哪些?

答:通過矢量法產(chǎn)生的圖形稱為矢量圖形或者向量圖形,用描點法產(chǎn)生的圖形稱為點陣圖形。

向量圖形區(qū)別點陣圖形的特點在于描述圖形幾何形狀的數(shù)學模型及依據(jù)此模型生成幾何圖形的計算

機命令。向量圖形由各個基本圖形構成,這就要求各個基本圖形有各自獨立的信息。如果用點陣圖

形來表示一個向量圖形,構成向量圖形的某個基本圖形(如直線段、圓弧等)的所有點應有一個信

息.因此,在描述一個基本圖形時,同時要描述其相應的信息…向量圖形最基木的優(yōu)點是它本身是

由精確的數(shù)據(jù)給出,所以可以充分利用各種輸出圖形設備的分辨率盡可能精確地輸出圖形。也正因

為如此,向量圖形的尺寸可以任意變化而不損失圖形顯示的質(zhì)量。但是向量圖形僅適合于描繪簡單

圖形,而點陣圖形可以描繪絢爛多彩的復雜圖形。

10、什么是虛擬現(xiàn)實技術和可視化技術?

答:虛擬現(xiàn)實技術:利用計算機生成一種模擬環(huán)境,通過多種傳感器和設備使用戶“投入”到

該環(huán)境中,實現(xiàn)用戶和該環(huán)境直接進行交互的技術。例如模擬飛機駕駛艙。

可視化技術:通過對空間數(shù)據(jù)場構造中間幾何因素,或用圖形繪制技術在屏幕上產(chǎn)生二維圖像。

例如分子模型構造。

第二章

1、計算機圖形系統(tǒng)有什么特點?有哪些主要功能?

答:課本2.1.1的圖2.1展示了計算機圖形系統(tǒng)的組成。計算機圖形系統(tǒng)是為了支持應用程序,

便于實現(xiàn)圖形的輸入輸出的硬件和軟件組合體。沒有圖形系統(tǒng)支持,就難以實現(xiàn)應用軟件的開發(fā)。

主要功能見課本2.1.2節(jié)。

2、計算機圖形系統(tǒng)有哪幾種?各有什么特點?

答:一種分類方法:交互式圖形系統(tǒng)允許操作者以某種方式(對話方式或命令方式)來控制和

操作圖形生成過程,使得圖形可以邊生成、邊顯示、邊修改,直至符合要求為止。而被動式繪圖系

統(tǒng),圖形在生成過程中,操作者無法對圖形進行實時操作和控制,不具備交互功能,只提供各種圖

形命令或圖形程序庫,通過編程獲得所需圖形。

另一種分類方法:見課本2.1.3節(jié),分為脫機繪圖系統(tǒng),聯(lián)機繪圖系統(tǒng)和交互式繪圖系統(tǒng)。

3、陰極射線管由哪些部分組成?它們的功能分別是什么?

答;CRT山四部分組成;電子槍、聚焦系統(tǒng)、偏轉系統(tǒng)和熒光屏,這四部分都在真空管內(nèi)。

電子槍山燈絲、陰極和控制柵極組成。燈絲加熱陰極,陰極表面向外發(fā)射自山電子,控制柵控制自

由電子是否向熒光屏發(fā)出,若允許電子通過,形成的電子流在到達屏幕的途中,被聚焦系統(tǒng)(電子

透鏡)聚焦成很窄的電子束,山偏轉系統(tǒng)產(chǎn)生電子束的偏轉電場(或磁場),使電子束左右、上下偏

轉,從而控制熒光屏上光點上下、左右運動,使得在指定時刻在屏幕指定位置上產(chǎn)生亮點,

4、光柵掃描顯示器山哪些部分組成?它們的功能分別是什么?

答:見課本P21頁圖2.9所展示的組成框圖,其后有各部分的介紹及功能。

5、對于分辨率為1024*1024的光柵系統(tǒng),若每一像素用8位和12位二進制來表示存儲信息,各需多

大光柵存儲容量以及顯存?每一屏幕最多能顯示多少顏色?若R,G,B灰度都占8位,其顯示顏色的

總數(shù)是多少?

解:

1)每一-像素用8位二進制來表示存儲信息,所需容量為1024*1024*1=22°(Byte)=lMB

彩色素:2=256(項)

2)若每一像素用12位二進制表示存儲信息,所需容量為:1024*1024*1.5=1.5*22。(Byle)

=1.5MB(由于顯示卡的顯存是按2的指數(shù)次倍增長的,因此所需顯存為2M)

彩色素:212=4096(項)

3)顏色總數(shù):2'*2'*2'=2人=16777216(種)

6、對于19英寸顯示器,若X和Y兩方向的分辨率相等,即1024*1024,那么每個像素點的直徑是多

少?

19*25419

解:------=0.33(mm)或--------=0.013(英寸)

1024扼1024V2

7、對于分辨率為1024X768的光柵系統(tǒng),若調(diào)色板設置為真彩色32位,此時需要顯示一個三維圖

形,各需要多大光柵存儲容量以及顯存?

答:調(diào)色板為真彩色32位,即意味著像素值的位長為32

所需容量為1024*768*32/8*3=9MB因此所需要的顯存為16M

8、GKS有哪二種坐標系?它們有什么不同?試寫出它們之間對應關系?

答:GKS有3種不同的坐標系。第一種是供應用程序使用的實際世界坐標系統(tǒng)(WorldCoordinate

System,簡稱WC);第二種是GKS內(nèi)部使用的規(guī)范設備坐標系(NormalizedDeviceCoordinate,簡稱

NDC),它的取值范圍為這是一種既與設備無關也與應用無關的坐標系:第三種是各工作站物理

設備使用的設備坐標系(DeviceCoordinateSystem,簡稱DC)。GKS只支持二維對象的圖形處理,因

此上述3個坐標系都是二維坐標系。詳見課本圖3.28的描述。

9、GKS中輸入設備有哪6種邏輯功能?請各舉出對應的物理設備。

答:見課本2.4.5.節(jié)。

10、當前主流的圖形軟件有哪些?

答:見課本263節(jié)。

第三章

1、編寫畫一正方形程序,并在其中用不同的顏色畫15個正方形,每一個都比前一個小。

#includc4tgraphics.h"

#include4*conio.h"

voidmain()

inti,color=0,ls=0;

3-1批改說明;

intj=700;

?必須至少包含"graphics.h”

intgdriver=VGA;

,iniigr即h(&gdriver,&gmode,n");

intgmode=VGAHI;

initgrapM&gdriver&gmcdeJ''):?必須包含15個正方形,一般用for循環(huán),也可能用

setbkcolor(15);至I]while等。

fbr(i=O;i<225;i=i+15,j=j-3O)?注意查看是否是正方形(i,i,j,j)即:x2-xl=y2-yl

(?注意查看顏色是否有15種:也就是說gdriver二CGA

setcolor(color);肯定是錯的,可以為DETECT、VGA、EGA。

bar(i,i.j,j);gelch();

color++;closegraph();

is++;

2、用不同的線形繪制題1中的圖形

#include"graphics.h"

#include"conio.h"

voidmainQ

(

inti,color=l,ls=0;

intj=700;

intgdriver=VGA;

gmode=VGAHI;

inilgraph(&gdriver,&gm(》de,"");

setbkcolor(15);

3-2批改說明;

fdr(i=0;iv=225;i=i+15,j=j-3O)

?注意查看3」部分內(nèi)容

?setlinestyle((i%4),0,k);

setcolor(color);

?k對線寬的設置。

//seUineslylc(ls%4,0.1);或者

setlinestyle(4,ls,3);

rectangleo,

setfillstyle(SOLID_FILL,color);

〃floodfm(getmaxx()/2,getmaxy()/2,color);此句會出現(xiàn)最后只用一種顏色

填充的情況

color++;

ls++;

getch();

closegraph();

)

3、畫一五顏六色的圖(此例為畫一個五顏六色的圓)

#includc“graphics.h"

#include'^conio.h^^voidmain(){

intdriver=DETECT,mode=0;

inti,d;

initgraph(&driver,&mode,"");start=O;

3-3批改說明;

cnd=20;,必須至少包含'graphics.hH

fbr(i=O;i<18;i++),initgraph(&gdriver,&gmode,-n);

(

?如果是這個版本的圖,注意end比start

setfillstyle(SOLID_FILL,i);

要大c

pieslice(3OO,2OO,star:,end,100);

?restorecrtmodcO

start+=20;可能有人寫成

cnd+=20;

}

getch();

rcstorccr(mode();

I

4、編寫一輛自行車在一公路上由右至左快速行駛的程序。

#include"stdlib.h"

#include''graphics.hn

#includenconio.hn

#include"sidio.h"

voidmain()

(

void*w;

intdriver=DETEC?T,iTKxle=O,i,start,end,j;

initgraph(&driver,&mode,n"):

cleardevice();

setbkcolor(l5);

setcolor(CGA-LIGHTGREEN);

star(=O;

end=180;

circle(387,290,37);

circle(525,290,37):

linc(404,217,398,230);

line(436,217,429,230);

line(398,230.429,230);

line(413,230,387,290);

line(387,290,525,290);

line(408,243,484,243);

line(387,290,484,243);

line(484,243,525,290);

line(444,290,484,243);

line(444,290.446,279);

line(444,290,443,300);

line(438,277,444,278);

linc(435,300,451,301):

line(484,243,487,233);

line(472,233.502,233);〃自行車基本輪廓的繪制

w=malloc(imagesize(350,200,562,327));

getimage(350,200,562,327,w);

for(i=350,j=0;i>0;i-.,j.-)

{

setfillstyle(EMPTY_HLL,O);

pieslice(387+j,290,J>tart,end,37);

picslicc(525+j,290.d,37);

start+=40;

end+=40;

delay(5);//處于運動狀態(tài)的自行車車輪的軸線的繪制

putimage(i-1,200,w.COPY_PUT);

line(2,327,562,327);

delay(lO);〃自行車行駛動畫的實現(xiàn)

)

fbr(i=0;i<10;i++)

(

pieslice(37,290,start,end,37);

pieslice(175,290,start,end,37);

start+=40;

end+=40;

}〃處于靜止狀態(tài)的自行車車輪的軸線的繪制

getch();

restorecrtmodeO;

closegiaph();

)

5、試自行設計一個美術圖案,并且用程序實現(xiàn)。

(略)

第四章

1.為什么說直線生成算法是二維圖形生成技術的基礎?

答:無論什么復雜圖形,它們都是由宜線段和曲線段組成(三維圖形羥投影后最終變成了二維圖

形),而圖形設備顯示曲線段時,最終還是將曲線段轉化成一系列直線段逼近表示的。因此,所有

圖形都可以看成是由直線段組成的。可參考課本圖4.1。

2.根據(jù)DDA畫直線算法,遍一程序求(0,0)到(4,12)和(0,0,)到(12,4)的直線

#include"graphics.h"

#includc"math.h"

voidDDA_Line(intxl,intyl,intx2,inty2)

{

floatincrex,increy,x,y,length;

inii;

if(abs(x2-xI)>abs(y2-yI))

Iength=abs(x2-x1);

else

length=abs(y2-yl);

increx=(x2-xl)/length;

increy=(y2-yl)/length;

x=xl;

y二yi;

for(i=1;i<=lcng(h;i-H-)

(

putpixel(x,y,l);

x=x+increx;

y=y+incrcy;

)

}

voidmain()

(

intdriver=DETECT,mode=0;

initgraph(&driver,&mode,"");

intxl=(),y1=0,x2=4,y2=12;

intx3=12,y3=4;

DDA_Line(xl,yl,x2,y2);

DDA_Line(x1,y1,x3,y3);

gctch();

)

3.根據(jù)逐點比較法編一程序畫一段圓弧,其圓心為(0,0).圓弧兩點為A(5,0)、B(0,5)

方法1:順4象限

#include"graphics.h"

#include"stdio.h"

#include"conio.h"

voidZDBJ_ARC(floatxO.floatyO.floatxhfloatyl.floatx2,floaty2);

voidinainO

intgdriver=CGA.modc=CGACO;

initgraph(&gdriver,&mode,11n);

ZDBJ_ARC(0,0,25,0,0.25);

getch();

closcgraph();

)

voidZDBJ_ARC(floatxO,floatyO,floatxl,floatyl,floatx2,floaty2)

(

floatf=O.O,F;

floatdx=l.dy=l;

while(abs(x1-x2)>1)

(

if(f>=0)

(

xl=xl-dx;

yi=yi;

putpixel(xl,yl,l);

f=f-2*dx*(x1-xO)+dx*dx;

)

else

(

xl=x);

yl=yl+dy;

putpixel(xl,yl,l);

f=fA2*dy*(y1,yO)+dy*dy:

)

)

)

方法2:逆4象限

#include"graphics.h"

#includc"stdlib.h^^

//include"conio.h^^voidZDBJARC(floatxO,floatyO,floatxl,floatyl,floatx2,floaty2);voidmain()

intgdriver=CGA,mode=CGACO;

mitgraph(&gdriver,&mode,nH);

ZDBJ_ARC(0,0,0,25,25,0);

getch();

closcgraph();

)

voidZDBJ_ARC(floatxO.floatyO,floatxktloatyijloatx2,floaty2)

floatf=O.O,F;

floatdx=l,dy=l;

whi)e(abs(y1-y2)>1)

(

if(f>0)

(

xl=xl;

yl=yl-dy:

putpixcl(xl,yl,l);

仁f-2*dy*abs(y1-yO)+dy*dy;

)

else

(

xl=xl+dx;

yi=yi;

putpixel(xl,yl,l);

仁仟2*dx*abs(xl-x0)+dx*dx;

)

)

)

方法3:順I(yè)象限

#inckidc“graphics.h"〃省略了圖形初始化的步驟

#include"conio.h"

#include"math.h"

voidmain()

(

intxl=5,yl=0,x2=0,y2=5;

intx0=0.y0=0;

intR=sqrt((x2-x0)*(x2-xO)+(y2-yO)*(y2-y0));

intdx=abs(x2-xl);

intdy=abs(y2-yl);

intn=dx+dy:

putpixcl(x2,y2,l);

intf;

intx=x2,y=y2;

fbr(inti=O;i<n:i++)

(

f=(x-xO)*(x?xO)+(y,yO)*(y-yO)-R*R;

if(Q=O)

putpixel(x,y—,1);

else

putpixel(x++,y,I);

}

getch();

closegraph();

)〃另一種做法是采用課本P97頁表4.2的公式

4.編一程序用角度DDA法而一圓〃以圓點為圓心,半徑為20的圓

#include“graphics.h"〃省略了圖形初始化的步驟

/include"conio.h"

#include"math.h"

voidmain()

(

intx0=0,y0=0,R=20;

intxl,yl,xi,yi;

intN=R*8;

floata=2*3.14/N;

xl=20,yl=0;

fbr(inti=l;i<=N;i++)

(

xi=xO+R*cos(i*a)

yi=yO+R*sin(i*a);

Iine(xl,yl,xi.yi);

xl=xi;

yi=yi;

)

getch();

closegraphO:

)

5.如果線段端點坐標值不是整數(shù),采用DDA算法產(chǎn)生的直線和將端點坐標值先取整后再用

Bressenham算法產(chǎn)生的直線是否完全相同?為什么?能否擴充整數(shù)Bressenham算法使之能夠處理

當線段端點坐標值不是整數(shù)的情況。

答:不相同。因為DDA算法總是選擇Ax或者Ay中的較大者作為步進的方向,不失一般性,假設

選擇x方向,則x方向每前進一個像素點,y方向前進的像素點個數(shù)應該在[0,1]區(qū)間,但是由于采

用了(向上或者向下或者四舍五入)取整運算,必然會導致某些像素點偏在

了真實直線的一惻。而Bressenham算法每一步都會根據(jù)實際直線與網(wǎng)格的距離來決定下一個像素

點的選擇,因此所選像素點更加貼近于真實的直線。

可以擴充整數(shù)Bressenham算法使之能夠處理當線段端點坐標值不是整數(shù)的情況。

6,若采用Bresenham算法實現(xiàn)畫圓,寫出算法實現(xiàn)的具體流程(包括判別公式推導等等)。

答:給定圓心在原點,半徑為R的圓,其方程為xSARl構造函數(shù)F(x,y)=x2+y2-Rl對于圓上的點,

有F(x,y)=O;對于圓外的點,F(x.y)>0;而對于圓內(nèi)的點,F(x,y)<0,>

此處僅考慮如圖所示的第一象限內(nèi)xe\Q,R4八的1/8圓弧,此時中點Bresenham畫

圓算法要從(0,R)到(R/很,R;很)順時針地確定最佳逼近于該則弧的像素序列。

假定當前與圓弧最近者已確定,為P(Xi,*),那么卜.一候選像素只能是正右方的Pu(xi+1,而和右下方

的Pd(%+1,41)?到底選取哪一個候選點依舊用中點進行判別。

假設M是Pu和Pd的中點,即有M(Xi+l,yr0.5),貝IJ3F(KM,yM)<0,M在圓內(nèi),這說明Pu離圓

弧更近,應取其為下一個像素點;當F(XM,yM)>0.M在圓外,說明Pd離圓弧更近;當F(XM,

yM)=0,則約定取Pd。

222

構造判別式di=F(xM,yM)=F(xi+1,yj-0.5)=(Xj+l)+(yi-05)-R

⑴當divO,取Pu(xi+l?i),計算下一步的的判別式

222

di+i=F(Xu,yu)=F(xj+2,yr().5)=(xj+2)+(yr0.5)-R=d;+2xi+3

所以沿正右方向,LJ的增量為2為+3。

(2)當di>0,取Pd(xi+l,yi+l),計算下一步的的判別式

22

di+i=F(Xd,yd)=F(xj+2,*-1.5)=(&+2)+(yi-1.5)-RJ姑2(祖-*)+5

所以沿右下方向,山的增量為2(冶-*)+5。

顯然,所繪制圓弧段的第一個像素為P*0.R),因此判別式do的初始值為1.25-R,可以令d-d?

0.25米擺脫小數(shù)運算,貝IJ判別式由X)對應了可7-0.25,由Td始終是整數(shù),A<-0.25等價丁diy0。

7.已知4個型值點(1.0,2.0),(2.5,3.5),(4.0,4.5),(5.0,4.0),求各段三次樣條曲線。

Si(X)(i=l,2,3)?設邊界條件為拋物線端解:ml=x2-xl=1.5,m2=x3-x2=1.5,m3=x4-x3=l;

A2=m2/(m2+mI)=0.5;

u2=m1/(m1+m2)=0.5;

X3=m3/(m2+m3)=0.4;(1.0,2.0)(5.0,4.0)

u3=m2/(ni2+m3)=0.6;

R2=3*[u2*(y3-y2)/m2+X2*(y2-yl)/m

g.S;

R3=3*[u3*(y4?y3)/m3+入3*(y3-y2)/m2]=-0.1;

于是有

0.5bl+2b2+0.5b3=2.5............(1)

0.4b2+2b3+0.6b4=-0.1..........(2)

又邊界拋物線端

bl+b2=2......................(3)

b3+b4=.l......................(4)

由⑴,(2),(3),(4)得

bl=39/38,b2=37/38,b3=3/38.b4=-41/38

從而

cl=-l/57;

dl=O;

c2=-l/57;

d2=-64/513;

c3=-ll/19;

d3=0;

故可得

sl(x)=2+39/38(x-l)-l/57(x-l)2xc(1.0,2.5]

s2(x)=3.5+37/38(x-2.5)-1/57(x25)2-64/513(X25)3xe[2.5,4.0]

s3(x)=4.5+3/38(x-4)-ll/19(x-4)2xe[4.0,5.0]

8.已知4個型值點坐標值PO(5,5)、Pl(10,15).P2(15,10).P3(10,5),繪一個三次貝塞爾曲

線。

解:

用矩陣表示為

p(t)=[t3t2tUP[pOplp2p3]T

p=-13-31

3-630

-3300

1000

P(0)=[5,5J

p(0.15)=(7.215,8.536]

p(0.35)=[9.83,10.64]

p(0.5)=[11.25,10.625]

p(02=[12.015,9.615]

p(0.85)=[l1.606,7.198|

P(D=[10,5]

將上面各點相連可以畫出二次貝塞爾曲線。

9.編寫一個繪制Bezier曲線的程序。

該程序根據(jù)以下數(shù)據(jù)點IX,y]:[50,100][80,230][100,270](140,160][180,50]|240,65][270,

120][330,230][380,230][430,150]計算出結果,并實現(xiàn)三段首尾相接的三次貝塞爾曲線在屏幕上

顯示的功能,采用/C++語言實現(xiàn);

/include"graphics.h^^

#include'^conio.h^^

#include"stdio.h"

typedefstruct

(

doublex,y;

}DPOINT:〃定義結構體

classBezier"定義Bezier類

(

private:

DPOINT*bP;

intmmaxindex;

voiddrawFrame();

voiddrawCuneQ;

voiddrawCurve(intpOjntpl,intp2,intp3);

public:

Bezier(DPOINT+p,intlen);〃定義構造函數(shù)

voiddraw();

};

Bezier::Bezier(DPOINT*p,intlen)"構造函數(shù)的實現(xiàn)

(

this->bP=p;

m_maxlndex=len-l;

)

voidBezier::draw()"通過公有函數(shù)調(diào)用私有函數(shù)

(

drawFranie();

drawCurveQ;

)

voidBezier::drawFrame()〃其功能是繪制出多邊形和各個端點

(

setcolor(I2);

fbr(inti=O;i<m_maxIndex;i++)

Iine(bPIiJ.x.bP[i].y,bP[i+l].x,bP[i+l].y);〃繪制多邊形

circle(bP[i].x,bP[i].y,5);〃繪制各個端點

circle(bP|m_maxIndex].x,bPlm_maxIndex].y,5);

voidBezier::drawCunze()〃實現(xiàn)多段Bezier曲線繪制的功能(

fdr(inti=0;i<=m_maxIndex-3;i+=3)

drawCurve(i,i+l,i+2,i+3);

voidBezier::drawCurvc(intpO.intpl,intp2,intp3)"實現(xiàn)繪制某一段Bezier曲線的功能

(

doubletmpx=0.0:

doubletmpy=0.0;

doublet=0.0;

fdr(;t<=l.O;t+=O.OOl)

(

tmpx=(-bP[pO].x+3*bP[pl].x-3*bPrp2].x+bP[p3].x)*t*t*t+(3*bP[pO].x-6*bP|pl].x+3*bPfp2].x)*

t*t+(-3*bP[pO].x+3*bP[p11.x)*t+bP[pO].x;

tmpy=(-bP[pO].y+3*bP[pl].y-3*bP[p2].y+bP[p3].y)*t*t*t+(3*bP[p0].y-6*bP[pl].y+3*bP

[p2].y)*t*t+(-3*bP[pO].y+3*bP[p1].y)*t+bP[pO].y;

putpixel(lmpx,impy、3);voidmain()"主函數(shù)的實現(xiàn)

(

intgraphdriver=DETECT,graphmode;

initgraph(&graphdrivcr,&graphmodc,"E:\\tc3\\bgi");

setbkcolor(15);

DPOINT*p;

p=newDPOINT[10|;

p[0].x=50.0;

p[0].y=100.0;

p[l].x=80.0;

p[l].y=230.0;

p[2].x=100.0;

p[2].y=270.0;

p[3].x=140.0;

p|3].y=160.0;

p[4].x=180.0;

p[4].y=50.0;

p[5J.x=240.0;

p[5].y=65.O;

p[6].x=270.0;

p|6J.y=120.0;

p[7].x=330.0;

p[7].y=230.0;

p|8].x=380.0;

p|8|.y=230.0;

p[9].x=430.0;

pf91.y=150.0;

Bezierbzr(p.lO);

bzr.draw();

deletep;

getch();

closcgraphQ;

10.編寫一個繪制B樣條曲線的程序。

該程序根據(jù)以下數(shù)據(jù)點[x,y]:P0[50,130]PI[120,40]P2[100,270]^11P3[140,160]計算出潔果,

并實現(xiàn)兩段首尾相接的兩次B樣條曲線在屏幕上顯不的功能,采用了C++語言實現(xiàn);

將已知點代入式(4-19)可得兩段兩次B樣條曲線方程:

'1-2l"50130

=

pi(o![Ft1]-22012040

_110J[100270

=[-45160]r+|70-90]?+[8585]

1-211F12040

3(0=-|r?1)-22

270

110100

160

OJ[140

=[30-170]?+[-20230]?+[110155]

#include"graphics.hn

#includc"conio.hu

#includc"stdio.h**

typedefstiuct

(

doublex.y;

}DPOINT:〃定義結構體

classBSpline〃定義B樣條曲線類

(

private:

DPOINT*bP;

intinmaxindex;"有多少個型值點voiddrawFrame();

voiddrawCun?c();

voiddrawCun?e(intpO.intpl,intp2);

public:

B_Spline(DPOINT*p,intlen);〃定義構造函數(shù)voiddraw();

B_Spline::B_Spline(DPOINT*p,intlen)〃構造困數(shù)的實現(xiàn)

(

this->bP=p;

m_maxlndex=len;

voidB_Spline::draw()//通過公有函數(shù)調(diào)用私有函數(shù)

(

drawFrame();

drawCurve();

voidB_Spline::drawFrame()"其功能是繪制出多邊形和各個端點(

setcolor(12);

fdr(inti=O;i<m_maxIndex-I:i++)

(

line(bP[i].x,bP[i].y,bP[i+l].x,bP[i+l].y);〃繪制多邊形

circle(bP[i].x,bP[i].y,5);〃繪制多邊形各個端點

)

circle(bP[m_maxlndex-l].x,bP[m_maxlndex-1].y,5);

voidB_Spline::drawCurvc()”實現(xiàn)多段B樣條曲線繪制的功能

(

fbr(inti=0:i<m_niaxIndex-2;i+4-)

(

drawCurve(i,i+l,i+2);

voidB_Spline::drawCurve(intpO,intpl,intp2)〃實現(xiàn)繪制某一段Bezier曲線的功能(

doubleimpx=0.0;

doubletmpy=0.0:

doublet=0.0;

tbr(;tv=l.O;t+=O.OOl)

tmpx=(0.5*bP[p0].x?bP[pl].x+O.5*bP[p2].x)*t*t+(-

bP|pOl.x+bP|pl|.x)*t+O.5*bP|p0|.x+0.5*bP|plj.x;

tmpy=(O.5*bP[pO].y-bP[pI].y+O.5*bP[p2].y)*l*t+(-bP[pOl.y+bP|pl].y)*t+O.5*bP[pO].y+O.5*bP|p

i].y;

putpixel(tmpx,tmpy,3):voidmain()〃主函數(shù)的實現(xiàn)

(

intgraphdriver=DETECT,graphmode;

initgraph(&graphdrivcr.&graphmodc,n");〃圖形初始化

setbkcolor(l5);

DPOINT*p;

p=ncwDPOINT[4];

p[0].x=50.0;

plOj.y-130.0;

p[l].x=120.0;

p[l].y=40.0;

p[2].x=190.0;

p[2].y=130.0;

p[3].x=260.0;

p|3|.y=40.0;

B_Splineb_sp(p,4);

b_sp.draw();

deletep;

getch();

closegraphQ;

}

11.簡述NURBS曲線產(chǎn)生的背景和特點?

答:NURBS曲線具有局部可調(diào)性、凸包性、幾何和透視投影變換不變性等等,它采用有理

參數(shù)多項式可以精確表示圓錐曲線、二次曲面等,對于幾何造型算法提供了思路。

12.將下列數(shù)據(jù)

X261()121416

Y3811131517

按最小二乘法曲線擬合,分別求一次和二次多項式曲線,擬合以上數(shù)據(jù)并畫圖表示。

解:如下表所示:

jX]中,

1236412816

26848362882161296

3101111010011001000KKOO

412131561441872172820736

514152101962940274438416

616172722564352409665536

6

Z6067802736105649792136000

Z=1

一次多項式的情形:

6%+60%=67,%=1.4608

60%+736q=802-=0.9706

所求多項式為y=f(x)=1.4608+0.9706x

二次多項式的情形:

6%+60%+736但=67%=1.0793

60%+736%+9792a2=802%=1.0921

736%+9792處+1360006Z2=10564o2=-

八八八、rc

所求多項式為y=f(x)=1.0793+1.0921x-0.006796x2

(10*

13.設五邊形的五個頂點坐標為(10,10),(15,5),(12,5),(8,2)和(4,5),利用多邊形區(qū)域填充算法,編

一程序生成一個實心圖。

解:假設以上五個頂點依次對應編號A-B-C-D-E,首先計算得到ET表:

用「存放AET活動邊表

該多邊形的AET指針的內(nèi)容為:

1AET為空

^ETEA呼

______>.10106/5_____>1010-1

具體編程實現(xiàn)如下:

第1步:(1)根據(jù)輸入的五個頂點坐標找到y(tǒng)值最小的點(例如點D,此時廣2),并找到與D

有邊關系的兩個頂點(此時為E和C),在y=2處建立ET邊表記錄(ymax、xi和tn值均可通

過頂點坐標間的計算得到,例如DE邊的建立,特別注意:當D點和E點y坐標值相同時,也

即是DE與x軸平行,該邊不能計入ET邊表),之后標記D點被訪問過;(2)排除訪問過的

點以及和該點相關聯(lián)的邊,重復(1)直至將ET表建立完善。

[注]邊關系的建立可通過鄰接矩陣的數(shù)據(jù)結構實現(xiàn),權值可以為該矩陣行編號對應點的y坐

標值,ET邊表采用鄰接表的數(shù)據(jù)結構

第2步:根據(jù)ET表構建AET表,并逐行完成多邊形填充,具體的C++代碼如下:

⑴建立頭文件baseclass.h,主要是邊表結點結構體和ET邊袤類的實現(xiàn)

enumResultCode{Success,Failure);

template<classT>

structEnode

(

Enodc(){ncxt=NULL;}

Enode(Tpymax,floatpxi,floatpm.Enode*pnext)

{

ymax=pymax;xi=pxi;

m=pm;next=pnexl;

)

Tymax,xi;"ymax表示最大的y值,xi表示最底端點的x坐標值

floatm;〃m表示斜率的倒數(shù)

Enode*next;

}:〃定義了ET表和AET表中結點的結構體

template<classT>

classET

(

public:

ET(intmSize);

~ET();

RcsultCodcInscrt(intu,Tymax,floatxi,floatin);

intn;//覆蓋該多邊形的掃描線的總數(shù),從0開始計數(shù)Enode<T>**a;

};〃定義了邊表類

template<classT>

ET<T>::ET(intmSize)

(

n=mSize;

a=newEnode<T>*[n];

fdr(inti=0;ivn;i++)a[i]=0;

}//ET邊表的初始化

template<classT>

ETvT>::~ET()

(

Enode<T>*p,*q;

deletea[0];

for(inti=l;ivn;i++)

{

p=a[i];q=p;

while(p)

(

p=p->ncxt;

deleteq;

q=p;

)

)

delete[]a;

}〃析構函數(shù)負責回收內(nèi)存空間

template<classT>

ResultCodeET<T>::Insert(intu,Tymax,floatxi.floatm)

(

if(u<0||u>n-l)returnFaiure;

Enode<T>*p=newEnode<T>(ymax,xi,m,a[u|);

a[u]=p:

returnSuccess;

}〃依次插入結點構建出這表,其中a[l]到a[10]用于構建ET邊表

〃a[0]用于構建活動AET邊表

⑵填充函數(shù)po_fill的實現(xiàn)和主函數(shù)的實現(xiàn)

#include"baseclass.h"

#include"graphics.h''

#inckide<iostream.h>

voidpo_fill(ET<int>&ctp,intcp,intcolor)〃多邊形填充函數(shù)的實現(xiàn)

inti=l;〃i作為控制變量標識掃描線

while(i<cp-l)

if(ctp.a[i!!=NULL)

(

Enodc<int>*p,*r;

p=etp.a[i];

r=etp.a[O];

while(p)

(

Enode<int>*q=newEnode<int>(p->ymax,p->xi,p->m,NULL);

if(!etp.a[O]){etp.a[O]=q;r=q;}

else

ififr->xi==q->xi){q->next=r->next;r->next=q;r=q;}if(r->xi>q->xi){etp.a[O]=q;

q->next=r;}

else{

while(q->xi>r->xi&&r->next)

r=r->ncxt;

if(r->next){q->next=r->next;r->next=q;}else{r->next=q;q->next=NULL;|

p=p->next;

)

)〃按照Xi值的大小將當前ET表中的記錄放置到AET表中

Enode<int>

if(etp.a|O|)

(

f=etp.a[O];

while(fA>next)

(

g=f;

f=S>ncxt;

for(intj=g->xi;j<=g->ncxt->xi;j++)putp:xel(j,i,color);

)〃把一對相鄰結點的xi區(qū)間范圍進行填充}

if(etp.aIO]!=NULL)

Enode<int>*w;

ints=l;

while(s)

Enode<int>*z=NULL:

w=etp.a[O];

s=0;

while(w&&w->ymax!=i)

(

z=w;w=w->next;

)

if(!w)break;

if(z)z->ncxt=w->ncxt;

elseetp.a(O|=w->ncxt;

deletew;

s=l;

)〃刪去AET表中i值已經(jīng)等于ymax的結點記錄

if(etp.a[O])

(

Enode<int>*u,*v;

u=etp.a[O];

while(u)

u=u->next;

v->xi=v->xi+v->m;

)

)〃用xi+m來替代原有的xi

1

i++;〃進入卜一條掃描線

)

}

voidinain()"主函數(shù)的實現(xiàn)

(

intgdrivcr,gmode;

gdriver=DETECT;

gmode=VGAHI;

initgraph(&gdriver,&gmode,"°);〃圖形系統(tǒng)初始化

intc=ll;

intcolor=5;//color用于標識填充顏色ET<int>ct(c);

et.lnsert(2,5,8,4/3);

et.Insert(2,5,8,-4/3);

et.Insert(5,l0,15,-1);

et.!nserl(5,l0,4,6/5);根據(jù)初始數(shù)據(jù)建立邊表

po_fill(et,e,color);"調(diào)用填充函數(shù)

getch();

closcgraph();

)

[注]第2步的實現(xiàn)存在兩個問題:(1)沒有實現(xiàn)世界坐標系統(tǒng)(第1象限)到設備坐標系統(tǒng)的轉換,

所以顯示出來的圖形是以上所畫圖形的倒置,解決方法就是從世界坐標系統(tǒng)的最高y值開始掃

描;(2)由于m的取值為分數(shù)(浮點型),這就導致像素點坐標值出現(xiàn)浮點型,這樣經(jīng)過取整運

算,計算出來的像素點坐標值將可能與多邊形填充點真實值之間存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論