版權(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é)研究的基本內(nèi)容?
答:見(jiàn)課本P5-6頁(yè)的1.1.4節(jié)。
2、計(jì)算機(jī)圖形學(xué)、圖形處理與模式識(shí)別本質(zhì)區(qū)別是什么?請(qǐng)各舉一例說(shuō)明。
答:計(jì)算機(jī)圖形學(xué)是研究根據(jù)給定的描述,用計(jì)算機(jī)生成相應(yīng)的圖形、圖像,且所生成的圖形、
圖像可以顯示屏幕上、硬拷貝輸出或作為數(shù)據(jù)集存在計(jì)算機(jī)中的學(xué)科。計(jì)算機(jī)圖形學(xué)研究的是從數(shù)
據(jù)描述到圖形生成的過(guò)程。例如計(jì)算機(jī)動(dòng)畫(huà)制作。
圖形處理是利用計(jì)算機(jī)對(duì)原來(lái)存在物體的映像進(jìn)行分析處理,然后再現(xiàn)圖像。例如工業(yè)中的射
線探傷。
模式識(shí)別是指計(jì)算機(jī)對(duì)圖形信息進(jìn)行識(shí)別和分析描述,是從圖形(圖像)到描述的表達(dá)過(guò)程。
例如郵件分撿設(shè)備掃描信件上手寫(xiě)的郵政編碼,并將編碼用圖像復(fù)原成數(shù)字。
3、計(jì)算機(jī)圖形學(xué)與CAD、CAM技術(shù)關(guān)系如何?
答:見(jiàn)課本P4-5頁(yè)的1.1.3節(jié)。
4、舉3個(gè)例子說(shuō)明計(jì)算機(jī)圖形學(xué)的應(yīng)用。
答:①事務(wù)管理中的交互繪圖
應(yīng)用圖形學(xué)最多的領(lǐng)域之一是繪制事務(wù)管理中的各種圖形。通過(guò)從簡(jiǎn)明的形式呈現(xiàn)出數(shù)據(jù)的模
型和趨勢(shì)以增加對(duì)復(fù)雜現(xiàn)象的理解,并促使決策的制定。
②地理信息系統(tǒng)
地理信息系統(tǒng)是建立在地理圖形基礎(chǔ)上的信息管理系統(tǒng)。利用計(jì)算機(jī)圖形生成技術(shù)可以繪制地
理的、地質(zhì)的以及其它自然現(xiàn)象的高精度勘探、測(cè)量圖形。
③計(jì)算機(jī)動(dòng)畫(huà)
1
用圖形學(xué)的方法產(chǎn)生動(dòng)畫(huà)片,其形象逼真、生動(dòng),輕而易舉地解決了人工繪圖時(shí)難以解決的問(wèn)
題,大大提高了工作效率。
5、計(jì)算機(jī)繪圖有哪些特點(diǎn)?
答:見(jiàn)課本P8頁(yè)的1.3.1節(jié)。
6、計(jì)算機(jī)生成圖形的方法有哪些?
答:計(jì)算機(jī)生成圖形的方法有兩種:矢量法和描點(diǎn)法。
①矢量法:在顯示屏上先給定一系列坐標(biāo)點(diǎn),然后控制電子束在屏幕上按一定的順序掃描,逐
個(gè)"點(diǎn)亮"臨近兩點(diǎn)間的短矢量,從而得到一條近似的曲線。盡管顯示器產(chǎn)生的只是一些短直線的線
段,但當(dāng)直線段很短時(shí),連成的曲線看起來(lái)還是光滑的。
②描點(diǎn)法:把顯示屏幕分成有限個(gè)可發(fā)亮的離散點(diǎn),每個(gè)離散點(diǎn)叫做一個(gè)像素,屏幕上由像素
點(diǎn)組成的陣列稱為光柵,曲線的繪制過(guò)程就是將該曲線在光柵上經(jīng)過(guò)的那些像素點(diǎn)串接起來(lái),使它
們發(fā)亮,所顯示的每一曲線都是由一定大小的像素點(diǎn)組成的。當(dāng)像素點(diǎn)具有多種顏色或多種灰度等
級(jí)時(shí),就可以顯示彩色圖形或具有不同灰度的圖形。
7、當(dāng)前計(jì)算機(jī)圖形學(xué)研究的課題有哪些?
答:見(jiàn)課本P10-11頁(yè)的1.4節(jié)。
8、簡(jiǎn)述三維圖形生成和輸出的流水線?
答:見(jiàn)課本P13頁(yè)1.5.6節(jié)。
9、向量圖形和點(diǎn)陣圖形之間的區(qū)別有哪些?
答:通過(guò)矢量法產(chǎn)生的圖形稱為矢量圖形或者向量圖形,用描點(diǎn)法產(chǎn)生的圖形稱為點(diǎn)陣圖形。向量
圖形區(qū)別點(diǎn)陣圖形的特點(diǎn)在于描述圖形幾何形狀的數(shù)學(xué)模型及依據(jù)此模型生成幾何圖形的計(jì)算機(jī)
命令。向量圖形由各個(gè)基本圖形構(gòu)成,這就要求各個(gè)基本圖形有各自獨(dú)立的信息。如果用點(diǎn)陣圖形
來(lái)表示一個(gè)向量圖形,構(gòu)成向量圖形的某個(gè)基本圖形(如直線段、圓弧等)的所有點(diǎn)應(yīng)有一個(gè)信息。
因此,在描述一個(gè)基本圖形時(shí),同時(shí)要描述其相應(yīng)的信息。向量圖形最基本的優(yōu)點(diǎn)是它本身是由精
2
確的數(shù)據(jù)給出,所以可以充分利用各種輸出圖形設(shè)備的分辨率盡可能精確地輸出圖形。也正因?yàn)槿?/p>
此,向量圖形的尺寸可以任意變化而不損失圖形顯示的質(zhì)量。但是向量圖形僅適合于描繪簡(jiǎn)單圖形,
而點(diǎn)陣圖形可以描繪絢爛多彩的復(fù)雜圖形。
10、什么是虛擬現(xiàn)實(shí)技術(shù)和可視化技術(shù)?
答:虛擬現(xiàn)實(shí)技術(shù):利用計(jì)算機(jī)生成一種模擬環(huán)境,通過(guò)多種傳感器和設(shè)備使用戶"投入"到該
環(huán)境中,實(shí)現(xiàn)用戶和該環(huán)境直接進(jìn)行交互的技術(shù)。例如模擬飛機(jī)駕駛艙。
可視化技術(shù)通過(guò)對(duì)空間數(shù)據(jù)場(chǎng)構(gòu)造中間幾何因素或用圖形繪制技術(shù)在屏幕上產(chǎn)生二維圖像。
例如分子模型構(gòu)造。
第二章
1、計(jì)算機(jī)圖形系統(tǒng)有什么特點(diǎn)?有哪些主要功能?
答:課本2.1.1
2、計(jì)算機(jī)圖形系統(tǒng)有哪幾種?各有什么特點(diǎn)?
答:一種分類方法:交互式圖形系統(tǒng)允許操作者以某種方式(對(duì)話方式或命令方式)來(lái)控制和操
作圖形生成過(guò)程,使得圖形可以邊生成、邊顯示、邊修改,直至符合要求為止。而被動(dòng)式繪圖系統(tǒng),
圖形在生成過(guò)程中,操作者無(wú)法對(duì)圖形進(jìn)行實(shí)時(shí)操作和控制,不具備交互功能,只提供各種圖形命
令或圖形程序庫(kù),通過(guò)編程獲得所需圖形。
另一種分類方法:見(jiàn)課本2.1.3節(jié),分為脫機(jī)繪圖系統(tǒng)、聯(lián)機(jī)繪圖系統(tǒng)和交互式繪圖系統(tǒng)。
3、陰極射線管由哪些部分組成?它們的功能分別是什么?
答:CRT由四部分組成:電子槍、聚焦系統(tǒng)、偏轉(zhuǎn)系統(tǒng)和熒光屏,這四部分都在真空管內(nèi)。電
子槍由燈絲、陰極和控制柵極組成。燈絲加熱陰極,陰極表面向外發(fā)射自由電子,控制柵控制自由
電子是否向熒光屏發(fā)出,若允許電子通過(guò),形成的電子流在到達(dá)屏幕的途中,被聚焦系統(tǒng)(電子透
3
鏡)聚焦成很窄的電子束,由偏轉(zhuǎn)系統(tǒng)產(chǎn)生電子束的偏轉(zhuǎn)電場(chǎng)(或磁場(chǎng)),使電子束左右、上下偏
轉(zhuǎn),從而控制熒光屏上光點(diǎn)上下、左右運(yùn)動(dòng),使得在指定時(shí)刻在屏幕指定位置上產(chǎn)生亮點(diǎn)。
4、光柵掃描顯示器由哪些部分組成?它們的功能分別是什么?
答:見(jiàn)課本P21頁(yè)圖2.9所展示的組成框圖,其后有各部分的介紹及功能。
5、對(duì)于分辨率為1024*1024的光柵系統(tǒng),若每一像素用8位和12位二進(jìn)制來(lái)表示存儲(chǔ)信息,各
需多大光柵存儲(chǔ)容量以及顯存?每一屏幕最多能顯示多少顏色?若R,G,B灰度都占8位,其顯
示顏色的總數(shù)是多少?
解:
1)每一像素用8位二進(jìn)制來(lái)表示存儲(chǔ)信息,所需容量為1024*1024*1=22。(Byte)=1MB
彩色素:28=256(項(xiàng))
2)若每一像素用12位二進(jìn)制表示存儲(chǔ)信息,所需容量為:1024*1024*1.5=1.5*22°
(Byte)=1.5MB(由于顯示卡的顯存是按2的指數(shù)次倍增長(zhǎng)的,因此所需顯存為2M)
彩色素:2'2=4096(項(xiàng))
3)顏色總數(shù):28*2‘*28=2"(種)
6、對(duì)于19英寸顯示器,若X和Y兩方向的分辨率相等,即1024*1024,那么每個(gè)像素點(diǎn)的直徑
是多少?
19*2S410
解:--=0.33(mm)或..尸=0.013(英寸)
1024V21024V2
7、對(duì)于分辨率為1024x768的光柵系統(tǒng),若調(diào)色板設(shè)置為真彩色32位,此時(shí)需要顯示一個(gè)三維
圖形,各需要多大光柵存儲(chǔ)容量以及顯存?
答:調(diào)色板為真彩色32位,即意味著像素值的位長(zhǎng)為32
所需容量為1024*768*32/8*3=9MB因此所需要的顯存為16M
8、GKS有哪三種坐標(biāo)系?它們有什么不同?試寫(xiě)出它們之間對(duì)應(yīng)關(guān)系?
4
答:GKS有3種不同的坐標(biāo)系。第一種是供應(yīng)用程序使用的實(shí)際世界坐標(biāo)系統(tǒng)
(WorldCoordinateSystem,簡(jiǎn)稱WC);第二種是GKS內(nèi)部使用的規(guī)范設(shè)備坐標(biāo)系
(NormalizedDeviceCoordinate,簡(jiǎn)稱NDC),它的取值范圍為[0,1],這是一種既與設(shè)備
無(wú)關(guān)也與應(yīng)用無(wú)關(guān)的坐標(biāo)系;第三種是各工作站物理設(shè)備使用的設(shè)備坐標(biāo)系
(DeviceCoordinateSystem,簡(jiǎn)稱DC).GKS只支持二維對(duì)象的圖形處理,因此上述3個(gè)坐
標(biāo)系都是二維坐標(biāo)系。詳見(jiàn)課本圖3.28的描述。
9、GKS中輸入設(shè)備有哪6種邏輯功能?請(qǐng)各舉出對(duì)應(yīng)的物理設(shè)備。
答:見(jiàn)課本2.4.5.節(jié)。
10、當(dāng)前主流的圖形軟件有哪些?
答:見(jiàn)課本2.6.3節(jié)。
第三章
1、編寫(xiě)畫(huà)一正方形程序,并在其中用不同的顏色畫(huà)15個(gè)正方形,每一個(gè)都比前一個(gè)小。
#include“graphics.h"
#include“conio.h"
voidmain()
(
inti,color=0,ls=0;
intj=700;
intgdriver=VGA;
intgmode=VGAHI;
,/H3-1批改說(shuō)明;
initgraph(&gdriver,&gmode/);
setbkcolor(15);?必須至少包含"graphics.h"
?initgraph(&gdriver,&gmode,n");
?必須包含15個(gè)正方形,一般用for循
環(huán),也可能用到while等。
for(i=0;i<225;i=i+15,j=j-30)
setcolor(color);
bar(i,i,j,j);
color++;
ls++;
)
getch();
closegraph();
)
2、用不同的線形繪制題1中的圖形
#include,,graphics.h,,
#include"conio.h"
voidmain()
(
inti,color=1,ls=0;
intj=700;
3-2批改說(shuō)明;
intgdriver=VGA;
?注意查看3」部分內(nèi)容
gmode=VGAHI;
initgraph(&gdriver,&gmode,'"');
setbkcolor(15);
for(i=0;i<=225;i=i+15,j=j-30)
6
setcolor(color);
〃setlinestyle(ls%4,0,1);或者
setlinestyle(4,ls,3);
rectangle(i,i,j,j);
setfillstyle(SOLID_FILL,color);
〃floodfill(getmaxx()/2,getmaxy()/2,color);此句會(huì)出現(xiàn)最后只用一種顏色填充
的情況
color++;
ls++;
)
getch();
closegraph();
)
3、畫(huà)一五顏六色的圖(此例為畫(huà)一個(gè)五顏六色的圓)
#include"graphics.h"
#includeHconio.hM
voidmain()
(
intdriver=DETECT,mode=0;
inti,start,end;
,w
initgraph(&driver,&mode/);3-3批改說(shuō)明;
start=0;?必須至少包含"graphies,h"
?initgraph(&gdriver,&gmode,
");
end=20;
for(i=0;i<18;i++)
(
setfillstyle(SOLID_FILL,i);
pieslice(300,200,start,end,100);
start+=20;
end+=20;
)
getch();
restorecrtmode();
)
4、編寫(xiě)一輛自行車在一公路上由右至左快速行駛的程序。
#include"stdlib.h"
#includengraphics.hn
#include"conio.hn
#include"stdio.h"
voidmain()
(
void*w;
intdriver=DETECT,mode=0/i,start/endj;
n
initgraph(&driver/&mode/");
cleardevice();
setbkcolor(15);
8
setcolor(CGA-LIGHTGREEN);
start=0;
end=180;
circle(387/290,37);
circle(525/290,37);
line(404,217,398,230);
line(436,217,429,230);
line(398,230,429,230);
line⑷3,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);
line(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);
9
for(i=350j=0;i>0;i—j—)
setfillstyle(EMPTY_FILL,O);
pieslice(387+j,290,start,end,37);
pieslice(525+j,290,start,end,37);
start+=40;
end+=40;
delay⑸;〃處于運(yùn)動(dòng)狀態(tài)的自行車車輪的軸線的繪制
putimage(i-1,200/w/COPY_PUT);
line(2,327,562,327);
delay(10);〃自行車行駛動(dòng)畫(huà)的實(shí)現(xiàn)
)
for(i=0;i<10;i++)
(
pieslice(37,290,start,end,37);
pieslice(175,290,start,end,37);
start+=40;
end+=40;
}〃處于靜止?fàn)顟B(tài)的自行車車輪的軸線的繪制
getch();
restorecrtmodeO;
closegraphQ;
)
10
5、試自行設(shè)計(jì)一個(gè)美術(shù)圖案,并且用程序?qū)崿F(xiàn)。
(略)
第四章
1.為什么說(shuō)直線生成算法是二維圖形生成技術(shù)的基礎(chǔ)?
答無(wú)論什么復(fù)雜圖形,它們都是由直線段和曲線段組成三維圖形經(jīng)投影后最終變成了二維圖形),
而圖形設(shè)備顯示曲線段時(shí),最終還是將曲線段轉(zhuǎn)化成一系列直線段逼近表示的。因此,所有圖形都
可以看成是由直線段組成的??蓞⒖颊n本圖4.10
2根據(jù)DDA畫(huà)直線算法,遍一程序求(0,0)到(4,12)和(0,0,)到(12,4)的直線
#include"graphics.h"
#include,,math.h),
voidDDA_Line(intx1,inty1,intx2,inty2)
(
floatincrex,increy,x,y,length;
inti;
if(abs(x2-x1)>abs(y2-y1))
Iength=abs(x2-x1);
else
Iength=abs(y2-y1);
increx=(x2-x1)/length;
increy=(y2-y1)/length;
x=x1;
y=y1;
11
for(i=1;i<=length;i++)
putpixel(x,y,1);
x=x+increx;
y=y+increy;
)
)
voidmainO
(
intdriver=DETECT,mode=0;
initgraph(&driver,&mode,"");
intxl=O,y1=0,x2=4,y2=12;
intx3=12,y3=4;
DDA_Line(x1,y1,x2,y2);
DDA_Line(x1,y1,x3,y3);
getch();
)
3根據(jù)逐點(diǎn)比較法編一程序畫(huà)一段圓弧,其圓心為(0,0),圓弧兩點(diǎn)為A(5,0)、B(0,5)
方法1:順4象限
#include"graphics.h"
#ir)clude"stdio.h"
#include"conio.h"
voidZDBJ_ARC(floatxO,floatyO,floatx1,floaty1,floatx2,floaty2);
12
voidmainO
intgdriver=CGA,mode=CGACO;
initgraph(&gdriver,&mode,"");
ZDBJ_ARC(O,0,25,0,0,25);
getch();
closegraph();
)
voidZDBJ_ARC(floatxO,floatyO,floatx1,floaty1,floatx2,floaty2)
(
floatf=0.0,F;
floatdx=1,dy=1;
while(abs(x1-x2)>1)
(
if(f>=0)
(
x1=x1-dx;
yi=yi;
putpixel(x1,y1,1);
f=f-2*dx*(x1-xO)+dx*dx;
)
else
13
x1=x1;
y1=y1+dy;
putpixel(x1,y1,1);
f=f+2*dy*(y1-yO)+dy*dy;
)
)
)
方法2:逆4象限
#include"graphics.h"
#include"stdlib.h"
#include"conio.h"
voidZDBJ_ARC(floatxO,floatyO,floatx1,floaty1,floatx2,floaty2);
voidmainO
(
intgdriver=CGA,mode=CGACO;
initgraph(&gdriver,&mode,"");
ZDBJ_ARC(0,0,0,25,25,0);
getch();
closegraph();
)
voidZDBJ_ARC(floatxO,floatyO,floatx1,floaty1,floatx2,floaty2)
14
floatf=0.0,F;
floatdx=1,dy=1;
while(abs(y1-y2)>1)
(
if(f>0)
(
x1=x1;
y1=y1-dy;
putpixel(x1,y1,1);
f=f-2*dy*abs(y1-yO)+dy*dy;
)
else
(
x1=x1+dx;
yi=yi;
putpixel(x1,y1,1);
f=f+2*dx*abs(x1-xO)+dx*dx;
)
)
)
方法3:順1象限
#include"graphics.h7/省略了圖形初始化的步驟
15
#include,,conio.h,,
#include"math.h"
voidmain()
(
intxl=5,y1=0,x2=0,y2=5;
intxO=O,yO=O;
intR=sqrt((x2-xO)*(x2-xO)+(y2-yO)*(y2-yO));
intdx=abs(x2-x1);
intdy=abs(y2-y1);
intn=dx+dy;
putpixel(x2,y2,1);
intf;
intx=x2,y=y2;
for(inti=0;i<n;i++)
(
f=(x-xO)*(x-xO)+(y-yO)*(y-yO)-R*R;
if(f>=0)
putpixel(x,y-,1);
else
putpixel(x++,y,1);
)
getch();
closegraph();
16
}〃另一種做法是采用課本P97頁(yè)表4.2的公式
4.編一程序用角度DDA法畫(huà)一圓〃以圓點(diǎn)為圓心,半徑為20的圓
#include"graphics.h"〃省略了圖形初始化的步驟
#includeHconio.hM
#include"math.h"
voidmain()
(
intxO=0,y0=0,R=20;
intx1,y1,xi,yi;
intN=R*8;
floata=2*3.14/N;
x1=20,y1=0;
for(inti=1;i<=N;i++)
(
xi=xO+R*cos(i*a)
yi=yO+R*sin(i*a);
Iine(x1,y1,xi,yi);
x1=xi;
yi=yi;
)
getch();
closegraph();
17
)
5.如果線段端點(diǎn)坐標(biāo)值不是整數(shù),采用DDA算法產(chǎn)生的直線和將端點(diǎn)坐標(biāo)值先取整后再用
Bressenham算法產(chǎn)生的直線是否完全相同?為什么?能否擴(kuò)充整數(shù)Bressenham算法使之能夠處理
當(dāng)線段端點(diǎn)坐標(biāo)值不是整數(shù)的情況。
答:不相同。因?yàn)镈DA算法總是選擇或者Ay中的較大者作為步進(jìn)的方向,不失一般性,假
設(shè)選擇x方向,則x方向每前進(jìn)一個(gè)像素點(diǎn),y方向前進(jìn)的像素點(diǎn)個(gè)數(shù)應(yīng)該在[0,1]區(qū)間,但是由于
采用了(向上或者向下或者四舍五入)取整運(yùn)算,必然會(huì)導(dǎo)致某些像素點(diǎn)偏在了真實(shí)直線的一側(cè)。而
Bressenham算法每一步都會(huì)根據(jù)實(shí)際直線與網(wǎng)格的距離來(lái)決定下一個(gè)像素點(diǎn)的選擇,因此所選
像素點(diǎn)更加貼近于真實(shí)的直線。
可以擴(kuò)充整數(shù)Bressenham算法使之能夠處理當(dāng)線段端點(diǎn)坐標(biāo)值不是整數(shù)的情況。
6.若采用Bresenham算法實(shí)現(xiàn)畫(huà)圓,寫(xiě)出算法實(shí)現(xiàn)的具體流程(包括判別公式推導(dǎo)等等)。
答:給定圓心在原點(diǎn),半徑為R的圓,其方程為x2+y2=R2,構(gòu)造函數(shù)F(x,y)=x2+y2-R2,對(duì)于圓
上的點(diǎn),有F(x,y)=0;對(duì)于圓外的點(diǎn),F(xiàn)(x,y)>0;而對(duì)于圓內(nèi)的點(diǎn),F(xiàn)(x,y)<0o
此處僅考慮如圖所示的第一象限內(nèi)XGhR/拉」的1/8圓弧,此時(shí)中點(diǎn)Bresenham畫(huà)圓算法
要從(0尺)到(R/VIR/點(diǎn))順時(shí)針地確定最佳逼近于該圓弧的像素序列。
構(gòu)造判別式d=F(XM,yM)=F(Xi+1,yi-0.5)=(Xi+1)2+(yi-0.5)2-R2
⑴當(dāng)di<0,取Pu(xi+1,yi),計(jì)算下一步的的判別式
di+i=F(Xu,yu)=F(Xi+2,yi-0.5)=(Xi+2)2+(yi-0.5)2-R2=di+2xi+3
所以沿正右方向,d的增量為24+3。
18
(2)當(dāng)di>0,取Pd(Xi+1,yi+1),計(jì)算下一步的的判別式
di+i=F(Xd,yd)=F(Xi+2,yi-1.5)=(Xi+2)2+(yi-1.5)2-R2=di+2(Xi-yi)+5
所以沿右下方向,d的增量為2(價(jià)0+5。
顯然,所繪制圓弧段的第一個(gè)像素為Po(O,R),因此判別式do的初始值為1.25-R,可以令
d'=d-0.25來(lái)擺脫小數(shù)運(yùn)算,則判別式di<0對(duì)應(yīng)于di<-0.25,由于d始終是整數(shù),di<-0.25等
價(jià)于
di<0o
7.已知4個(gè)型值點(diǎn)(1.0,2.0),(2.5,3.5),(4.0,4.5),(5.0,4.0),求各段三次樣條
曲線。Si(X)(i=1,2,3),設(shè)邊界條件為拋物線端
解:ml=x2-x1=1.5,m2=x3-x2=1.5,m3=x4-x37=d;Q
A2=m2/(m2+m1)=0.5;f1n°"
u2=m1/(m1+m2)=0.5;
A3=m3/(m2+m3)=0.4;
u3=m2/(m2+m3)=0.6;
R2=3*[u2*(y3-y2)/m2+A2*(y2-y1)/m1]=2.5;
R3=3*[u3*(y4-y3)/m3+A3*(y3-y2)/m2]=-0.1;
于是有
0.5b1+2b2+0.5b3=2.5...........(1)
0.4b2+2b3+0.6b4=-0.1...........(2)
又邊界拋物線端
b1+b2=2.............................(3)
b3+b4=-1............................(4)
由⑴,(2),⑶,⑷得
19
b1=39/38,b2=37/38,b3=3/38,b4=-41/38
從而
c1=-1/57;
d1=0;
c2=-1/57;
d2=-64/513;
c3=-11/19;
d3=0;
故可得
s1(x)=2+39/38(x-1)-1/57(x-1)2xe[1,0,2.5]
s2(x)=3.5+37/38(x-2.5)-1/57(x-2.5)2-64/513(x-2.5)3xe[2.5,4.0]
s3(x)=4.5+3/38(x-4)-11/19(x-4)2xe[4.0,5,0]
8.已知4個(gè)型值點(diǎn)坐標(biāo)值P0(5,5)、P1(10,15),P2(15,10)、P3(10,5),繪—
三次貝塞爾曲線。
解:
用矩陣表示為
p(t)=[t3t2t1]P[p0p1p2p3]T
P=p3-31、
3-633
-3300J
1000
p(0)=[5,5]
p(0.15)=[7.215,8.536]
20
p(0.35)=[9.83,10.64]
p(0.5)=[11.25,10.625]
p(0.65)=[12.015,9.615]
p(0.85)=[11.606,7.198]
p(1)=[10,5]
將上面各點(diǎn)相連可以畫(huà)出三次貝塞爾曲線。
9.編寫(xiě)一個(gè)繪制Bezier曲線的程序。
該程序根據(jù)以下數(shù)據(jù)點(diǎn)[x,y]:
[50,100][80,230][100,270][140,160][180,50][240,65][270,120][330,230][380,230][430,150]
計(jì)算出結(jié)果,并實(shí)現(xiàn)三段首尾相接的三次貝塞爾曲線在屏幕上顯示的功能,采用了C++語(yǔ)言實(shí)現(xiàn);
#include"graphics.h"
#include"conio.h"
#include"stdio.h"
typedefstruct
(
doublex,y;
}DPOINT;〃定義結(jié)構(gòu)體
dassBezier〃定義Bezier類
(
private:
DPOINT*bP;
intm_maxlndex;
21
voiddrawFrameQ;
voiddrawCurveO;
voiddrawCurve(intpO,intp1Jntp2Jntp3);
public:
Bezier(DPOINT*p,intlen);〃定義構(gòu)造函數(shù)
voiddraw();
);
Bezier::Bezier(DPOINT*p,intlen)//構(gòu)造函數(shù)的實(shí)現(xiàn)
(
this->bP=p;
m_maxlndex=len-1;
)
voidBezier::draw()〃通過(guò)公有函數(shù)調(diào)用私有函數(shù)
(
drawFrameQ;
drawCurve();
)
voidBezier::drawFrame()〃其功能是繪制出多邊形和各個(gè)端點(diǎn)
(
setcolor(12);
for(inti=0;i<m_maxlndex;i++)
(
line(bP[i].x,bP[i].y,bP[i+1].x,bP[i+1].y);〃繪制多邊形
22
circle(bP[i].x,bP[i].y,5);〃繪制各個(gè)端點(diǎn)
)
circle(bP[m_maxIndex].x,bP[m_maxIndex].y,5);
)
voidBezier::drawCurve()〃實(shí)現(xiàn)多段Bezier曲線繪制的功能
(
for(inti=0;i<=m_maxIndex-3;i+=3)
(
drawCurve(i,i+1,i+2,i+3);
)
)
voidBezier::drawCurve(intpO,intp1,intp2,intp3)//實(shí)現(xiàn)繪制某一段Bezier曲線的功能
(
doubletmpx=0.0;
doubletmpy=0.0;
doublet=0.0;
for(;t<=1.0;t+=0.001)
(
tmpx=(-bP[p0].x+3*bP[p1].x-3*bP[p2].x+bP[p3].x)*t*t*t+(3*bP[p0].x-6*bP[p1].x+3*bP[p2].x)*t*t+(-3*b
P[p0].x+3*bP[p1].x)*t+bP[p0].x;
tmpy=(-bP[p0].y+3*bP[p1].y-3*bP[p2].y+bP[p3].y)*t*t*t+(3*bP[p0].y-6*bP[p1].y+3*bP[p2].y)*t*t+(-3*b
P[p0].y+3*bP[p1].y)*t+bP[p0].y;
23
putpixel(tmpx,tmpy,3);
)
)
voidmain()〃主函數(shù)的實(shí)現(xiàn)
(
intgraphdriver=DETECT,graphmode;
initgraph(&graphdriver,&graphmode,"E:\\tc3\\bgi");
setbkcolor(15);
DPOINT*p;
p=newDPOINT[10];
p[0].x=50.0;
p[0].y=100.0;
p[1].x=80.0;
p[1].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[5].x=240.0;
p[5].y=65.0;
p[6].x=270.0;
24
p[6].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;
p[9].y=150.0;
BezierbzrCpJO);
bzr.drawQ;
deletep;
getch();
closegraphQ;
)
10.編寫(xiě)一個(gè)繪制B樣條曲線的程序。
該程序根據(jù)以下數(shù)據(jù)點(diǎn)[x,y]:P0[50,130]P1[120,40]P2[100,270]和P3[140,160]計(jì)算出結(jié)果,
并實(shí)現(xiàn)兩段首尾相接的兩次B樣條曲線在屏幕上顯示的功能,采用了C++語(yǔ)言實(shí)現(xiàn);
將已知點(diǎn)代入式(4-19)可得兩段兩次B樣條曲線方程:
1-2150130
凡(心⑹1]-22012040
2110
100270
=[-45160]?+[70-90]t+[8585]
1-2112040
丹。=_1[代力]-220100270
2110
140160
=[30-170]^+[-20230"+[110155]
25
#includengraphics.hn
#include"conio.hn
#indudenstdio.hn
typedefstruct
(
doublex,y;
}DPOINT;〃定義結(jié)構(gòu)體
dassB_Spline〃定義B樣條曲線類
(
private:
DPOINT*bP;
intm_maxlndex;〃有多少個(gè)型值點(diǎn)
voiddrawFrame();
voiddrawCurveO;
voiddrawCurve(intpO,intp1,intp2);
public:
B_Spline(DPOINT*p,intlen);〃定義構(gòu)造函數(shù)
voiddraw();
);
B_Spline::B_Spline(DPOINT*p,intlen)〃構(gòu)造函數(shù)的實(shí)現(xiàn)
(
this->bP=p;
m_maxlndex=len;
26
)
voidB_Spline::draw()〃通過(guò)公有函數(shù)調(diào)用私有函數(shù)
(
drawFrameQ;
drawCurve();
)
voidB_Spline::drawFrame()〃其功能是繪制出多邊形和各個(gè)端點(diǎn)
(
setcolor(12);
for(inti=0;i<m_maxlndex-1;i++)
(
line(bP[i].x,bP[i].y,bP[i+1].x,bP[i+1].y);〃繪制多邊形
circle(bP[i].x,bP[i].y,5);〃繪制多邊形各個(gè)端點(diǎn)
)
circle(bP[m_maxIndex-1].x,bP[m_maxIndex-1].y,5);
)
voidB_Spline::drawCurve()〃實(shí)現(xiàn)多段B樣條曲線繪制的功能
(
for(inti=0;i<m_maxlndex-2;i++)
(
drawCurve(i,i+1,i+2);
)
27
)
voidB_Spline::drawCurve(impO,intp1,intp2)〃實(shí)現(xiàn)繪制某一E殳Bezier曲線的功能
(
doubletmpx=0.0;
doubletmpy=0.0;
doublet=0.0;
for(;t<=1.0;t+=0.001)
(
tmpx=(O.5*bP[pO].x-bP[p1].x+O.5*bP[p2].x)*t*t-t-(-bP[pO].x+bP[p1].x)*t+O.5*bP[pO].x+O.5*bP[p1].x;
tmpy=(0.5*bP[p0].y-bP[p1].y+0.5*bP[p2].y)*t*t+(-bP[p0].y+bP[p1].y)*t+0.5*bP[p0].y+0.5*bP[p1].y;
putpixel(tmpx,tmpy,3);
)
)
voidmain()〃主函數(shù)的實(shí)現(xiàn)
(
intgraphdriver=DETECT,graphmode;
initgraph(&graphdriver,&graphmode「);〃圖形初始化
setbkcolor(15);
DPOINT*p;
p=newDPOINT[4];
p[0].x=50.0;
p[0].y=130.0;
28
p[1].x=120.0;
p[1].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(pz4);
b_sp.draw();
deletep;
getch();
closegraphO;
)
11.簡(jiǎn)述NURBS曲線產(chǎn)生的背景和特點(diǎn)?
答:NURBS曲線具有局部可調(diào)性、凸包性、幾何和透視投影變換不變性等等,它采用有理參
數(shù)多項(xiàng)式可以精確表示圓錐曲線、二次曲面等,對(duì)于幾何造型算法提供了思路。
124各下列數(shù)據(jù)
X2610121416
Y3811131517
按最小二乘法曲線擬合,分別求一次和二次多項(xiàng)式曲線,擬合以上數(shù)據(jù)并畫(huà)圖表示。
解:如下表所示:
i
1236412816
29
26848362882161296
310111101001100100010000
412131561441872172820736
514152101962940274438416
616172722564352409665536
6067802736105649792136000
一次多項(xiàng)式的情形:
+60a,=67?0=1.46081
oO?0+736a1=802o,=0.97061
所求多項(xiàng)式為y=f(x)=1.4608+0.9706x
二次多項(xiàng)式的情形:
國(guó))+60q+736a2=67%)=1.0793(
SOa0+736a,+9792a2=802at=1.(^21<
736a0+9792a,+136000a2=10564%=-0.0&6796
所求多項(xiàng)式為y=f(x)=1.0793+1.0921x-0.006796x2
13.設(shè)五邊形的五個(gè)頂點(diǎn)坐標(biāo)為(10,10),(15,5),(12,5),(8,2)和(4,5),利用多邊形區(qū)域填充算法,
編一程序生成一個(gè)實(shí)心圖。
解:假設(shè)以上五個(gè)頂點(diǎn)依次對(duì)應(yīng)編號(hào)A-B-C-D-E,首先計(jì)算得到ET表:
30
6-10
匚,
1公/匚-1-11
4
3
n匚n
CQ//CQA/□
0用于存放AET活動(dòng)邊表
該多邊形的AET指針的內(nèi)容為:
1AET為空
31
4
具體編程實(shí)現(xiàn)如下:
第1步:(1)根據(jù)輸入的五個(gè)頂點(diǎn)坐標(biāo)找到V值最小的點(diǎn)(例如點(diǎn)D,此時(shí)y=2),并找到與D有邊
關(guān)系的兩個(gè)頂點(diǎn)(此時(shí)為E和C),在y=2處建立ET邊表記錄(ymax、xi和m值均可通過(guò)頂點(diǎn)坐標(biāo)
間的計(jì)算得到,例如DE邊的建立,特別注意:當(dāng)D點(diǎn)和E點(diǎn)v坐標(biāo)值相同時(shí),也即是DE與x
軸平行,該邊不能計(jì)入ET邊表),之后標(biāo)記D點(diǎn)被訪問(wèn)過(guò);(2)排除訪問(wèn)過(guò)的點(diǎn)以及和該點(diǎn)相關(guān)聯(lián)
的邊,重復(fù)(1)直至將ET表建立完善。
[注]邊關(guān)系的建立可通過(guò)鄰接矩陣的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),權(quán)值可以為該矩陣行編號(hào)對(duì)應(yīng)點(diǎn)的y坐標(biāo)值,
ET邊表采用鄰接表的數(shù)據(jù)結(jié)構(gòu)
第2步:根據(jù)ET表構(gòu)建AET表,并逐行完成多邊形填充,具體的C++代碼如下:
32
(1)建立頭文件base_class.h,主要是邊表結(jié)點(diǎn)結(jié)構(gòu)體和ET邊表類的實(shí)現(xiàn)
enumResultCode{Success,Failure};
template<classT>
structEnode
(
Enode(){next=NULL;}
Enode(Tpymax,floatpxi,floatpm,Enode*pnext)
(
ymax=pymax;xi=pxi;
m=pm;next=pnext;
)
Tymax,xi;//ymax表示最大的y值,xi表示最底端點(diǎn)的x坐標(biāo)值
floatm;//m表示斜率的倒數(shù)
Enode*next;
};〃定義了ET表和AET表中結(jié)點(diǎn)的結(jié)構(gòu)體
template<classT>
classET
(
public:
ET(intmSize);
~ET();
ResultCodeInsert(intu,Tymax,floatxi,floatm);
33
intn;〃覆蓋該多邊形的掃描線的總數(shù),從0開(kāi)始計(jì)數(shù)
Enode<T>**a;
};〃定義了邊表類
template<classT>
ET<T>::ET(intmSize)
(
n=mSize;
a=newEnode<T>*[n];
for(inti=0;i<n;i++)a[i]=0;
}〃ET邊表的初始化
template<classT>
ET<T>::~ET()
(
Enode<T>*p,*q;
deletea[O];
for(inti=1;i<n;i++)
(
p=a[i];q=p;
while(p)
(
p=p->next;
deleteq;
q=p;
34
)
)
delete[]a;
}〃析構(gòu)函數(shù)負(fù)責(zé)回收內(nèi)存空間
template<classT>
ResultCodeET<T>::Insert(intu,Tymax,floatxi,floatm)
(
if(u<0||u>n-1)returnFailure;
Enode<T>*p=newEnode<T>(ymax,xi,m,a[u]);
a[u]=p;
returnSuccess;
}〃依次插入結(jié)點(diǎn)構(gòu)建出邊表,其中a[1]到a[10]用于構(gòu)建ET邊表
〃a[0]用于構(gòu)建活動(dòng)AET邊表
(2)填充函數(shù)po_fill的實(shí)現(xiàn)和主函數(shù)的實(shí)現(xiàn)
#include"base_class.h"
#include"graphics.h"
#include<iostream.h>
voidpo_fill(ET<int>&etp,intep,intcolor)//多邊形填充函數(shù)的實(shí)現(xiàn)
(
inti=1;〃i作為控制變量標(biāo)識(shí)掃描線
while(i<ep-1)
35
if(etp.a[i]!=NULL)
Enode<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
(
if(r->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->next;
if(r->next){q->next=r->next;r->next=q;}
else{r->next=q;q->next=NULL;}
)
)
p=p->next;
)
}〃按照xi值的大小將當(dāng)前ET表中的記錄放置到AET表中
36
Enode<int>*f,*g;
if(etp.a[0])
f=etp.a[0];
while(f->next)
(
g=f;
f=f->next;
for(intj=g->xi;j<=g->next->xi;j++)
putpixel(j,i,color);
}〃把一對(duì)相鄰結(jié)點(diǎn)的xi區(qū)間范圍進(jìn)行填充
)
if(etp.a[O]!=NULL)
Enode<int>*w;
ints=1;
while(s)
(
Enode<int>*z=NULL;
w=etp.a[0];
s=0;
while(w&&w->ymax!=i)
37
z=w;w=w->next;
)
if(!w)break;
if(z)z->next=w->next;
elseetp.a[O]=w->next;
deletew;
s=1;
}〃刪去AET表中i值已經(jīng)等于ymax的結(jié)點(diǎn)記錄
if(etp.a[O])
(
Enode<int>*u,*v;
u=etp.a[O];
while(u)
(
v=u;
u=u->next;
v->xi=v->xi+v->m;
)
}〃用xi+m來(lái)替代原有的xi
)
i++;〃進(jìn)入下一條掃描線
)
38
)
voidmain()〃主函數(shù)的實(shí)現(xiàn)
(
intgdriver,gmode;
gdriver=DETECT;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"");//圖形系統(tǒng)初始化
inte=11;
intcolor=5;//color用于標(biāo)識(shí)填充顏色
ET<int>et(e);
et.Insert(2,5,8,4/3);
et.Insert(2,5,8,-4/3);
et.Insert(5,10,15,-1);
et.Insert(5,10,4,6/5);//根據(jù)初始數(shù)據(jù)建立邊表
po_fill(et,e,color);〃調(diào)用填充函數(shù)
getch();
closegraph();
)
[注]第2步的實(shí)現(xiàn)存在兩個(gè)問(wèn)題:(1)沒(méi)有實(shí)現(xiàn)世界坐標(biāo)系統(tǒng)(第1象限)到設(shè)備坐標(biāo)系統(tǒng)的轉(zhuǎn)換,所
以顯示出來(lái)的圖形是以上所畫(huà)圖形的倒置,解決方法就是從世界坐標(biāo)系統(tǒng)的最高y值開(kāi)始掃描;(2)
由于m的取值為分?jǐn)?shù)(浮點(diǎn)型),這就導(dǎo)致像素點(diǎn)坐標(biāo)值出現(xiàn)浮點(diǎn)型,這樣經(jīng)過(guò)取整運(yùn)算,計(jì)算出
39
來(lái)的像素點(diǎn)坐標(biāo)值將可能與多邊形填充點(diǎn)真實(shí)值之間存在偏差,導(dǎo)致所繪制的圖形不完全與實(shí)際吻
合。
14.已知多邊形各頂點(diǎn)坐標(biāo)為(2,2)(2,4)(8,6)(12,2)(8,1)(6,2)及(2,2),在用多邊形區(qū)域填充時(shí),請(qǐng)寫(xiě)
出ET及全部AET內(nèi)容。
解:如圖所示:
則該多邊形的ET表為:
6
5
ETDD2
C.D
4
3
6D7
An
2
cn6
oOA
該多邊形的AET指針的內(nèi)容為:(每條掃描線均有3行指針鏈,第1行表示將ET表加入AET中,
第2行表示從AET表中刪去yi=ymax,第3行表示Xi=Xi+1/m后,學(xué)生只要寫(xiě)出第2行即可)
、DuDI
OQA
40
oCo—
-cmXI——cacXI———34Z
on—con
cav,Qca(Q3v
onc3n
―cm<a___tac,a—3a/
G
uC□n—
cav-------CQCJ3——□V
Uc□—
mbricacq——□V
Pcczr—
,C1cac43————3-A/
pccnucB___1LI
cxu<□1-catq------caq——d_J
P
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康游戲環(huán)境-鄉(xiāng)村振興背景下孩子們的活動(dòng)樂(lè)園規(guī)劃策略
- 以學(xué)生為中心的初高中銜接期生物實(shí)驗(yàn)教學(xué)研究
- 企業(yè)團(tuán)隊(duì)建設(shè)中親子活動(dòng)的價(jià)值體現(xiàn)
- 大班秋天真美麗教案
- 從專業(yè)角度談家庭教育指導(dǎo)師的未來(lái)發(fā)展趨勢(shì)
- 創(chuàng)新型企業(yè)如何塑造企業(yè)文化
- 會(huì)展中心燈光節(jié)能技術(shù)的創(chuàng)新應(yīng)用研究報(bào)告
- 創(chuàng)新思維在商業(yè)模式創(chuàng)新中的應(yīng)用
- 創(chuàng)新思維在節(jié)日產(chǎn)品包裝設(shè)計(jì)中的運(yùn)用
- DIY戶外運(yùn)動(dòng)用品手工帳篷制作
- 學(xué)生心理危機(jī)干預(yù)工作流程
- 德語(yǔ)智慧樹(shù)知到答案章節(jié)測(cè)試2023年西安理工大學(xué)
- 全國(guó)2016年10月自考00043經(jīng)濟(jì)法概論(財(cái)經(jīng)類)試題及答案
- 凈化工程施工驗(yàn)收?qǐng)?bào)告正規(guī)版
- 分娩鎮(zhèn)痛規(guī)范及流程
- 基于改進(jìn)蟻群算法的移動(dòng)機(jī)器人路徑規(guī)劃研究共3篇
- 濟(jì)南美萊整形醫(yī)院?jiǎn)T工手冊(cè)
- 市場(chǎng)主體住所(經(jīng)營(yíng)場(chǎng)所)申報(bào)承諾書(shū)
- YS/T 649-2007銅及銅合金擠制棒
- GB/T 27030-2006合格評(píng)定第三方符合性標(biāo)志的通用要求
- 長(zhǎng)慶油田公司預(yù)防監(jiān)守自盜、內(nèi)勾外聯(lián)涉油違法犯罪專題法治講座
評(píng)論
0/150
提交評(píng)論