版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 計算機圖形學實驗報告學 院:計算機科學學院 班 級: 學 號: 學生姓名: 指導教師: 2008年1月目錄實驗一 基本圖元的繪制一、實驗目的與要求-2二、實驗內容-2(一)、簡單dda法畫直線-2(二)、bresenham直線生成算法-4(三)、bresenham畫圓算法-7(四)、角度dda法產生圓弧-9實驗二 自由曲線一、實驗目的與要求-11二、實驗內容-11(一)、三次參數樣條曲線段-11(二)、三次bezier曲線段-13(三)、三次b樣條曲線段-15圖形學、cad二次開發(fā)及動畫課程設計-17實驗一 基本圖元的繪制一、實驗目的與要求 (1)熟悉turbo c下圖形編輯環(huán)境 (2)實現
2、bresenham算法畫直線(3) 設計dda直線生成算法的實現程序(4)設計bresenham畫圓算法的實現程序(5)設計角度dda法產生圓弧的實現程序二、實驗內容(一)、簡單dda法畫直線(1)、算法:在x或y變化大的方向,即計長方向上,步長始終為1,而另一方向上的步長則小于1,其是否走步,視其有無整數部分溢出,也即:若 |k|1,則取xinc =1, yinc =k, yi+1 = yi k ;若 |k|1,則取yinc =1, xinc =1/k, yi+1 = yi 1/k (2)、源程序#include #include #include int addline(int k,int
3、 x1,int y1,int x2,int color) int curx,cury,k1;curx = x1;cury = y1;k1 = k;k1 = abs(k1);if (k1 = 1)while(curx!=x2)curx +=1;cury +=k;putpixel(curx,cury,color);else while(curx!=x2) cury +=1;curx +=1/k; putpixel(curx,cury,color); return(0);main() int x1,y1,x2,k; int color = 10; int gdriver=detect,gmode;
4、detectgraph(&gdriver,&gmode); initgraph(&gdriver,&gmode,); printf(please input begin:); scanf(%d%d,&x1,&y1); printf(/nplease input end:); scanf(%d%d,&x2,&k); addline(k,320+x1,240+y1,320+x2,color); getch(); cleardevice(); closegraph();(3)、運行結果(二)、bresenham直線生成算法(1)、算法1bresenham算法畫直線:由bresenham算法的基本原理
5、是每次在最大位移方向上面走一步,而另一個方向上是走步還是不走步取決于誤差項的判別。而在誤差項的判別是利用中點來判斷的,是否走一步,取決于中點的位置,若如果中點在直線上部,則不需要走一步,如果中點在直線下部,則要走一步。其繪圖過程為:(1)輸入直線的兩端點p0(x0,y0)和p1(x1,y1)。(2)計算初始值x, y,d=x-2y,x=x0,y=y0。(3)繪制點(x,y),判斷d的符號。若d0,則(x,y)更新為(x+1,y+1),d更新為d+2x2y;否則(x,y)更新為(x+1,y),d更新為d-2y.(4)當直線未畫完時,重復步驟(3),否則結束。(2)、源程序#include #in
6、clude #include int bres_line(int x1,int y1,int x2,int y2,int color) int oldcolor,itag; int dx,dy,tx,ty,inc1,inc2,curx,cury,d; putpixel(x1,y1,color); if (x1=x2 & y1=y2) return(1); itag=0; dx = abs(x2-x1); dy = abs(y2-y1); if(dx0?1:-1;ty=(y2-y1)0?1:-1;curx = x1;cury = y1;inc1 = 2*dy;inc2 = 2*(dy-dx);d
7、=inc1-dx;while(curx!=x2) if (d0) d+=inc1; else cury+=ty; d+=inc2; if(itag)putpixel(cury,curx,color);elseputpixel(curx,cury,color);curx+=tx;return(0);iswap(int *a,int *b) int tmp; tmp = *a; *a=*b; *b=tmp;main() int i,j,x1,y1,x2,y2; int color = 15; int gdriver=detect,gmode; initgraph(&gdriver,&gmode,)
8、; printf(please input begin(x1,y1):); scanf(%d%d,&x1,&y1); printf(/n please input end(x2,y2):); scanf(%d%d,&x2,&y2); i=20; j=240; moveto(i,j); for(i=20;i=620;i+=20) /*使用雙循環(huán)畫點函數畫出表格中的縱坐標*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用雙循環(huán)畫點函數畫出表格中的橫坐標*/ lineto(320,j); bres_line(x
9、1,y1,x2,y2,color); getch(); closegraph();(3)、運行結果(三)、bresenham畫圓算法(1)、算法設圓的半徑為r,考慮圓心在(0,0),從x=0、y=r開始的順時針方向的1/8圓周的生成過程。在這種情況下,x每步增加1,從x=0開始,到x=y結束,即有xi+1= xi+1;相應的yi+1則在兩種可能中選擇:yi+1=yi或者yi+1=yi-1。選擇的原則是考察精確值y是靠近yi還是靠近yi-1。根據定義可推導出遞推公式有:如果di0,選si,xi=xi-1+1,yi=yi-1,得: di+1=di+4xi-1+6如果di0,選ti,xi=xi-1+
10、1,yi=yi-1-1,得: di+1=di+4(xi-1-yi-1)+10對于i=1,xi-1=x0=0,yi-1=y0=r,則初值為: d1=3-2r(2)、源程序 #include #include #include #include int bres_circle(int x0,int y0,double r,int color) int x,y,d; x=0; y=(int)r; d=(int)(3-2*r); while(xy) cirpot(x0,y0,x,y,color); if(d0) d+=4*x+6; else d+=4*(x-y)+10; y-; x+; if(x=y)
11、cirpot(x0,y0,x,y,color);return(0);int cirpot(int x0,int y0,int x,int y,int color) int oldcolor; putpixel(x0+x),(y0+y),color); putpixel(x0+y),(y0+x),color); putpixel(x0+y),(y0-x),color); putpixel(x0+x),(y0-y),color); putpixel(x0-x),(y0-y),color); putpixel(x0-y),(y0-x),color); putpixel(x0-y),(y0+x),co
12、lor); putpixel(x0-x),(y0+y),color); return(0);main() int i,j,x0,y0,gmode; float r; int color=15; int gdriver=detect; initgraph(&gdriver,&gmode,); printf(please input begin(x0,y0):); scanf(%d%d,&x0,&y0); printf(/n please input end(r):); scanf(%f,&r); i=20; j=240; moveto(i,j); for(i=20;i=620;i+=20) /*
13、使用雙循環(huán)畫點函數畫出表格中的縱坐標*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用雙循環(huán)畫點函數畫出表格中的橫坐標*/ lineto(320,j); bres_circle(x0,y0,r,color); getch(); closegraph();(3)、運行結果(四)、角度dda法產生圓?。?)、算法若已知圓心坐標為(xc,yc),半徑為人,則以角度t為參數的圓的參數方程可寫為:x=xc+rcosty=yc+ rsint 當t從0變化到2時,上述方程所表示的軌跡是一整圓;到t從ts變化到te時,則
14、產生一段圓弧。由于我們定義角度的正方向是逆時針方向,所以圓弧是有ts到te逆時針畫圓得到的。若給定圓心坐標(xc,yc),半徑r及起始角ts和終止角te,要產生ts到te這段圓弧的最主要問題是離散化圓弧,即求出從ts到te所需運動的總步數n??闪睿簄=(te-ts)/dt+0.5其中,dt為角度增量,即每走一步對應的角度變化。如果用戶的給定tets,則可令te=ts+2以保證ts到te是逆時針畫圓。如果n=0,則令n=2/dt,即畫整圓。(2)、源程序#include #include #include arc1 (int xc,int yc,double r,double ts,double
15、 te) double rad,tsl,tel,deg,dte,ta,ct,st;int x,y,n,i; rad =0.0174533;tsl=ts*rad;tel=te*rad;if(r5.08) deg=0.015;elseif(r7.62)deg = 0.06; elseif(r25.4)deg = 0.075;elsedeg =0.15;dte=deg*25.4/r;if(teltsl)tel+=6.28319; n=(int)(tel-tsl)/dte+0.5);if(n=0)n=(int)(6.28319/dte+0.5);ta=tsl;x=xc+r*cos(tsl);y=yc+
16、r*sin(tsl);moveto(x,y);for(i=1;i=n;i+) ta+=dte; ct=cos(ta); st=sin(ta); x=xc+r*ct; y=yc+r*st; lineto(x,y);x=xc+r*cos(tel); y=yc+r*sin(tel);lineto(x,y);main() int xc,yc; float r,ts,te; int gdriver=detect,gmode; initgraph(&gdriver,&gmode,); printf(please input begin(xc,yc)as(xc=320,yc=240):); scanf(%d
17、%d,&xc,&yc); printf(/n please input end(r,ts,te)as(r=100,ts=20,te=200):); scanf(%f%f%f,&r,&ts,&te); arc1(xc,yc,r,ts,te); getch(); closegraph();(3)、運行結果實驗二 自由曲線一、實驗目的與要求(1)掌握三次三次參數樣條曲線、bezier曲線和b樣條曲線生成原理(2)設計三次參數樣條曲線、bezier曲線和b樣條曲線程序二、實驗內容(一)、三次參數樣條曲線段算法如下:每段三次樣條曲線都是由其起始點的位置向量p0、p1和起始點處的切線向量p0、p1分解為二
18、維平面的x、y方向的分量,即p0p1p0p12 -2 1 1-3 3 -2 -10 0 1 01 0 0 0p(t)=t3 t2 t 1令=f0(t) f1(t) g0(t) g1(t)p0p1p0p13 -2 1 1-3 3 -2 -10 0 1 01 0 0 0t3 t2 t 1式中 f0(t) =2t3 - 3t2+1(0t1) f1(t) = -2t3 +3t g0(t)=t(t-1) g1(t) =t2(t-1)這組函數稱為混合函數。曲線的形狀是受曲線段兩端點的位置向量和切線向量控制的。當端點的邊界條件發(fā)生變化時,曲線的形狀隨之發(fā)生變化。(2)源程序下例是繪制一條三次參數樣條曲線的程
19、序。程序中,數組px6、py6存放控制點的x,y坐標;數組dx6dy6存放控制點處切線向量的x、y分量;n為每段的等分數。#include #include float px6=50,170,250,310,500,700;float py6=200,220,200,150,200,150;float dx6=100,80,100,300,200,100;float dy6=-100,200,150,-200,-100,100;void spline() float a0,a1,a2,a3,b0,b1,b2,b3; int k,x,y; float i,t,dt,n=10; setcolor(
20、yellow); dt=1/n; for (k=0;k=6-1 ;k+ ) if(getch()=17) exit(); a0=pxk; a1=dxk; a2=-3*pxk+3*pxk+1-2*dxk-dxk+1; a3=2*pxk-2*pxk+1+dxk+dxk+1; b0=pyk; b1=dyk; b2=-3*pyk+3*pyk+1-2*dyk-dyk+1; b3=2*pyk-2*pyk+1+dyk+dyk+1; for(i=0;in;i+=0.1) t=i*dt; x=a0+a1*t+a2*t*t+a3*t*t*t; y=b0+b1*t+b2*t*t+b3*t*t*t; if(i=0)
21、moveto(x,y); lineto(x,y); void main() int driver,mode,i,j; driver=detect; i=20; j=240; initgraph(&driver,&mode,); moveto(i,j); for(i=20;i=620;i+=20) /*使用雙循環(huán)畫點函數畫出表格中的縱坐標*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用雙循環(huán)畫點函數畫出表格中的橫坐標*/ lineto(320,j); printf(press any key to con
22、tinue except ctrl+q to quit.n); spline(); if(getch()=17)exit(); closegraph();(二)、三次bezier曲線段 三次bezier曲線的矩陣表達形式如下:p0p1p2p3-1 3 -3 13 -6 3 0-3 3 0 01 0 0 0p(t)=t3 t2 t 14個控制點p0、p1、p2、p3連成的折線多邊形稱為特征多邊形,bezier曲線的形狀是由這個多邊形的各個頂點的位置確定的,特征多邊形的形狀改變,則曲線的形狀也就隨之改變。(2)源程序程序中,數組px10、py10存放控制點的x,y坐標。#include #incl
23、ude float px10=50,80,120,140,180,230,270,330,380,430;float py10=100,230,230,160,50,50,120,230,230,150;void bezier() float a0,a1,a2,a3,b0,b1,b2,b3; int k,x,y; float i,t,dt,n=10; setcolor(15); dt=1/n; for(k=0;k10-1;k+) moveto(pxk,pyk); lineto(pxk+1,pyk+1); setcolor(10); for(k=0;k10-3;k+=3) if(getch()=
24、17) exit(); a0=pxk; a1=-3*pxk+3*pxk+1; a2=3*pxk-6*pxk+1+3*pxk+2; a3=-pxk+3*pxk+1-3*pxk+2+pxk+3; b0=pyk; b1=-3*pyk+3*pyk+1; b2=3*pyk-6*pyk+1+3*pyk+2; b3=-pyk+3*pyk+1-3*pyk+2+pyk+3; for (i=0;in ;i+=0.1 ) t=i*dt; x=a0+a1*t+a2*t*t+a3*t*t*t; y=b0+b1*t+b2*t*t+b3*t*t*t; if(i=0) moveto(x,y); lineto(x,y); vo
25、id main() int driver,mode; driver=detect; initgraph(&driver,&mode,); printf(press any key to continue except ctrl+q to quitn); bezier(); if(getch()=17) exit(); closegraph();(3)、運行結果(三)、三次b樣條曲線段三次b樣條曲線的矩陣表達式為 p0p1p2p3-1 3 -3 13 -6 3 0-3 0 3 01 4 1 0p(t)=(1/6)*t3 t2 t 1 源程序程序中,px10、py10存放控制點的x,y坐標。#in
26、clude #include float px10=50,90,150,120,220,300,380,320,450,500;float py10=100,60,50,150,240,100,100,200,250,130;void b_spline() float a0,a1,a2,a3,b0,b1,b2,b3; int k,x,y; float i,t,dt,n=10; setcolor(15); dt=1/n; for(k=0;k10;k+) if(k=0) moveto(pxk,pyk); lineto(pxk,pyk); setcolor(10); for(k=0;k10-3;k+
27、) if(getch()=17) exit(); a0=(pxk+4*pxk+1+pxk+2)/6; a1=(pxk+2-pxk)/2; a2=(pxk-2*pxk+1+pxk+2)/2; a3=-(pxk-3*pxk+1+3*pxk+2-pxk+3)/6; b0=(pyk+4*pyk+1+pyk+2)/6; b1=(pyk+2-pyk)/2; b2=(pyk-2*pyk+1+pyk+2)/2; b3=-(pyk-3*pyk+1+3*pyk+2-pyk+3)/6; for(i=0;in;i+=0.1) t=i*dt;x=a0+a1*t+a2*t*t+a3*t*t*t;y=b0+b1*t+b2*
28、t*t+b3*t*t*t;if(i=0) moveto(x,y);lineto(x,y); void main() int driver,mode; driver=detect; initgraph(&driver,&mode,); printf(press any key to continue except ctrl+q to quitn); b_spline(); if(getch()=17) exit(); closegraph();圖形學、cad二次開發(fā)及動畫課程設計第一部分:1.編寫一個autolisp程序,其功能是:根據圓心c1、直徑d1、d2、d3畫三個同心圓如圖1所示。程序應
29、提示用戶輸入c1、d1、d2、d3點的坐標。#include #include #include #include int bres_circle(int x0,int y0,double r,int color) int x,y,d; x=0; y=(int)r; d=(int)(3-2*r); while(xy) cirpot(x0,y0,x,y,color); if(d0) d+=4*x+6; else d+=4*(x-y)+10; y-; x+; if(x=y)cirpot(x0,y0,x,y,color);return(0);int cirpot(int x0,int y0,int
30、x,int y,int color) int oldcolor; putpixel(x0+x),(y0+y),color); putpixel(x0+y),(y0+x),color); putpixel(x0+y),(y0-x),color); putpixel(x0+x),(y0-y),color); putpixel(x0-x),(y0-y),color);putpixel(x0-y),(y0-x),color);putpixel(x0-y),(y0+x),color);putpixel(x0-x),(y0+y),color); return(0);main() int x0,y0,gmo
31、de; float r1,r2,r3; int color=15; int gdriver=detect; initgraph(&gdriver,&gmode,); printf(please input begin(x0,y0)as(x0=320,y0=240):); scanf(%d%d,&x0,&y0); printf(/n please input r(r1)as(r1=50):); scanf(%f,&r1); printf(/n please input r(r2)as(r2=100):); scanf(%f,&r2); printf(/n please input r(r3)as(r3=150):); scanf(%f,&r3); bres_circle(x0,y0,r1,color); bres_circle(x0,y0,r2,color); bres_circle(x0,y0,r3,color); getch(); closegraph();運行結果2.編寫一個autolisp程序,其功能是:畫一個等腰三角形( p1、p2、p3 ),如圖3所示。程序應提示用戶輸入起始點p 1、長度l 1和角度a。#include
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能咖啡機的自動磨豆和智能調制遠程操作功能考核試卷
- 自行車騎行與工作效率考核試卷
- 紡織品的印染與花紋設計考核試卷
- 大數據在社交媒體與網絡營銷中的應用考核試卷
- 農藥制造中的新型化學方法考核試卷
- 初等教育的綜合教育考核試卷
- 提高員工技術技能的創(chuàng)新培訓方法考核試卷
- 固體飲料行業(yè)現狀與未來發(fā)展趨勢考核試卷
- 中國汽車齒輪行業(yè)競爭狀況及投資前景預測研究報告(2024-2030版)
- 中國氯氟碳化合物行業(yè)市場現狀分析及競爭格局與投資發(fā)展研究報告(2024-2030版)
- 技術通知單(新模版-0516)
- 小學男女生如何正常交往主題班會課件
- 必修二2.1充分發(fā)揮市場在資源配置中起決定性作用課件
- 英語聽力技巧與應用(山東聯盟)智慧樹知到課后章節(jié)答案2023年下濱州學院
- 2022年HJ1237機動車環(huán)檢作業(yè)指導書
- 大唐之美通用模板
- ABS裝置濕法擠出機系統(tǒng)存在的問題研究及對策的中期報告
- 《肉牛營養(yǎng)需要》教學課件
- 網易云音樂用戶滿意度調查問卷
- 雪佛蘭愛唯歐說明書
- 經營分析報告案例-麥肯錫風格
評論
0/150
提交評論