計算機圖形學(xué)實驗報告1_第1頁
計算機圖形學(xué)實驗報告1_第2頁
計算機圖形學(xué)實驗報告1_第3頁
計算機圖形學(xué)實驗報告1_第4頁
計算機圖形學(xué)實驗報告1_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實 驗 報 告實驗課程: 學(xué)生姓名: 學(xué) 號: 專業(yè)班級: 2014年12月07日目 錄 實驗二 幾何變換實驗三 二維基本圖形生成的算法實現(xiàn)實驗四 二維填充圖的生成算法實驗五 曲線的生成算法實現(xiàn)實驗二 幾何變換1、 實驗名稱 幾何變換二、實驗?zāi)康?. 掌握二維圖形基本的幾何變換原理及變換矩陣;2. 掌握矩陣運算的程序設(shè)計。三、實驗內(nèi)容1. 掌握二維圖形的齊次坐標(biāo)表示方法;2. 實現(xiàn)二維圖形的基本變換,如進行平移變換等。四、算法描述二維圖形齊次坐標(biāo)變換矩陣一般表達式:這3×3 矩陣中各元素功能一共可分成四塊,即五、實驗步驟1. 編寫二維圖形基本變換如平移、旋轉(zhuǎn)、縮放、比例、對稱交換的通

2、用子程序;2. 繪制矩形,調(diào)用以上的通用子程序?qū)崿F(xiàn)圖形變換,并輸出交換結(jié)果;3. 上機調(diào)試程序,顯示最終結(jié)果。六、實驗源程序#include <graphics.h>#include <math.h>double x1,y1,x2,y2,x3,y3,x4,y4;void pingyi(double d,double c) double a1,b1,a2,b2; a1=x1+d; b1=y1+c; a2=x2+d; b2=y2+c; rectangle(a1,b1,a2,b2);void suofang(double s) double a1,b1,a2,b2; a1=(

3、double)x1*s; b1=(double)y1*s; a2=(double)x2*s; b2=(double)y2*s; rectangle(a1,b1,a2,b2);void xuanzhuan(double b) double a1,b1,a2,b2; a1=x1*cos(b)-y1*sin(b); b1=y1*cos(b)+x1*sin(b); a2=x2*cos(b)-y2*sin(b); b2=y2*cos(b)+x2*sin(b); rectangle(a1,b1,a2,b2);void cuoqie(double b,double d)double a1,b1,a2,b2,

4、a3,b3,a4,b4;a1=x1+b*y1; a3=x3+b*y3;b1=d*x1+y1; b3=d*x3+y3;a2=x2+b*y2; a4=x4+b*x4;b2=d*x2+y2; b4=d*x4+y4;line(a1,b1,a3,b3);line(a3,b3,a2,b2);line(a2,b2,a4,b4);line(a4,b4,a1,b1);void duichenpoint() double a1,b1,a2,b2; a1=-x1;b1=-y1;a2=-x2;b2=-y2; rectangle(a1,b1,a2,b2);void duichenx()double a1,b1,a2,b

