




已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)一 直線、圓弧及曲線的生成算法一、實(shí)驗(yàn)?zāi)康?、幾種直線生成算法的比較,特別掌握用Bresenham直線生成算法。2、幾種圓弧生成算法的比較,掌握Bresenham圓弧生成算法。3、掌握用像素點(diǎn)法直接生成其它曲線的方法。二、基本要求1、用不同的生成算法在屏幕上繪制出直線的圖形,對不同的算法可設(shè)置不同的線形或顏色表示區(qū)別。2、用Bresenham生成算法在屏幕上繪制出圓弧的圖形,用動(dòng)畫的方式表演圖形的生成。三、算法提示1、有關(guān)直線生成算法有:DDA(數(shù)值微分)直線算法、逐點(diǎn)比較法、直線Bresenham生成算法。直線Bresenham生成算法思想如下(第一象限,且斜率k0,則yi+1=yi+1,否則 yi+1=yi;3) 畫點(diǎn)(xi+1,yi+1);4) 求下一個(gè)誤差Pi+1點(diǎn),如果Pi0,則Pi+1=Pi+2dy-2dx,否則 Pi+1=Pi+2dy;5) i=i+1,如果i1的情況,可交換變量x和y,y每次長1個(gè)單位。對Pi進(jìn)行判斷,xi+1=xi或xi+1=xi+1。2、有關(guān)圓弧生成算法有:逐點(diǎn)比較法、DDA(數(shù)值微分)直線算法、圓的Bresenham生成算法。圓的生成算法一般將圓劃分為8等份,只需計(jì)算(900,450)的八分之一圓弧,其它用對稱法求得(參見圖2-1 b)。Bresenham生成算法思想如下(第一象限,且斜率k1的情況):1) 計(jì)算誤差初值P1=3-2r,i=1,畫點(diǎn)(0,r);2) 求下一個(gè)光柵點(diǎn)位置 xi+1=xi+1 如果Pi0,則yi+1=yi,否則 yi+1=yi-1;3) 畫點(diǎn)(xi+1,yi+1);4) 求下一個(gè)誤差Pi+1點(diǎn),如果Pi0,則Pi+1=Pi+2xi+6,否則 Pi+1=Pi+4(xi-yi)+10;5) i=i+1,如果x=y則結(jié)束操作,否則轉(zhuǎn)步驟2。圓Bresenham算法的算式簡單,只需做加減法和乘4運(yùn)算3對屏幕布局的考慮適當(dāng)選取坐標(biāo),將屏幕分成幾個(gè)區(qū)域性,在每個(gè)區(qū)域內(nèi)實(shí)現(xiàn)一種算法,生成一個(gè)圖形。也可用delay實(shí)現(xiàn)延時(shí)實(shí)現(xiàn)動(dòng)畫。四、上機(jī)作業(yè)題及思考題1、用正負(fù)法編程繪制圓弧 2、用直線Bresenham生成算法繪制直線。3、用Bresenham生成算法繪制圓。五、參考源程序1、 數(shù)值微分法生成斜率小于的直線/* DDA line 數(shù)值微分法生成斜率小于的直線 */#include #include display.hmain() int xo,yo,xa,ya,i,j; int dx,dy,c; float ddx,ddy,x,y; Initialize(); printf(input start x,y(x=0-640,y=0-480)n); scanf(%d,%d,&xo,&yo); /* 輸入直線的兩個(gè)點(diǎn) */ printf(xa:%d- 639 ,xo); scanf(%d,&xa); printf( ya: 0 . %d ,yo); scanf(%d,&ya); printf(red line is system,yellow is createn); if (xa=xo & xa=0 & yady) c=dx; else c=dy; ddx=dx*1.0/c; ddy=dy*1.0/c; x=xo*1.0; y=yo*1.0; setcolor(12); line(xo,yo,xa,ya); getch(); while (c=0) i=round(x);j=round(y);putpixel(i,j,14);x=x+ddx;y=y-ddy;c=c-1; else printf(data error); getch(); closegraph(); int round(ff)float ff; int k; if (ff-(int)ff)0.5) k=(int)ff+1; else k=(int)ff; k=(int)ff; return(k); 2、逐點(diǎn)插補(bǔ)法生成圓弧源程序 /* STEP CIRCLE 逐點(diǎn)插補(bǔ)法生成圓弧 */#include #include display.hmain() int xo,yo,xa,ya,r,l,f; Initialize(); printf(input x,y,r); /* 輸入圓心和半徑*/ scanf(%d,%d,%d,&xo,&yo,&r); xa=xo+r; ya=yo; setcolor(12); circle(xo,yo,r); line(xo-r,yo,xo+r,yo); line(xo,yo-r,xo,yo+r); line(xo,yo,xo+140,yo-140); l=r*1.414/2; f=0; while (l!=0) putpixel(xa,ya,14); putpixel(xa,2*yo-ya,14); putpixel(2*xo-xa,ya,14); putpixel(2*xo-xa,2*yo-ya,14); putpixel(xo+ya-yo,yo+xa-xo,14); putpixel(xo+ya-yo,yo-xa+xo,14); putpixel(xo-ya+yo,yo+xa-xo,14); putpixel(xo-ya+yo,yo-xa+xo,14); getch(); if (f=0) xa=xa-1; f=f-2*(xa-xo)+1; else ya=ya-1; f=f+2*(yo-ya)+1; l=l-1; getch(); closegraph(); 3、橢圓的生成算法/*elipse 生成橢圓 */#include #include display.hmain() Initialize(); draw_ett(180,100,14); getch(); closegraph(); draw_ett(a,b,color) int a,b,color; int x,y,xo,yo; int l; float f,ff; xo=300; yo=200; x=0; y=b; f=1.0*b*b+a*a*(-b+0.25); putpixel(xo,yo,12); while (1.0*b*b*(x+1)=a*a*(y-0.5) putpixel(x+xo,yo-y,color); if (f0) putpixel(x+xo,yo-y,color); if (f0) f=f+1.0*b*b*(2*x+2)+1.0*a*a*(-2*y+3); x=x+1; y=y-1; else f=f+1.0*a*a*(-2*y+3); y=y-1; 計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告一實(shí)驗(yàn)名稱 直線、圓弧及曲線的生成算法 評(píng)分 實(shí)驗(yàn)日期 年 月 日 指導(dǎo)教師 姓名 專業(yè)班級(jí) 學(xué)號(hào) 一、實(shí)驗(yàn)?zāi)康亩?、?shí)驗(yàn)要求三、關(guān)鍵算法及實(shí)現(xiàn)原理四、程序調(diào)試中的問題五、程序運(yùn)行結(jié)果或數(shù)據(jù)六、實(shí)驗(yàn)收獲及體會(huì)七、參考源程序(可附頁)實(shí)驗(yàn)二 二維圖形的幾何變換一、實(shí)驗(yàn)?zāi)康?、復(fù)習(xí)不同的二維坐標(biāo)變換公式。2、掌握二維坐標(biāo)變換公式的使用方法。3、對二維坐標(biāo)組合變換的靈活運(yùn)用。二、基本要求1、在屏幕上繪制出較簡單的幾何圖形。2、 對1的圖形進(jìn)行平移變換,繪制出變換后的幾何圖形,并在下邊標(biāo)注出實(shí)施x,y各多少的平稱坐標(biāo)變換。3、對1的圖形進(jìn)行旋轉(zhuǎn)變換,繪制出變換后的幾何圖形,并在下邊標(biāo)注出實(shí)施多少度的旋轉(zhuǎn)坐標(biāo)變換。4、對1的圖形進(jìn)行對稱變換,繪制出變換后的幾何圖形,并在下邊標(biāo)注出實(shí)施對什么坐標(biāo)進(jìn)行的對稱變換。5、對1的圖形進(jìn)行錯(cuò)切變換,繪制出變換后的幾何圖形,并在下邊標(biāo)注出實(shí)施對何種坐標(biāo)進(jìn)行的錯(cuò)切變換。6、對1的圖形進(jìn)行比例變換,繪制出變換后的幾何圖形,并在下邊標(biāo)注出實(shí)施的多少比例坐標(biāo)變換。7、為了進(jìn)行比較,適當(dāng)選擇坐標(biāo),可將原圖(變換前)及經(jīng)過不同變換后的圖形繪制在同一個(gè)屏幕上,設(shè)置不同的線形或顏色加以區(qū)分各種變換。三、算法提示1、二維圖形的變換實(shí)際上是一個(gè)變換矩陣,平面圖形是由若干個(gè)二維點(diǎn)(xi,yi)組成,經(jīng)過變換后的二維點(diǎn)(xi, yi),其變換公式為: 對應(yīng)于不同的變換,都是用矩陣乘法來計(jì)算坐標(biāo),只需改變變換矩陣即可。因此對每一種坐標(biāo)變換編成一個(gè)子程序。2、編程時(shí)的技巧用數(shù)組將二維圖形的特征坐標(biāo)點(diǎn)(頂點(diǎn))保存,將由特征坐標(biāo)點(diǎn)(頂點(diǎn))繪制出二維圖形的命令編一個(gè)繪圖子程序,調(diào)用繪圖子程序繪制出變換以前的圖形,根據(jù)不同的兩維幾何變換,選用相應(yīng)二維坐標(biāo)變換公式(調(diào)用相應(yīng)的子程序)將二維坐標(biāo)進(jìn)行坐標(biāo)變換;再調(diào)用繪圖子程序?qū)⒆儞Q后的坐標(biāo)值在屏幕上繪制變換后的幾何將圖形,可選用不同的顏來區(qū)分各種不同幾何變換的圖形。四、上機(jī)作業(yè)題1、 編寫一個(gè)能對任何直線能實(shí)現(xiàn)對稱變換的子程序。2、 作出右邊的圖形,并作下列變換,用不同顏色作出變換后的圖形。1) 作平移(50,-150)。2) 旋轉(zhuǎn) 90度。3) 對X=Y直線作對稱變換。4) 沿Y方向作錯(cuò)切變換。五、參考實(shí)例源程序下面是對四邊形能完成單項(xiàng)二維變換(平移、比例、錯(cuò)切)的源程序#include#include#include#includedouble xmax=639.0, ymax=399.0;double f33,xx,yy;int scx(double xj)int x;x=(int)(xj+xmax/2);return(x);int scy(double yj)int y;y=ymax-(int)(yj+ymax/2);return(y);void parallel(double dx,double dy)f00=1.0;f01=0.0;f02=0.0;f10=0.0;f11=1.0;f12=0.0;f20=dx; f21=dy; f22=1.0;void scale(double s)f00=s;f01=0.0;f02=0.0;f10=0.0;f11=s;f12=0.0;f20=0.0; f21=0.0; f22=1.0;void taisho_y()f00=-1.0;f01=0.0;f02=0.0;f10=0.0;f11=1.0;f12=0.0;f20=0.0; f21=0.0; f22=1.0;void axis()line(scx(0.0),scy(-ymax/2),scx(0),scy(ymax/2);line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0);void tuoq(double a,double b)f00=1.0;f01=b;f02=1.0;f10=a;f11=1.0;f12=0.0;f20=0.0; f21=0.0; f22=1.0;double affinex(double x,double y,double d)xx=x*f00+y*f10+d*f20;return(xx);double affiney(double x,double y,double d)yy=x*f01+y*f11+d*f21;return(yy);void drawtu(x2,y2)double x25,y25;int i;for(i=0;i=3;i+) line(scx(x2i),scy(y2i),scx(x2i+1),scy(y2i+1); void main()int drive=DETECT,mode;static double x1=50.0,60.0,150.0,160.0,50.0;static double y1=0.0,50.0,50.0,-10.0,0.0;static double x25,y25;int i;double x,y,xx,yy,yt;initgraph(&drive,&mode,c:tc3bgi); setcolor(RED); axis(); for(i=0;i=3;i+) line(scx(x1i),scy(y1i),scx(x1i+1),scy(y1i+1); /*parallel(100,-100) */ getch(); x=100;y=-100; parallel(x,y); setcolor(BLUE); for(i=0;i=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,parallel(100,-100);/*taisho_y() */ getch(); taisho_y(); setcolor(YELLOW); for(i=0;i=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,taisho_y);/*touq(2,0) */ getch(); tuoq(2,0); setcolor(LIGHTBLUE); for(i=0;i=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,tuoq(2,0);/*scale(2) */ getch(); scale(2); setcolor(LIGHTRED); for(i=0;i=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,scale 2);getch();closegraph();計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告二實(shí)驗(yàn)名稱 二維圖形的幾何變換 評(píng)分 實(shí)驗(yàn)日期 年 月 日 指導(dǎo)教師 姓名 專業(yè)班級(jí) 學(xué)號(hào) 一、實(shí)驗(yàn)?zāi)康亩?、?shí)驗(yàn)要求三、關(guān)鍵算法及實(shí)現(xiàn)原理四、程序調(diào)試中的問題五、程序運(yùn)行結(jié)果或數(shù)據(jù)六、實(shí)驗(yàn)收獲及體會(huì)七、參考源程序(可附頁)實(shí)驗(yàn)三 進(jìn)行多邊形的裁剪及填充一、實(shí)驗(yàn)?zāi)康?、 復(fù)習(xí)編碼裁剪法和矢量裁剪法。2、 復(fù)習(xí)多邊形區(qū)域填充和種子填充的原理和算法。3、掌握編碼裁剪法的編程方法和步驟。4、多邊形逐邊裁剪法的編程方法實(shí)現(xiàn)編程。5、掌握種子填充算法的基本原理和編程方法。二、基本要求1、 在屏幕上繪制出一個(gè)矩形作為裁剪邊界,再用不同的顏色繪出幾個(gè)由線段組成的簡單幾何圖形,它們和裁剪邊界可相交或不相交。按一個(gè)鍵,實(shí)現(xiàn)一條線段的裁剪,裁剪后的線段可用另一種顏色繪制,繼續(xù)按鍵,直至全部線段裁剪完。2、在屏幕上繪制用線、矩形、圓、多邊形等繪制一些簡單的幾何圖形,選擇合適的種子坐標(biāo),用種子填充方法將它填充。對于被劃分為多個(gè)區(qū)域的幾何圖形,注意觀察改變種子坐標(biāo)點(diǎn)的位置,所填充的區(qū)域不同。三、算法提示1、Sutherland-Cohen(編碼) 裁剪算法用數(shù)組保存裁剪邊界的坐標(biāo)值和被裁剪邊界的坐標(biāo)值;根據(jù)逐邊裁剪方法對被裁剪邊界進(jìn)裁剪,計(jì)算出裁剪后的坐標(biāo);再將裁剪后的直線用不同顏色繪制到屏幕上。2、Sutherland-Hodgman 多邊形裁剪算法多邊形裁剪算法的關(guān)鍵在于,通過裁剪,不僅要保留窗口內(nèi)多邊形的邊界部分,而且要將窗框有關(guān)部分按一定的次序插入多邊形保留邊界之間,從而使多邊形的邊仍然保持封閉狀態(tài)。Sutherland-Hodgman 多邊形裁剪算法:令多邊形的頂點(diǎn)按邊線逆時(shí)針走向排序P1、P2、Pn,多邊形各邊先與上窗框求交。求交后刪去多邊形一窗框之上的部分,并插入窗邊及延長線與多邊形的交點(diǎn)之間的部分,從而形成一個(gè)新多邊形。然后,新的多邊形按相同的方法與右窗框相剪裁。如此重重,直至多邊形與各窗框都裁剪完畢。3、種子填充算法種子填充算法采用的邊界定義是區(qū)域邊界上所有像素均具有某個(gè)特定值,區(qū)域內(nèi)部所有像素均不取這一特定顏色。用函數(shù)getpixel(seedx,seedy) 取出種子坐標(biāo)點(diǎn)(seedx,seedy)的像素點(diǎn)的顏色,如果它的顏色值不等于邊界指定的顏色值,則對它用指定的顏色進(jìn)行填充。用四向連通方法是指從區(qū)域上一點(diǎn)(種子坐標(biāo)點(diǎn))出發(fā),可通過上、下、左、右四個(gè)方向(沿X,Y坐標(biāo)正負(fù)方向各前進(jìn)一個(gè)單位)作為新的種子點(diǎn)進(jìn)行填充。編程時(shí)宜采用遞歸方式進(jìn)行。四、上機(jī)作業(yè)題1、編寫編碼裁剪算法源程序,并實(shí)現(xiàn)對一些圖形的裁剪2、用種子填充算法編程實(shí)現(xiàn)對幾個(gè)二維圖形的填充。五、實(shí)例源程序1Sutherland-Hodglman多邊形裁剪算法源程序,用一個(gè)矩形作為裁剪邊界裁剪一個(gè)多邊形,要求數(shù)據(jù)結(jié)構(gòu)的鏈表學(xué)得較好。 /* Sutherland-Hodgman 算法 */#define LEN sizeof(struct node)#include #include display.h struct node int dx,dy; struct node *next; ;struct node *creat() struct node *h,*q,*r; int p82=100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,190; int i; setcolor(12); for (i=0;i7;i+) line(pi0,pi1,pi+10,pi+11); line(p00,p01,p70,p71); rectangle(120,200,230,70); h=NULL; for (i=0;idx=pi0; q-dy=pi1; if (h=NULL) h=q; else r-next=q; r=q; r-next=NULL; return(h);struct node *builx(h,x)struct node *h;int x;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p-dx; s1=p-dy; p=p-next; while (p!=NULL) j0=x; j1=s1+(p-dy-s1)*(x-s0)/(p-dx-s0); max=s0; min=p-dx; if (s0dx) max=p-dx;min=s0; if (j0=min)&(j0dx=j0; q-dy=j1; if (hh=NULL) hh=q;else r-next=q; r=q; if (p-dx=x) q=(struct node *)malloc(LEN); q-dx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; s0=p-dx; s1=p-dy; p=p-next; p=h; j0=x; j1=s1+(p-dy-s1)*(x-s0)/(p-dx-s0); max=s0; min=p-dx; if (s0dx) max=p-dx;min=s0; if (j0=min)&(j0dx=j0; q-dy=j1; if (hh=NULL)hh=q; else r-next=q; r=q; if (p-dx=x) q=(struct node *)malloc(LEN); q-dx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; r-next=NULL; return(hh);struct node *builxx(h,x)struct node *h;int x;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p-dx; s1=p-dy; p=p-next; while (p!=NULL) j0=x; j1=s1+(p-dy-s1)*(x-s0)/(p-dx-s0+0.1); max=s0; min=p-dx; if (s0dx) max=p-dx;min=s0; if (j0=min)&(j0dx=j0; q-dy=j1; if (hh=NULL) hh=q;else r-next=q; r=q; if (p-dxdx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; s0=p-dx; s1=p-dy; p=p-next; p=h; j0=x; j1=s1+(p-dy-s1)*(x-s0)/(p-dx-s0+0.1); max=s0; min=p-dx; if (s0dx) max=p-dx;min=s0; if (j0=min)&(j0dx=j0; q-dy=j1; if (hh=NULL)hh=q; else r-next=q; r=q; if (p-dxdx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; r-next=NULL; return(hh);struct node *buily(h,y)struct node *h;int y;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p-dx; s1=p-dy; p=p-next; while (p!=NULL) j1=y; j0=s0+(p-dx-s0)*(y-s1)/(p-dy-s1+0.1); max=s1; min=p-dy; if (s1dy) max=p-dy;min=s1; if (j1=min)&(j1dx=j0; q-dy=j1; if (hh=NULL) hh=q;else r-next=q; r=q; if (p-dy=y) q=(struct node *)malloc(LEN); q-dx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; s0=p-dx; s1=p-dy; p=p-next; p=h; j1=y; j0=s0+(p-dx-s0)*(y-s1)/(p-dy-s1+0.1); max=s1; min=p-dy; if (s1dy) max=p-dy; min=s1; if (j1=min)&(j1dx=j0; q-dy=j1; if (hh=NULL)hh=q; else r-next=q; r=q; if (p-dy=y) q=(struct node *)malloc(LEN); q-dx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; r-next=NULL; return(hh);struct node *builyy(h,y)struct node *h;int y;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p-dx; s1=p-dy; p=p-next; while (p!=NULL) j1=y; j0=s0+(p-dx-s0)*(y-s1)/(p-dy-s1+0.1); max=s1; min=p-dy; if (s1dy) max=p-dy;min=s1; if (j1=min)&(j1dx=j0; q-dy=j1; if (hh=NULL) hh=q;else r-next=q; r=q; if (p-dydx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; s0=p-dx; s1=p-dy; p=p-next; p=h; j1=y; j0=s0+(p-dx-s0)*(y-s1)/(p-dy-s1+0.1); max=s1; min=p-dy; if (s1dy) max=p-dy; min=s1; if (j1=min)&(j1dx=j0; q-dy=j1; if (hh=NULL)hh=q; else r-next=q; r=q; if (p-dydx=p-dx; q-dy=p-dy; if (hh=NULL) hh=q; else r-next=q; r=q; r-next=NULL; return(hh);main() int max,min; struct node *head,*r,*q; int i; int s2; Initialize(); head=creat(); q=head; while (q-next!=NULL) putpixel(q-dx,q-dy,14); q=q-next; putpixel(q-dx,q-dy,14); 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); 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); 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); q=builyy(head,200); head=q; s0=q-dx; s1=q-dy; q=q-next; setcolor(14); while (q!=NULL) line(s0,s1,q-dx,q-dy); s0=q-dx; s1=q-dy; q=q-next; q=head; line(s0,s1,q-dx,q-dy); getch();2四向連通種子填充算法子程序 Fill4(int seedx,int seedy,int color) int fill; fill=getpixel(seedx,seedy); if(fill!=color) putpixel(seedx,seedy,color); Fill4(seedx+1,seedy,color); Fill4(seedx-1,seedy,color); Fill4(seedx,seedy+1,color); Fill4(seedx,seedy-1,color); 計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告三實(shí)驗(yàn)名稱 進(jìn)行多邊形的裁剪及填充 評(píng)分 實(shí)驗(yàn)日期 年 月 日 指導(dǎo)教師 姓名 專業(yè)班級(jí) 學(xué)號(hào) 一、實(shí)驗(yàn)?zāi)康亩?、?shí)驗(yàn)要求三、關(guān)鍵算法四、程序調(diào)試中的問題五、程序運(yùn)行結(jié)果或數(shù)據(jù)六、實(shí)驗(yàn)收獲及體會(huì)七、參考源程序(可附頁)實(shí)驗(yàn)四 繪制三維圖形一、實(shí)驗(yàn)?zāi)康?、復(fù)習(xí)用二維圖來表示三維立體圖形,三視圖的表示及的三視圖的變換矩陣2、掌握用C語言編程實(shí)現(xiàn)三維簡單立體的三視圖的繪制二、基本要求1、在屏幕上繪制出一個(gè)長方體或簡單幾何體的三視圖投影圖形,要求在圖形下方標(biāo)出是什么投影圖形。2、在屏幕上繪制出一個(gè)長方體或簡單幾何體的透視投影圖形。三、算法提示1、 二維屏幕表示三維立體圖的關(guān)鍵:屏幕是一個(gè)二維的平面空間,要在它上做出三維的圖形,就必須把三維的空間圖形通過一個(gè)投影變換變?yōu)槎S的圖形,即投影變換把三維坐標(biāo)點(diǎn)(x,y,z)變?yōu)?x,0,z)。2、 投影變換的類型3、 按下述步驟編寫繪制三維圖形的函數(shù) 在草稿紙上給出草圖,并確定各頂點(diǎn)的序號(hào)和相應(yīng)的頂點(diǎn)坐標(biāo)值,建立頂點(diǎn)表和連邊表。 在程序中定義三個(gè)數(shù)組,用于存放頂點(diǎn)的(x,y,z)的坐標(biāo)值。 實(shí)施對立方體進(jìn)行相應(yīng)的投影變換,即對頂點(diǎn)矩陣與變換矩陣相乘,得到一個(gè)新的頂點(diǎn)矩陣。 用新頂點(diǎn)表的坐標(biāo)值,注意些時(shí)只有x坐標(biāo)和z坐標(biāo),y坐標(biāo)已在投影中消掉,按邊表的連線規(guī)則,用line函數(shù)在頂點(diǎn)之間兩兩連線。3、將每一個(gè)幾何變換編寫成一個(gè)函數(shù),在主程序中進(jìn)行坐標(biāo)變換時(shí),直接調(diào)用相應(yīng)的函數(shù)即可;變換后調(diào)用繪圖函數(shù)用不同顏色在屏幕上繪出變換后的圖形。四、上機(jī)作業(yè)題1、將右邊的立體作出它的主視圖、俯視圖、側(cè)視圖。五、實(shí)例源程序#include#include#include#includedouble xmax=639.0, ymax=399.0;double f44,xx,yy,zz,dd;int scx(double xj) int x; x=(int)(-xj+xmax/2); return(x);int scy(double yj) int y; y=ymax-(int)(yj+ymax/2); return(y);void tv() f00=1.0;f01=0.0;f02=0.0;f03=0.0; f10=0.0;f11=0.0;f12=0.0;f13=0.0; f20=0.0;f21=0.0; f22=1.0;f23=0.0; f30=0.0;f31=0.0;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 證券質(zhì)押典當(dāng)業(yè)務(wù)合同書
- 工業(yè)廠房租賃安全合同范本
- 銷售合同專業(yè)模板
- 機(jī)電安裝工程合同標(biāo)準(zhǔn)格式
- 房地產(chǎn)開發(fā)合同糾紛案例分析
- 兼職臨時(shí)工雇傭合同
- 農(nóng)村合作社租賃合同糾紛解決策略
- 煤炭購銷長期合同范本參考
- 年度合作協(xié)議范文:標(biāo)識(shí)標(biāo)牌制作合同
- 綠化養(yǎng)護(hù)合同模板
- 2023年高中生物新教材人教版(2023年)必修二全冊教案
- 小學(xué)美術(shù) 四年級(jí) 人教版《造型?表現(xiàn)-色彩表現(xiàn)與創(chuàng)作》“色彩”單元美術(shù)作業(yè)設(shè)計(jì)《色彩的明與暗》《色彩的漸變》《色彩的情感》
- 中國心臟重癥鎮(zhèn)靜鎮(zhèn)痛專家共識(shí)專家講座
- 川教版七年級(jí)生命生態(tài)安全下冊第1課《森林草原火災(zāi)的危害》教案
- 護(hù)理人員心理健康
- 安全技術(shù)說明書粗苯
- 六年級(jí)上冊心理健康教育課件-健康上網(wǎng)快樂多 北師大版
- 單招面試技巧范文
- 情報(bào)信息收集報(bào)知
- 簡約國潮行業(yè)通用中國風(fēng)鎏金PPT模板
-
評(píng)論
0/150
提交評(píng)論