版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)圖形學(xué)試驗(yàn)匯報(bào)試驗(yàn)題目:利用計(jì)算機(jī)編程語(yǔ)言繪制圖形,主要實(shí)現(xiàn)以下內(nèi)容:(1)、中點(diǎn)算法生成任意斜率直線,并設(shè)置線型線寬。(2)、中點(diǎn)算法生成圓(3)、中點(diǎn)算法生成橢圓(4)、掃描算法實(shí)現(xiàn)任意多邊形填充(5)、Cohen_Sutherland裁剪(6)、自由曲線與曲面繪制(7)、二維圖形變換(8)、三視圖變換二、系統(tǒng)分析與設(shè)計(jì)本試驗(yàn)采取C語(yǔ)言編程,運(yùn)行環(huán)境為T(mén)urboC;三、算法思想及程序?qū)崿F(xiàn)1、中點(diǎn)算法生成任意斜率直線,并設(shè)置線型線寬。(1).算法思想假定直線斜率k在0~1之間(k其它取值能夠類(lèi)似處理),當(dāng)前象素點(diǎn)為(xp,yp),則下一個(gè)象素點(diǎn)有兩種可選擇點(diǎn)P1(xp+1,yp)或P2(xp+1,yp+1)。若P1與P2中點(diǎn)(xp+1,yp+0.5)稱(chēng)為M,Q為理想直線與x=xp+1垂線交點(diǎn)。當(dāng)M在Q下方時(shí),則取P2應(yīng)為下一個(gè)象素點(diǎn);當(dāng)M在Q上方時(shí),則取P1為下一個(gè)象素點(diǎn)。這就是中點(diǎn)畫(huà)線法基本原理。下面討論中點(diǎn)畫(huà)線法實(shí)現(xiàn)。過(guò)點(diǎn)(x0,y0)、(x1,y1)直線段L方程式為F(x,y)=ax+by+c=0,其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0,欲判斷中點(diǎn)M在Q點(diǎn)上方還是下方,只要把M代入F(x,y),并判斷它符號(hào)即可。為此,我們結(jié)構(gòu)判別式:d=F(M)=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c當(dāng)d<0時(shí),M在L(Q點(diǎn))下方,取P2為下一個(gè)象素;當(dāng)d>0時(shí),M在L(Q點(diǎn))上方,取P1為下一個(gè)象素;當(dāng)d=0時(shí),選P1或P2均可,約定取P1為下一個(gè)象素;注意到d是xp,yp線性函數(shù),可采取增量計(jì)算,提升運(yùn)算效率。若當(dāng)前象素處于d30情況,則取正右方象素P1(xp+1,yp),要判下一個(gè)象素位置,應(yīng)計(jì)算d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)=d+a,增量為a。若d<0時(shí),則取右上方象素P2(xp+1,yp+1)。要判斷再下一象素,則要計(jì)算d2=F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b,增量為a+b。畫(huà)線從(x0,y0)開(kāi)始,d初值d0=F(x0+1,y0+0.5)=F(x0,y0)+a+0.5b,因F(x0,y0)=0,所以d0=a+0.5b。因?yàn)槲覀兪褂弥皇莇符號(hào),而且d增量都是整數(shù),只是初始值包含小數(shù)。所以,我們能夠用2d代替d來(lái)擺脫小數(shù)。(2)程序?qū)崿F(xiàn)voidputpixels(intx,inty,intcolor,intn){inti,j;for(i=-n/2;i<=n/2;i++)for(j=-n/2;j<=n/2;j++)putpixel(x+j,y+i,color);}voidMidpointline(intx0,inty0,intx1,inty1,intcolor,intn){inta,b,dx,dy,d,x,y,incrP1,incrP2;if(x0==x1) {if(y0<y1)for(y=y0;y<=y1;y++)putpixel(x0,y,color);elsefor(y=y0;y>=y1;y--)putpixel(x0,y,color); }elseif(x0<x1){if(y0<y1){ dy=y1-y0;dx=x1-x0;d=dx-2*dy;incrP1=-2*dy;incrP2=2*(dx-dy);x=x0;y=y0;putpixels(x,y,color,n);while(x<x1) {if(d<0) {y++;d+=incrP2;} elsed+=incrP1;x++; putpixels(x,y,color,n);}}else{ dy=y1-y0;dx=x1-x0;d=-2*dy-dx;incrP1=-2*(dx+dy);incrP2=-2*dy;x=x0;y=y0;putpixels(x,y,color,n);while(x<x1){if(d>0){y--;d+=incrP1;} elsed+=incrP2;x++; putpixels(x,y,color,n);}}}elseif(x0>x1){if(y0<y1){ dy=y0-y1;dx=x0-x1;d=-2*dy-dx;incrP1=-2*(dx+dy);incrP2=-2*dy;x=x1;y=y1;putpixels(x,y,color,n);while(x<x0){if(d>0) {y--;d+=incrP1;} elsed+=incrP2;x++; putpixels(x,y,color,n); }}else{ dy=y0-y1;dx=x0-x1;d=dx-2*dy;incrP1=-2*dy;incrP2=2*(dx-dy);x=x1;y=y1;putpixels(x,y,color,n);while(x<x0) {if(d<0) {y++;d+=incrP2;} elsed+=incrP1;x++; putpixels(x,y,color,n);}}}}2、用中點(diǎn)算法實(shí)現(xiàn)畫(huà)圓(1).算法思想假如我們結(jié)構(gòu)函數(shù)F(x,y)=x2+y2-R2,則對(duì)于圓上點(diǎn)有F(x,y)=0,對(duì)于圓外點(diǎn)有F(x,y)>0,對(duì)于圓內(nèi)點(diǎn)F(x,y)<0。與中點(diǎn)畫(huà)線法一樣,結(jié)構(gòu)判別式:d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2若d<0,則應(yīng)取P1為下一象素,而且再下一象素判別式為:d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3若d≥0,則應(yīng)取P2為下一象素,而且下一象素判別式為d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5我們這里討論第一個(gè)象素是(0,R),判別式d初始值為:d0=F(1,R-0.5)=1.25-R為了深入提升算法效率,將上面算法中浮點(diǎn)數(shù)改寫(xiě)成整數(shù),將乘法運(yùn)算改成加法運(yùn)算,即僅用整數(shù)實(shí)現(xiàn)中點(diǎn)畫(huà)圓法。(2)程序?qū)崿F(xiàn):voidmidpointcircle(intR){intx,y,deltax,deltay,d;x=0;y=R;d=1-R;deltax=3;deltay=5-R-R;putpixel(x+300,y+300,GREEN);while(x<y){if(d<0){d+=deltax;deltax+=2;x++;}else{d+=deltax+deltay;deltax+=2;deltay+=2;x++;y--;}putpixel(x+300,y+300,RED);putpixel(y+300,x+300,GREEN);putpixel(-x+300,y+300,BLUE);putpixel(y+300,-x+300,WHITE);putpixel(x+300,-y+300,YELLOW);putpixel(-y+300,x+300,CYAN);putpixel(-x+300,-y+300,MAGENTA);putpixel(-y+300,-x+300,BROWN);}}3、用中點(diǎn)算法實(shí)現(xiàn)橢圓:(1)、算法思想生成橢圓弧中點(diǎn)算法和直線中點(diǎn)算法類(lèi)似,只是初始化條件和判別式遞推公式不一樣,而且在確定判別式時(shí)候要消去浮點(diǎn)運(yùn)算和盡可能降低乘法次數(shù),對(duì)于橢圓,還要注意,在第一像限內(nèi)斜率大于1情況與直線|m|>1時(shí)相同,要以y為自變量,在此不再詳細(xì)敘述。對(duì)于橢圓:考慮分界點(diǎn)上部弧段,此段斜率,由像素遞推出后繼像素。依照條件得到初始條件為,對(duì)于分界點(diǎn)下方弧段,可類(lèi)似求得。(2)程序?qū)崿F(xiàn)voidputpixels(intx,inty,intcolor,intn){inti,j;for(i=-n/2;i<=n/2;i++)for(j=-n/2;j<=n/2;j++)putpixel(x+j,y+i,color);}voidellipsepoint(longx0,longy0,longx,longy,longcolor,intn){putpixels((int)(x0+x),(int)(y0+y),(int)color,n);putpixels((int)(x0-x),(int)(y0+y),(int)color,n);putpixels((int)(x0+x),(int)(y0-y),(int)color,n);putpixels((int)(x0-x),(int)(y0-y),(int)color,n);}voidmidpointellipse(longx0,longy0,longa,longb,longcolor,intn){longx,y,d,sa,sb,xp,yp;sa=a*a,sb=b*b;xp=(long)((float)sa/(float)sqrt((float)(sa+sb)));yp=(long)((float)sb/(float)sqrt((float)(sa+sb)));x=0,y=b,d=sa+4*sb-4*sa*b;while(x<xp){if(d<0){d=d+4*sb*(2*x+3);x++;}else{d=d+4*sb*(2*x+3)+4*sa*(2-2*y);x++;y--;}ellipsepoint(x0,y0,x,y,color,n);}x=a,y=0,d=4*sa+sb-4*a*sb;while(y<yp){if(d<0){d=d+4*sa*(2*y+3);y++;}else{d=d+4*sa*(2*y+3)+4*sb*(2-2*x);y++;x--;}ellipsepoint(x0,y0,x,y,color,n);}}4、用掃描線算法實(shí)現(xiàn)多邊形填充:(1)算法思想:用水平掃描線從上到下掃描由點(diǎn)線段組成多段定義多邊形。每根掃描線與多邊形各邊產(chǎn)生一系列交點(diǎn),將這些交點(diǎn)按照x坐標(biāo)進(jìn)行排序,將排序后交點(diǎn)成對(duì)取出,作為兩個(gè)端點(diǎn),用所需填充色彩畫(huà)水平直線。多邊形被掃描完成,則填充結(jié)束。實(shí)現(xiàn)步驟:建立邊分類(lèi)表ET;將掃描線縱坐標(biāo)y初值為ET中非空元素最小序號(hào);置活化邊表AEL為空;執(zhí)行以下步驟直至ET和AEL都為空;假如ET中第y類(lèi)非空,則將其中全部邊取出并插入AEL中,在插入過(guò)程忠進(jìn)行排序;對(duì)AEL中邊兩兩配對(duì),將每對(duì)邊中x坐標(biāo)按規(guī)則取整,取得有效填充區(qū)段,再填充;將當(dāng)前掃描線縱坐標(biāo)y值遞增1,即y=1;將AEL中滿足y=ymax邊刪去;對(duì)AEL中剩下每一條邊x遞增deltax,即x=x+deltax;(2)程序?qū)崿F(xiàn)typedefstruct{inty_top;floatx_int;intdelta_y;floatx_change_per_scan;}EACH_ENTRY;EACH_ENTRYsides[MAX_POINT];intx[MAX_POINT],y[MAX_POINT];intside_count,first_s,last_s,scan,bottomscan,x_int_count;voidfill_area(intcount){sort_on_bigger_y(count);first_s=1;last_s=1;for(scan=sides[1].y_top;scan>=bottomscan;scan--){update_first_and_last(count,scan);process_x_intersections(first_s,last_s);draw_lines(scan,x_int_count,first_s);update_sides_list();}}sort_on_bigger_y(intn){intk,x1,y1;inttem;side_count=0;y1=y[n];x1=x[n];bottomscan=y[n];for(k=1;k<n+1;k++){if(y1!=y[k]){side_count++;if(k!=n)tem=y[k+1];elsetem=y[1];put_in_sides_list(side_count,x1,y1,x[k],y[k],tem);}else{setcolor(13);line(x1,y1,x[k],y[k]);}if(y[k]<bottomscan)bottomscan=y[k];y1=y[k];x1=x[k];}}put_in_sides_list(intentry,intx1,inty1,intx2,inty2,intnext_y){intmaxy;floatx2_temp,x_change_temp;x_change_temp=(float)(x2-x1)/(float)(y2-y1);x2_temp=x2;if((y2>y1)&&(y2<next_y)){y2--;x2_temp-=x_change_temp;}else{if((y2<y1)&&(y2>next_y)){y2++;x2_temp+=x_change_temp;}}maxy=(y1>y2)?y1:y2;while((entry>1)&&(maxy>sides[entry-1].y_top)){sides[entry]=sides[entry-1];entry--;}sides[entry].y_top=maxy;sides[entry].delta_y=abs(y2-y1)+1;if(y1>y2)sides[entry].x_int=x1;elsesides[entry].x_int=x2_temp;sides[entry].x_change_per_scan=x_change_temp;}update_first_and_last(intcount,intscan){while((sides[last_s+1].y_top>=scan)&&(last_s<count))last_s++;while(sides[first_s].delta_y==0)first_s++;}process_x_intersections(intfirst_s,intlast_s){intk;x_int_count=0;for(k=first_s;k<last_s+1;k++){if(sides[k].delta_y>0){x_int_count++;sort_on_x(k,first_s);}}}sort_on_x(intentry,intfirst_s){while((entry>first_s)&&(sides[entry].x_int<sides[entry-1].x_int)){swap(&sides[entry],&sides[entry-1]);entry--;}}swap(EACH_ENTRY*x,EACH_ENTRY*y){inti_temp;floatf_temp;i_temp=x->y_top;x->y_top=y->y_top;y->y_top=i_temp;f_temp=x->x_int;x->x_int=y->x_int;y->x_int=f_temp;i_temp=x->delta_y;x->delta_y=y->delta_y;y->delta_y=i_temp;f_temp=x->x_change_per_scan;x->x_change_per_scan=y->x_change_per_scan;y->x_change_per_scan=f_temp;}draw_lines(intscan,intx_int_count,intindex){intk,x,x1,x2;for(k=1;k<(int)(x_int_count/2+1.5);k++){while(sides[index].delta_y==0)index++;x1=(int)(sides[index].x_int+0.5);index++;while(sides[index].delta_y==0)index++;x2=(int)(sides[index].x_int+0.5);setcolor(13);line(x1,scan,x2,scan);index++;}}update_sides_list(){intk;inttemp;for(k=first_s;k<last_s+1;k++){if(sides[k].delta_y>0){sides[k].delta_y--;sides[k].x_int-=sides[k].x_change_per_scan;}}}5、用Cohen-Sutherland裁剪算法實(shí)現(xiàn)直線段裁剪:5.1編碼算法:5.1.1算法思想:本算法分為三個(gè)步驟:判斷線段兩端是否都在窗口內(nèi),假如是,線段完全可見(jiàn);不然判斷線段是否顯然不可見(jiàn),假如是,裁剪結(jié)束。不然求線段與窗口邊延長(zhǎng)線交點(diǎn),此線段將線段分為兩段,其中一段不可見(jiàn),舍棄。對(duì)余下線段繼續(xù)進(jìn)行遞歸裁剪。算法編碼是進(jìn)行二進(jìn)制位運(yùn)算,若頂點(diǎn)在窗口內(nèi),則二進(jìn)制編碼為0000;不然進(jìn)行編碼。5.1.2實(shí)現(xiàn)步驟:這種算法利用編碼方法,延長(zhǎng)窗口邊線,使得它們把包含未經(jīng)裁剪圖形窗口平面區(qū)域分成九個(gè)區(qū)域:(2)每個(gè)區(qū)域用一個(gè)4位編碼CtCbCrCl來(lái)表示,代碼中每一位分別是0或1,是按照窗口邊線來(lái)確定,下面給出詳細(xì)編碼規(guī)則,其中最右邊位Cl是第一位,依次Cr第二、Cb第三、Ct第四位。A、當(dāng)兩端點(diǎn)P1(x1,y1)和P2(x2,y2)在區(qū)域0000中,即滿足點(diǎn)裁剪不等式:B、當(dāng)兩個(gè)端點(diǎn)在窗口邊線外同側(cè)位置,則他們四位代碼中,有一相同位,同時(shí)位“1”,顯然兩個(gè)端點(diǎn)代碼C1和C2按位與運(yùn)算C1&C2≠0.由此可檢驗(yàn)判斷直線在窗口外,應(yīng)全部舍棄。C、果直線兩端點(diǎn)不滿足上述兩種情況,不能簡(jiǎn)單地全部保留或全部舍棄直線時(shí),則需要計(jì)算出直線與窗口邊線交點(diǎn),將直線分段后繼續(xù)進(jìn)行檢驗(yàn)判斷。這么能夠逐段地舍棄位于窗口外地線段,保留剩下在窗口內(nèi)線段。5.1.3程序?qū)崿F(xiàn)/*********定義裁剪函數(shù)************/voidline_clip(intx1,inty1,intx2,inty2,intleft,inttop,intright,intbottom){voidgetcode(intx,inty,intd[4]);/*定義取得端點(diǎn)代碼函數(shù)*/inti,x11,y11;/*定義交點(diǎn)坐標(biāo)*/intaa=1;getcode(x1,y1,a);getcode(x2,y2,b);/*1:裁剪循環(huán)開(kāi)始*/while(aa!=0){if((a[0]+a[1]+a[2]+a[3]==0)&&(b[0]+b[1]+b[2]+b[3]==0))/*第一個(gè)情況線段完全可見(jiàn)*/{aa=0;return;}elseif((a[0]&&b[0])+(a[1]&&b[1])+(a[2]&&b[2])+(a[3]&&b[3])!=0)/*線段完全不可見(jiàn)*/{setcolor(0);setwritemode(0);/*設(shè)置畫(huà)線輸出模式為覆蓋方式*/line(x1,y1,x2,y2);/*進(jìn)行裁剪也就是進(jìn)行覆蓋*/aa=0;return;}/*2:線段即不完全可見(jiàn),也不完全不可見(jiàn),即與邊有交點(diǎn)線段裁剪處理*/else{if(a[0]+a[1]+a[2]+a[3]==0)/*尋找不可見(jiàn)點(diǎn)*/{for(i=0;i<4;i++)c[i]=b[i];/*x2,y2為不可見(jiàn)點(diǎn)*/}else{for(i=0;i<4;i++)c[i]=a[i];/*x1,y1為不可見(jiàn)點(diǎn)*/}/*3:直線與窗口邊作求交運(yùn)算,求出交點(diǎn)賦值給x11、y11*/if(c[0]==1){x11=left;y11=(int)((y2-y1)*(left-x1)/(x2-x1)+y1);}elseif(c[1]==1){x11=right;y11=(int)((y2-y1)*(right-x1)/(x2-x1)+y1);}elseif(c[2]==1){x11=(int)((x2-x1)*(bottom-y1)/(y2-y1)+x1);y11=bottom;}elseif(c[3]==1){x11=(int)((x2-x1)*(top-y1)/(y2-y1)+x1);y11=top;}/*3:求交運(yùn)算結(jié)束*/if((c[0]==a[0])&&(c[1]==a[1])&&(c[2]==a[2])&&(c[3]==a[3])){setcolor(0);setlinestyle(0,0,3);setwritemode(0);line(x1,y1,x11,y11);x1=x11;y1=y11;getcode(x11,y11,a);}elseif((c[0]==b[0])&&(c[1]==b[1])&&(c[2]==b[2])&&(c[3]==b[3])){setcolor(0);setlinestyle(0,0,3);setwritemode(0);line(x2,y2,x11,y11);x2=x11;y2=y11;getcode(x11,y11,b);}}/*2:與邊有交點(diǎn)線段裁剪處理結(jié)束*/}/*1:裁剪循環(huán)結(jié)束*/}/*取得端點(diǎn)代碼*/voidgetcode(intx,inty,intd[4]){d[0]=0;d[1]=0;d[2]=0;d[3]=0;if(x<left)d[0]=1;if(x>right)d[1]=1;if(y>bottom)d[2]=1;if(y<top)d[3]=1;return;}6、自由曲線與曲面繪制6.1、生成Bezier曲線(1)算法思想利用Bezier曲線造型時(shí),假如其次數(shù)太高,當(dāng)然能表示復(fù)雜形狀,但同時(shí)造成計(jì)算復(fù)雜度增加,而二次Bezier曲線表示能力有限,故下面我們僅討論三次Bezier曲線矩陣表示和計(jì)算機(jī)生成。矩陣表示三次Bezier曲線定義式為:將其分解為兩個(gè)矢量點(diǎn)積為:取Bezier曲線幾何矩陣,則有:得到三次Bezier曲線基矩陣為:三次Bezier曲線生成Bezier曲線用參數(shù)表示法,所以將區(qū)間[0,1]分成N等份,確定了控制點(diǎn)后,每取一個(gè)都對(duì)應(yīng)一個(gè)三維點(diǎn)。這么,在每?jī)蓚€(gè)和之間畫(huà)一條直線,再將該這些直線段投影到二維平面,就能夠得到我們需要Bezier曲線了。(2)程序?qū)崿F(xiàn):voidbezier_3(intcolor,doublep[4][2]){doublet,t1,t2,xt,yt;intrate=200,x,y;setcolor(color);moveto(p[0][0],p[0][1]);for(t=0;t<=1;t+=1.0/rate){yt=1-t;t1=yt*yt;t2=3*yt*t;xt=p[0][0]*t1*yt+p[1][0]*t2*yt+p[2][0]*t2*t+p[3][0]*t*t*t;yt=p[0][1]*yt*t1+p[1][1]*t2*yt+p[2][1]*t2*t+p[3][1]*t*t*t;x=(int)(xt);y=(int)(yt);lineto(x,y);}}6.2繪制Bezier曲面(1)算法思想:Bezier曲線是一條與控制多邊形頂點(diǎn)位置有嚴(yán)格關(guān)系曲線,Bezier曲線形狀趨向于特征多邊形形狀,而且階數(shù)由控制多邊形頂點(diǎn)個(gè)數(shù)決定。Bezier曲面則是由Bezier曲線拓廣而來(lái),它也是以Bernstein函數(shù)作為基函數(shù),是由Bernstein基函數(shù)結(jié)構(gòu)空間點(diǎn)陣列位置來(lái)控制。(2)算法實(shí)現(xiàn)步驟:給出控制頂點(diǎn)。2.依照以下公式,編程繪制Bezier曲面。計(jì)算各點(diǎn)坐標(biāo)3.用畫(huà)直線方法首尾相接畫(huà)直線。(3)、程序?qū)崿F(xiàn):main(){charstr[80];intdriver,mode;inti,k,m,j;intx0=300,y0=300;intp[4][4][3]={{{12,145,50},{24,120,50},{45,117,50},{65,140,50}},{{24,65,34},{56,45,34},{87,56,34},{99,75,34}},{{43,120,20},{65,98,20},{87,100,20},{111,115,20}},{{15,160,0},{34,120,0},{55,135,0},{75,170,0}}};floatu0,u1,u2,u3,v0,v1,v2,v3;floatq10,q11,q12,q13,du,dv;floatq[n+1][n+1][3],q20[3],q21[3],q22[3],q23[3],q30[3],q31[3],q32[3],q33[3];floatx,y;printf("inputj:(0---bezier,1---B_spline)\n");scanf("%d",&j);driver=DETECT;mode=0;initgraph(&driver,&mode,"D:\\TC");setbkcolor(1);setcolor(15);for(i=0;i<=3;i++){for(k=0;k<=3;k++){x=(-0.7071*p[i][k][0]+0.7071*p[i][k][1]+200)*2-300;y=(0.4082*p[i][k][0]+0.4082*p[i][k][1]-0.8165*p[i][k][2]+200)*2-300;if(k==0)moveto(x,y);lineto(x,y);}}for(i=0;i<=3;i++){for(k=0;k<=3;k++){x=(-0.7071*p[k][i][0]+0.7071*p[k][i][1]+200)*2-300;y=(0.4082*p[k][i][0]+0.4082*p[k][i][1]-0.8165*p[k][i][2]+200)*2-300;if(k==0)moveto(x,y);lineto(x,y);}}du=dv=1.0/n;for(i=0;i<=n;i++){u0=(i*du)*(i*du)*(i*du);u1=(i*du)*(i*du);u2=i*du;u3=1;if(j==0){q10=u0*(-1)+u1*3+u2*(-3)+u3*1;q11=u0*3+u1*(-6)+u2*3;q12=u0*(-3)+u1*3;q13=u0*1;}if(j==1){q10=(u0*(-1)+u1*3+u2*(-3)+u3*1)/6;q11=(u0*3+u1*(-6)+u3*4)/6;q12=(u0*(-3)+u1*3+u2*3+u3*1)/6;q13=(u0*1)/6;}for(k=0;k<=2;k++){q20[k]=q10*p[0][0][k]+q11*p[1][0][k]+q12*p[2][0][k]+q13*p[3][0][k];q21[k]=q10*p[0][1][k]+q11*p[1][1][k]+q12*p[2][1][k]+q13*p[3][1][k];q22[k]=q10*p[0][2][k]+q11*p[1][2][k]+q12*p[2][2][k]+q13*p[3][2][k];q23[k]=q10*p[0][3][k]+q11*p[1][3][k]+q12*p[2][3][k]+q13*p[3][3][k];if(j==0){q30[k]=q20[k]*(-1)+q21[k]*3+q22[k]*(-3)+q23[k]*1;q31[k]=q20[k]*3+q21[k]*(-6)+q22[k]*3;q32[k]=q20[k]*(-3)+q21[k]*3;q33[k]=q20[k]*1;}if(j==1){q30[k]=(q20[k]*(-1)+q21[k]*3+q22[k]*(-3)+q23[k]*1)/6;q31[k]=(q20[k]*3+q21[k]*(-6)+q22[k]*3)/6;q32[k]=(q20[k]*(-3)+q22[k]*3)/6;q33[k]=(q20[k]*1+q21[k]*4+q22[k]*1)/6;}}for(m=0;m<=n;m++){v0=(m*dv)*(m*dv)*(m*dv);v1=(m*dv)*(m*dv);v2=m*dv;v3=1;for(k=0;k<=2;k++){q[i][m][k]=q30[k]*v0+q31[k]*v1+q32[k]*v2+q33[k]*v3;}}}setcolor(4);for(i=0;i<=n;i++){for(m=0;m<=n;m++){x=(-0.7071*q[i][m][0]+0.7071*q[i][m][1]+200)*2-300;y=(0.4082*q[i][m][0]+0.4082*q[i][m][1]-0.8165*q[i][m][2]+200)*2-300;if(m==0)moveto(x,y);lineto(x,y);}}for(m=0;m<=n;m++){for(i=0;i<=n;i++){x=(-0.7071*q[i][m][0]+0.7071*q[i][m][1]+200)*2-300;y=(0.4082*q[i][m][0]+0.4082*q[i][m][1]-0.8165*q[i][m][2]+200)*2-300;if(m==0)moveto(x,y);lineto(x,y);}}if(j==0){printf("3Beziercurvedsurface");}if(j==1){printf("3B_Spllinecurvedsurface");}outtextxy(270,270,"thisiszhouman'shomework");setcolor(3);settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);sprintf(str,"%s","----graphics:zhouman--time:.12.30----");outtextxy(120,430,str);getch();closegraph();}7、二維圖形縮放、旋轉(zhuǎn),平移,組合變換(1)思想算法:在齊次坐標(biāo)理論下,二維圖形幾何變換矩陣可用下式表示:平移變換:[x*y*1]=[xy1]*=[t*xs*y1]百分比變換:[x*y*1]=[xy1]*=[m+xn+y1]旋轉(zhuǎn)變換:在平面上二維圖形饒?jiān)c(diǎn)逆時(shí)針旋轉(zhuǎn)?角,變換矩陣為[x*y*1]=[xy1]*=[x*cos?-y*sin?]復(fù)合變換:以上各種變換矩陣都是以原點(diǎn)為參考點(diǎn),當(dāng)以任意參考點(diǎn)進(jìn)行變換時(shí)候,我們就要用到復(fù)合變換矩陣。(2)、程序?qū)崿F(xiàn):用直線命令畫(huà)出一個(gè)齒(或六邊形二分之一)→利用旋轉(zhuǎn)變換或?qū)ΨQ(chēng)變換矩陣實(shí)現(xiàn)對(duì)其余部分繪制→調(diào)試運(yùn)行程序→輸出圖形→分析結(jié)果→結(jié)束。voidtf1(floatsq,floatcq,intxp,intyp){t[0][0]=cq;t[0][1]=sq;t[0][2]=0;t[1][0]=-sq;t[1][1]=cq;t[1][2]=0;t[2][0]=xp;t[2][1]=yp;t[2][2]=1;}voidtf2(){floatx,y;x=pp[j][0];y=pp[j][1];pp[j][0]=x*t[0][0]+y*t[1][0]+t[2][0];pp[j][1]=x*t[0][1]+y*t[1][1]+t[2][1];}main(){intgdriver,gmode,xp=300,yp=200;floatp[][2]={{80,1},{80,8},{99,17},{97,26},{76,26}};floati,t[3][3];gdriver=DETECT;registerbgidriver(EGAVGA_driver);initgraph(&gdriver,&gmode,"d:\\tc");setbkcolor(3);cleardevice();setcolor(9);circle(xp,yp,70);circle(xp,yp,20);circle(xp,yp,40);circle(xp,yp,5);circle(xp,yp,2);circle(xp,yp,45);setlinestyle(0,0,6);for(i=0;i<6;i=i+0.3142){tf1(sin(i),cos(i),xp,yp);for(j=0;j<5;j++){pp[j][0]=p[j][0];pp[j][1]=p[j][1];tf2();}for(j=0;j<4;j++)line(pp[j][0],pp[j][1],pp[j+1][0],pp[j+1][1]);delay(10000);}getch();closegraph();}8.圖形三視圖變換編寫(xiě)三維變換算法程序→檢驗(yàn)程序正確性→分段調(diào)試程序→輸入給出三維形體各頂點(diǎn)坐標(biāo)→執(zhí)行變換→對(duì)算法程序進(jìn)行必要調(diào)整→更換不一樣形體數(shù)據(jù)繼續(xù)變換→結(jié)束。程序?qū)崿F(xiàn):#include<graphics.h>#include<math.h>inta[14][4]={{30,0,0,1},{30,40,0,1},{0,40,0,1},{0,40,10,1},{0,30,30,1},{0,0,30,1},{30,0,30,1},{30,10,30,1},{10,10,30,1},{10,30,30,1},{10,40,10,1},{10,10,10,1},{30,10,10,1},{30,40,10,1}};floatt[4][4],p[14][4];voida400(){inti,j;for(i=0;i<4;i++)for(j=0;j<4;j++)t[i][j]=0;}voida500(){intk,i,j;for(i=0;i<14;i++){for(j=0;j<4;j++){p[i][j]=0;for(k=0;k<4;k++)p[i][j]=p[i][j]+a[i][k]*t[k][j];}p[i][0]=p[i][0]+280;p[i][1]=-p[i][1]+180;}setcolor(9);moveto(p[0][0],p[0][1]);for(i=0;i<14;i++)lineto(p[i][0],p[i][1]);line(p[6][0],p[6][1],p[0][0],p[0][1]);line(p[7][0],p[7][1],p[12][0],p[12][1]);line(p[8][0],p[8][1],p[11][0],p[11][1]);line(p[9][0],p[9][1],p[4][0],p[4][1]);line(p[10][0],p[10][1],p[3][0],p[3][1]);line(p[13][0],p[13][1],p[10][0],p[10][1]);line(p[1][0],p[1][1],p[13][0],p[13][1]);getch();}main(){intdriver,mode,i,j;driver=DETECT;initgraph(&driver,&mode,"d:\\tc");setbkcolor(3);a400();t[0][0]=0.7071*3;t[0][1]=-0.4082*3;t[1][0]=-0.7071*3;t[1][1]=-0.4082*3;t[2][1]=0.8165*3;t[3][3]=1;a500();closegraph();}四、試驗(yàn)總結(jié)在試驗(yàn)過(guò)程中,盡管過(guò)程中任由許多不會(huì)地方,而且有待于今后提升和改進(jìn),但我加深了對(duì)書(shū)本上知識(shí)了解與掌握,同時(shí)也學(xué)到了很多書(shū)本上沒(méi)有東西,并積累了一些寶貴經(jīng)驗(yàn),這對(duì)我以后學(xué)習(xí)與工作是不無(wú)裨益。因?yàn)楸驹囼?yàn)采取C語(yǔ)言編程,而C語(yǔ)言在圖形界面制作方面較其余面向?qū)ο笳Z(yǔ)言而言沒(méi)有優(yōu)勢(shì),不過(guò)在試驗(yàn)基本圖形繪制方面,只要選擇好算法并加以實(shí)施也能夠?qū)崿F(xiàn)。本試驗(yàn)只是完成了一部分主要功效,而每種功效都只選取了其中一個(gè)算法,不過(guò)在完成過(guò)程中,我也很深刻地了解和認(rèn)識(shí)了各種算法,留下了印象。不過(guò)未能實(shí)現(xiàn)整個(gè)畫(huà)圖板界面還是很遺憾,我將繼續(xù)努力把它完善。我需要完成功效主要有以下幾點(diǎn):(1)、漢字編寫(xiě)功效(2)、投影變換(3)、隱藏面消隱(4)、三維圖形變換等參考文件[1]倪明田,吳良芝,計(jì)算機(jī)圖形學(xué),北京:北京大學(xué)出版社,。[2]孫家廣等,計(jì)算機(jī)圖形學(xué),北京:清華大學(xué)出版社,。[3]王飛,計(jì)算機(jī)圖形學(xué)基礎(chǔ),北京:北京郵電大學(xué)出版社,。[4]王汝傳,鄒北驥,計(jì)算機(jī)圖形學(xué),北京:人民郵電出版社,。[5]楊欽.計(jì)算機(jī)圖形學(xué).清華大學(xué)出版社,(3)。
[6]郭玲文.精通AutoCAD.科學(xué)出版社,(8)。VoidLine_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_max,yw_max)floatx1,y1,x2,y2,xw_xmin,yw_y
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 胡椒小豬說(shuō)課稿
- 吊裝工程模板施工合同
- 舞臺(tái)燈光貨場(chǎng)租賃協(xié)議
- 圖書(shū)配送貨車(chē)司機(jī)聘用協(xié)議
- 質(zhì)押借款協(xié)議
- 農(nóng)業(yè)設(shè)施商品混凝土施工協(xié)議
- 城市綠化機(jī)械臺(tái)班施工合同
- 兒童游樂(lè)設(shè)施資產(chǎn)管理方案
- 礦山爆破安全帽管理辦法
- 供水工程項(xiàng)目招投標(biāo)資料
- 供水設(shè)備維保實(shí)施方案
- 04S519小型排水構(gòu)筑物1
- 腎病綜合征業(yè)務(wù)學(xué)習(xí)
- 關(guān)于交通運(yùn)輸局自查報(bào)告范文
- 500萬(wàn)羽智能化蛋雞養(yǎng)殖項(xiàng)目可行性研究報(bào)告-立項(xiàng)備案
- 人工智能(基礎(chǔ)版)高職人工智能基礎(chǔ)課程PPT完整全套教學(xué)課件
- 放棄父母的財(cái)產(chǎn)的協(xié)議書(shū)
- 《韓非子·五蠹》課件
- 公司危險(xiǎn)源辨識(shí)與風(fēng)險(xiǎn)評(píng)價(jià)及控制措施清單
- 語(yǔ)文教學(xué)中如何進(jìn)行分組教學(xué)
- Chinese Tea 中國(guó)茶文化 中英文
評(píng)論
0/150
提交評(píng)論