5、2;a1=x1;b1=-y1;a2=x2;b2=-y2;rectangle(a1,b1,a2,b2);void duicheny()double a1,b1,a2,b2;a1=-x1;b1=y1;a2=-x2;b2=y2;rectangle(a1,b1,a2,b2);void duichenxy()double a1,b1,a2,b2;a1=y1;b1=x1;a2=y1;b2=x2;rectangle(a1,b1,a2,b2);void duichenyx()double a1,b1,a2,b2;a1=-y1;b1=-x1;a2=-y2;b2=-x2;rectangle(a1,b1,a2,b2

6、);main() int gdriver,gmode;int select=100;double c,d,e; gdriver=DETECT; gmode=0; initgraph(&gdriver,&gmode,"d:tc20hbgi"); x1=50;y1=50;x2=100;y2=100; x3=x2;y3=y1;x4=x1;y4=y2; printf("please input a rectangle's two point:(x1,y1,x2,y2)"); scanf("%lf%lf%lf%lf",&

7、amp;x1,&y1,&x2,&y2); rectangle(x1,y1,x2,y2); getch(); printf("1-pingyin"); printf("2-suofang"); printf("3-xuanzhuan"); printf("4-cuoqie"); printf("5-guanyu yuandian duichenn"); printf("6-guanyu x duichen n"); printf("7-guan

8、yu y duichen n"); printf("8-guanyu y=x duichen n"); printf("9-guanyu y=-x duichen n"); printf("would you want to select what:(0 is exit system!) n"); while(select!=0) scanf("%d",&select); if(select=1) printf("what's distance to pingyi?")

9、; printf("x: "); scanf("%lf",&d); printf("y: "); scanf("%lf",&c); pingyi(d,c); else if(select=2) printf("what's size of rectangle you want?"); scanf("%lf",&e); suofang(e); else if(select=3) printf("xuanzhaun's size?

10、"); scanf("%lf",&e); xuanzhuan(e); else if(select=4) printf("cuoqie's size?"); scanf("%lf%lf",&c,&d); cuoqie(c,d); else if(select=5) duichenpoint(); else if(select=6) duichenx(); else if(select=7) duicheny(); else if(select=8) duichenxy(); else if(s

11、elect=9) duichenyx(); else printf("error please again! or input 0 to exit!n"); closegraph(); system("pause");7、 程序結(jié)果及其分析 通過在這次的實驗剛開始,由于第一次接觸編譯的環(huán)境覺得無從下手,但也逐漸學(xué)到了很多東西按照圖形變換的基本原理,我簡單實現(xiàn)了圖形的幾種變換 通過這次實驗,我對二維圖形的基本幾何變換(平移、旋轉(zhuǎn)、縮放、錯切、反射、 投影)和復(fù)合變換的理解更加深入了,在對圖形進行復(fù)合變換時,將幾個基本幾何變換矩陣按一定順序相乘便能得到一個復(fù)

12、合矩陣,這個復(fù)合矩陣能夠決定變換后圖形的最終位置、形狀和大小的信息。在產(chǎn)生復(fù)合矩陣時,因為矩陣乘法并不滿足交換律,所以如果基本幾何變換矩陣相乘的順序不同,可能會得到不同的復(fù)合矩陣,也就生成了不同的最終變換圖形。實驗三 二維基本圖形生成的算法實現(xiàn)1、 實驗名稱 二維基本圖形生成的算法實現(xiàn)二、實驗?zāi)康?. 掌握直線的兩種生成算法;2. 掌握二維圖形顯示原理。三、實驗內(nèi)容1. 對各種生成算法進行效率及效果的分析和比較;2. 實現(xiàn)直線的生成;3. 學(xué)有余力的同學(xué)可在對現(xiàn)有算法理解的基礎(chǔ)上,能自行設(shè)計二維圖形的生成算法并編程實現(xiàn)。四、算法描述1. 數(shù)值微分法(Digital Differential A

13、nalyzer,DDA)生成直線(1) 算法思想:基于直線的微分方程來生成直線。已知過端點P0 (x0, y0), P1(x1, y1)的直線段L:y=kx+b直線斜率為(2)數(shù)學(xué)描述|k| 1 時,在x的增量方向上走步,走步的方向決定于Dx的符號。xi+1=xi+ Dx , 計算yi+1= kxi+1+ b = kxi + b + kDx = yi + kDx 當(dāng)Dx =1;yi+1 = yi+ k 即:當(dāng)x每遞增1,y遞增k(即直線斜率);在這種情況下,x每增加1,y最多增加1。當(dāng) |k| >1時,在y的增量方向上走步,走步的方向決定于Dy的符號。yi+1 = yi + 1計算 xi

14、 = yi/k - b/k xi+1 = yi+1/k - b/k = (yi+1)/k - b/k = yi/k-b/k + 1/k = xi + 1/k2. Bresenham算法生成直線(1)算法思想比較從理想直線到位于直線上方的像素的距離d2和相鄰的位于直線下方的像素的距離d1,然后根據(jù)距離誤差項的符號確定與理想直線最近的象素。(2)數(shù)學(xué)描述(1) 判別函數(shù)設(shè)直線起點P0(x0,y0),終點P1(x1,y1),令e0=2Dy - Dx作為判別函數(shù),根據(jù)e0的正負,可以確定走向: e00,Y 方向不走步 e0=0,Y方向走一步(2) 遞推公式對于第i +1步(i=0,l,2,n)如果ei

15、 0,則Y方向走一步:Xil Xi+1 Yi1 =Yi+1 ei1= ei + 2Dy - 2Dx如果ei0,則Y方向不走步:Xil Xi+1 Yi1 =Yiei1= ei+ 2Dy五、實驗步驟1. 選擇一種直線生成算法(Bresenham算法生成直線);2. 用C語言編寫程序,依情況進行判斷;3. 用putpixel()函數(shù)逐個畫點;4. 上機調(diào)試程序,顯示最終結(jié)果。六、實驗源程序#include <graphics.h>#include <math.h>double x,y;double a50;b50;void run(double k,int d)int i;

16、if(abs(k)<=1) for(i=2;i<=10;i+) ai=ai-1+d; bi=bi-1+k*d; putpixel(ai,bi,1); getch(); else for(i=2;i<=10;i+) ai=ai-1+1/k; bi=bi-1+1; putpixel(ai,bi,1 ); getch(); main()int gdriver,gmode;gdriver=DETECT;gmode=0;initgraph(&gdriver,&gmode,"d:tc20hbgi");x=50;y=50;putpixel(x,y,1);

17、getch();a1=x;b1=y;run(2,2);run(0.5,50); system("pause");七、程序結(jié)果及其分析實驗四 二維填充圖的生成算法一、 實驗名稱二維填充圖的生成算法二、 實驗?zāi)康?、掌握區(qū)域填充的掃描線算法思想。三、實驗內(nèi)容 1、編程實現(xiàn)任一多邊形的填充。四、算法描述1、算法思想 用水平掃描線從上到下掃描由點線段構(gòu)成的多段構(gòu)成的多邊形。每根掃描線與多邊形各邊產(chǎn)生一系列交點,將這些交點按橫坐標(biāo)從小到大排序,將交點兩兩配對,并填充每一區(qū)段。多邊形被掃描完畢后,填充也就完成。 2、算法步驟:(1) 為每一條掃描線建立新邊表NET;(2) 將掃描線縱坐

18、標(biāo)y的初值置為NET中非空元素的最小序號;(3) 置活性邊表AET為空;(4) 執(zhí)行下列步驟直至NET和AET都為空;A、 如果NET中的第y類非空,則將其中的所有邊取出并插入AET中,在插入過程中進行排序;B、 對AET中的邊兩兩配對,將每對邊中x坐標(biāo)按規(guī)則取整,獲得有效的填充區(qū)段,再填充;C、 將當(dāng)前掃描線縱坐標(biāo)y值遞增1,即y=1;D、 將AET中滿足y=ymax邊刪去; E、 對AET中剩下的每一條邊的x遞增deltax,即x=x+deltax 3、思考: (1)如何解決填充擴大化問題? (2)如何解決交點計數(shù)問題?五、實驗步驟1. 利用掃描線填充算法實現(xiàn),多邊形以n, x_array

19、, y_array形式給出,其中x_array,y_array中存放著多邊形的n個頂點的x, y坐標(biāo);2. 用C語言編寫程序?qū)崿F(xiàn)算法;3. 上機調(diào)試程序,顯示最終結(jié)果。六、實驗要求#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<graphics.h>void draw(int x1,int y1,int x2,int y2,int delta)int nx1,ny1,nx2,ny2;nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2;while(

20、ny1>=y1)&&(nx2<=x2) line(nx1,ny1,nx2,ny2); getch(); ny1-=delta; nx2+=delta; if(nx2>x2)ny2-=nx2-x2; nx2=x2;while(ny1>y1)line(nx1,ny1,nx2,ny2);getch();ny1-=delta; ny2-=delta; nx1+=y1-ny1; ny1=y1;while(nx1<x2)line(nx1,ny1,nx2,ny2);getch();nx1+=delta; ny2-=delta; elsenx1+=y1-ny1;

21、ny1=y1; while(nx2<x2) line(nx1,ny1,nx2,ny2); getch(); nx2+=delta; nx1+=delta; ny2-=nx2-x2; nx2=x2;while(ny2>y1) line(nx1,ny1,nx2,ny2); getch(); ny2-=delta; nx1+=delta; int main(void)int x1,y1,y2,x2,delta;int driver=DETECT,mode;printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of

22、rectangle and delta:n"); scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta);initgraph (&driver,&mode,"d:tc20hbgi"); /*這里*/rectangle(x1,y1,x2,y2);getch(); draw(x1,y1,x2,y2,delta); gotoxy(1,1);printf("Press any key to exit!");getch();closegraph();

23、return 0;七、程序結(jié)果及其分析實驗五 曲線的生成算法實現(xiàn)1、 實驗名稱曲線的生成算法實現(xiàn)二、實驗?zāi)康?. 掌握B樣條曲線、Bezier曲線的定義;2. 能編程實現(xiàn)N 次B樣條曲線、Bezier曲線的繪制與顯示。 三、實驗內(nèi)容1. 編程實現(xiàn)二次Bezier曲線的繪制;2. 學(xué)有余力的同學(xué)可以編程實現(xiàn)二次B樣條曲線的繪制。四、算法描述1. 貝塞爾曲線貝塞爾曲線的參數(shù)向量表達式通常,n+1個頂點定義一個n次多項式。其中稱為伯恩斯坦(Bernstain)基函數(shù)。2. B樣條的數(shù)學(xué)表達式 給定m+n+1個頂點,可以定義m+1段n次的參數(shù)曲線段為:式中稱為n次B樣條基函數(shù)。五、實驗步驟1. 編程實

24、現(xiàn)二次Bezier曲線的繪制;2. 上機調(diào)試程序,顯示最終繪圖結(jié)果。六、實驗要求#include "graphics.h"#include "malloc.h" #include "math.h" #define MULTIPLE 7 #define ROW 4 struct node float x,y;   void draw_polygon(struc

25、t node a,int originx,int originy)   int n;  for (n=0;n<ROW;n+)   if (n=0) moveto(originx+a0.x,originy-a0.y); lineto(originx+an.x,originy-an.y);    struct node decasteljau(struct 

26、;node p,int n,float u)   int i,r;  struct node point,q20;  for(i=0;i<n;i+) qi=pi; for(r=1;r<n;r+)  for(i=0;i<n-r;i+)   qi.x=(1.0-u)*qi.x+u*qi+1.x;  qi.y=(1.0-u)*qi.y+u*qi+1.y;     return q0;   void draw_bezier_curve(struct node p,int n,int x0,int y0)  

溫馨提示

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

評論

0/150

提交評論