




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、計 算 機 圖 形學實 驗 指 導 書學號:姓名:謝卉 實驗一:圖形的幾何變換實驗學時:4學時實驗類型:驗證實驗要求:必修一、實驗目的二維圖形的平移、縮放、旋轉(zhuǎn)和投影變換(投影變換可在實驗三中實現(xiàn))等是最基本的圖形變換,被廣泛用于計算機圖形學的各種應用程序中,本實驗通過算法分析以及程序設計實驗二維的圖形變換,以了解變換實現(xiàn)的方法。如可能也可進行裁剪設計。二、實驗內(nèi)容掌握平移、縮放、旋轉(zhuǎn)變換的基本原理,理解線段裁剪的算法原理,并通過程序設計實現(xiàn)上述變換。建議采用VC+實現(xiàn)OpenGL程序設計。三、實驗原理、方法和手段1 圖形的平移在屏幕上顯示一個人或其它物體(如圖1所示),用交互操作方式使其在屏
2、幕上沿水平和垂直方向移動Tx和Ty,則有 x=x+Tx y=y+Ty其中:x與y為變換前圖形中某一點的坐標,x和y為變換后圖形中該點的坐標。其交互方式可先定義鍵值,然后操作功能鍵使其移動。2 圖形的縮放在屏幕上顯示一個帆船(使它生成在右下方),使其相對于屏幕坐標原點縮小s倍(即x方向和y方向均縮小s倍)。則有: x=x*s y=y*s注意:有時圖形縮放并不一定相對于原點,而是事先確定一個參考位置。一般情況下,參考點在圖形的左下角或中心。設參考點坐標為xf、yf則有變換公式 x=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sx y=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中
3、的x與y為變換前圖形中某一點的坐標,x和y為變換后圖形中該點的坐標。當Sx1和Sy1時為放大倍數(shù),Sx1和Sy1時為縮小倍數(shù)(但Sx和Sy必須大于零)。3 圖形的旋轉(zhuǎn)在屏幕上顯示一個汽車,根據(jù)自己確定的旋轉(zhuǎn)角度和旋轉(zhuǎn)中心對圖形進行旋轉(zhuǎn)。旋轉(zhuǎn)公式為 x=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle) y=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf為圍繞旋轉(zhuǎn)的中心點的坐標。x,y為旋轉(zhuǎn)前圖形中某點的坐標,x和y為旋轉(zhuǎn)后圖形中該點的坐標。4 裁剪對一個三角形進行裁剪,裁剪后的圖形應是一個封閉的圖形??刹捎镁€段裁剪法,其方
4、法可用書上的線段相交求點的公式,確定可見線段予以保存,不在窗口的線段則應舍棄。 圖1四、實驗組織運行要求本實驗采用集中授課形式,每個同學獨立完成上述實驗要求。五、實驗條件每人一臺計算機獨立完成實驗。六、實驗步驟(1) 將圖形顯示在初始位置。(2) 對圖形各點按變換表達式作坐標變換,計算出各點變換后的相應點的坐標。(3) 將原來的圖形抹去。(4) 在新的位置顯示圖形。七、程序代碼平移縮放/ test1.cpp : 定義控制臺應用程序的入口點。/#include stdafx.h#include gl/glut.h#include math.h#include float width,highth
5、,angle;void init (void)/畫正方形glClearColor (1.0,1.0, 1.0, 0.0);/背景顏色glMatrixMode (GL_PROJECTION);/ 投影gluOrtho2D (0.0, 600.0, 0.0, 600.0);/參數(shù)分別代表(左下角x坐標,右上角x坐標,左下角y坐標,右上角y坐標)void display (void)glClear (GL_COLOR_BUFFER_BIT);glColor3f (0.0, 1.0, 1.0);/矩形顏色glBegin(GL_POLYGON);glTranslatef(0,0,0);glRotatef
6、(angle,0,0,1); glVertex2f(100.0f+width,100.0f+highth);/用來畫點glVertex2f(100.0f+width,300.0f+highth);glVertex2f(300.0f+width,300.0f+highth);glVertex2f(300.0f+width,100.0f+highth);glEnd();glFlush ( );void mySpecialKeyboard(int key, int x, int y)if(key=GLUT_KEY_RIGHT)width+=5;if(key=GLUT_KEY_LEFT)width-=
7、5;if(key=GLUT_KEY_UP)highth+=5;if(key=GLUT_KEY_DOWN)highth-=5;glutPostRedisplay();void myKeyboard(unsigned char key, int x, int y)if(key = c | key = C)exit(0);glutPostRedisplay();void mymouse(int button,int state,int x,int y)/鼠標控制縮放 if(state=GLUT_DOWN) if(button=GLUT_LEFT_BUTTON) glScalef(0.5,0.5,0.
8、0);display(); else if(button=GLUT_RIGHT_BUTTON) glScalef(1.5,1.5,0.0);display(); glutPostRedisplay();/重新調(diào)用繪制函數(shù) return; void main (int argc, char* argv)glutInit (&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition (50, 50);glutInitWindowSize (600, 600);glutCreateWindow (方
9、向鍵控制平移,鼠標控制縮放);init ( );glutDisplayFunc (display);glutSpecialFunc( mySpecialKeyboard);glutMouseFunc(&mymouse);glutKeyboardFunc( myKeyboard);glutMainLoop ( );旋轉(zhuǎn)#includestdafx.h#include #include #includestdlib.h#define DEG_TO_RAD 0. /角度轉(zhuǎn)為弧度的參數(shù),即 2*PI/360 float theta=30.0; /直線與X軸正方向的夾角 float length=200
10、.0; /直線的長度 float x=300.0, y=200.0; /直線的第一個端點 void init (void) glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 640.0, 0.0, 480.0); void display (void) glClear (GL_COLOR_BUFFER_BIT); glColor3f (0.0, 1.0, 1.0); glBegin (GL_POLYGON); glVertex2f (x, y); glVertex2f ( x +
11、length*cos(DEG_TO_RAD*theta), y + length*sin(DEG_TO_RAD*theta) ); glVertex2f ( x + length*cos(DEG_TO_RAD* (theta+30) ), y + length*sin(DEG_TO_RAD* (theta+30) ); glEnd ( ); glutSwapBuffers ( ); /交換前后臺緩存 /*void idleFunc() theta += 0.1; if (theta360) theta -=360; glutPostRedisplay(); /重新調(diào)用繪制函數(shù) */void m
12、yKeyboard(unsigned char key, int x, int y) if(key = a | key = A) theta += 5.0; if(key = s | key = S) theta -= 5.0; if(key = c | key = C) exit(0); if (theta360) theta -=360; if (theta0) theta +=360; glutPostRedisplay(); /重新調(diào)用繪制函數(shù) void main (int argc, char* argv) glutInit (&argc, argv); glutInitDispla
13、yMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (100, 100); glutInitWindowSize (640, 480); glutCreateWindow (A鍵左轉(zhuǎn),S鍵右轉(zhuǎn)); init ( ); glutDisplayFunc (display); glutKeyboardFunc( myKeyboard); / glutIdleFunc(idleFunc); /指定空閑回調(diào)函數(shù) glutMainLoop ( ); 八、實驗結(jié)果實驗二:圖形的區(qū)域填充實驗學時:4學時實驗類型:驗證實驗要求:必修一、實驗目的區(qū)域填充是
14、指先將區(qū)域內(nèi)的一點(常稱為種子點)賦予給定顏色,然后將這種顏色擴展到整個區(qū)域內(nèi)的過程。區(qū)域填充技術廣泛應用于交互式圖形、動畫和美術畫的計算機輔助制作中。本實驗采用遞歸填充算法或掃描線算法實現(xiàn)對光柵圖形的區(qū)域填充。通過本實驗,可以掌握光柵圖形編程的基本原理和方法。二、實驗內(nèi)容掌握光柵圖形的表示方法,實現(xiàn)種子算法或掃描線算法。通過程序設計實現(xiàn)上述算法。建議采用VC+實現(xiàn)OpenGL程序設計。三、實驗原理、方法和手段1 遞歸算法在要填充的區(qū)域內(nèi)取一點(X,Y)的當前顏色記為oldcolor,用要填充的顏色newcolor去取代,遞歸函數(shù)如下:procedure flood-fill(X,Y,oldc
15、olor,newcolor:integer);begin if getpixel(framebuffer,x,y)=oldcolor then begin setpixel(framebuffer,x,y,newcolor); flood-fill(X,Y+1,oldcolor,newcolor); flood-fill(X,Y-1,oldcolor,newcolor); flood-fill(X-1,Y,oldcolor,newcolor); flood-fill(X+1,Y,oldcolor,newcolor); endend2 掃描線算法掃描線算法的效率明顯高于遞歸算法,其算法的基本思想
16、如下:(1)(初始化)將算法設置的堆棧置為空,將給定的種子點(x,y)壓入堆棧。(2)(出棧)如果堆棧為空,算法結(jié)束;否則取棧頂元素(x,y)作為種子點。(3)(區(qū)段填充)從種子點(x,y)開始沿縱坐標為y的當前掃描線向左右兩個方向逐個象素進行填色,其值置為newcolor,直到抵達邊界為止。(4)(定范圍)以xleft和xright分別表示在步驟3中填充的區(qū)段兩端點的橫坐標。(5)(進棧)分別在與當前掃描線相鄰的上下兩條掃描線上,確定位于區(qū)間xleft,xright內(nèi)的給定區(qū)域的區(qū)段。如果這些區(qū)段內(nèi)的象素的顏色值為newcolor或者boundarycolor(邊界上象素的顏色值),則轉(zhuǎn)到步
17、驟2,否則取區(qū)段的右端點為種子壓入堆棧,再轉(zhuǎn)到步驟2繼續(xù)執(zhí)行。四、實驗組織運行要求本實驗采用集中授課形式,每個同學獨立完成上述實驗要求。五、實驗條件每人一臺計算機獨立完成實驗。六、實驗步驟(1) 將圖形顯示在初始位置。(2) 給定種子點的坐標。(3) 顯示從種子點開始的擴散過程。(4) 顯示填充后的圖形。七、程序代碼 種子掃描線算法using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;us
18、ing System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;/using System.Threading;namespace ClipLine public partial class FrmMain : Form DllImport(gdi32.dll) private static extern int SetPixel(IntPtr hdc, int x1, int y1, int color); DllImport(gdi32.dll) private static extern ui
19、nt GetPixel(IntPtr hdc, int XPos, int YPos); DllImport(gdi32.dll) private static extern uint GetPixel(IntPtr hdc, Point p); DllImport(user32.dll) public static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc); public FrmMain() InitializeComponent(); List mcp = new List(); List mwp = new List(); Graph
20、ics g; /畫布 Point lastp; Point mSeed; int Flag; /選擇繪制圖形類型(窗口或線段) /初始化 private void FrmMain_Load(object sender, EventArgs e) g =Graphics.FromHwnd(picShow.Handle); picShow.Cursor = System.Windows.Forms.Cursors.Cross; Flag = 1; btnFillColor.BackColor = Color.Green; private void picShow_MouseDown(object
21、sender, MouseEventArgs e) lastp.X = e.X; lastp.Y = e.Y; if (Flag = 1) mwp.Add(lastp); if (mwp.Count 1) g.DrawLine(Pens.Black, mwpmwp.Count - 2, mwpmwp.Count - 1); else if (Flag = 2) mcp.Add(lastp); if (mcp.Count 1) g.DrawLine(Pens.Blue, mcpmcp.Count - 2, mcpmcp.Count - 1); else mSeed = new Point(e.X
22、, e.Y); MessageBox.Show(已選擇種子,可以開始掃描線種子填充了!,提示); /繪制裁剪窗口 private void btnDrawWindow_Click(object sender, EventArgs e) Flag = 1; mwp.Clear(); /g.Clear(Color.White); g.DrawRectangle(Pens.Black, 10, 10, picShow.Width - 25, picShow.Height - 25); /執(zhí)行裁剪操作 private void btnClip_Click(object sender, EventArg
23、s e) /ClipPolygon(mcp, mwp); if(mwp.Count2) FillPolygon(btnFillColor.BackColor); /求直線方程(斜率和截距) private void SolveLine(Point p1,Point p2,ref float k,ref float b) if (p1.X != p2.X) k =(float) (p1.Y - p2.Y) / (p1.X - p2.X); b = p1.Y - k * p1.X; /裁剪多邊形 private void ClipPolygon(List cp,List wp) List tp=n
24、ew List(); float k1=0, b1=0, k2=0, b2=0; Point s, p,t,p1,p2; Point cwp = new Point(); bool IsTrue; for (int i = 0; i = k1 * t.X + b1) IsTrue = true; else IsTrue = false; /用此邊裁剪多邊形 for (int j = 0; j cp.Count; j+) s = cpj; if (j = cp.Count - 1) p = cp0; else p = cpj + 1; /先判斷線段是否穿過窗口 if (k1 * s.X + b1
25、 - s.Y) * (k1 * p.X + b1 - p.Y) = k1 * p.X + b1) = IsTrue) tp.Add(p); #endregion else #region if (t.X =p1.X) IsTrue = true; else IsTrue = false; /用此邊裁剪多邊形 for (int j = 0; j cp.Count; j+) s = cpj; if (j = cp.Count - 1) p = cp0; else p = cpj + 1; /先判斷線段是否穿過窗口 if (s.X - p1.X) * (p.X - p1.X) = p1.X) = I
26、sTrue) tp.Add(p); #endregion / cp.Clear(); cp.AddRange(tp); tp.Clear(); Point ps = new Pointcp.Count; /繪制圖形 for (int i = 0; i 0) g.FillPolygon(Brushes.Red, ps); /繪制多邊形 private void btnDrawPolygon_Click(object sender, EventArgs e) Flag = 2; mcp.Clear(); private void picShow_MouseDoubleClick(object se
27、nder, MouseEventArgs e) if (Flag = 1) g.DrawLine(Pens.Black, mwpmwp.Count - 1, mwp0); mwp.RemoveAt(mwp.Count - 1); /FillPolygon(); else if(Flag=2) g.DrawLine(Pens.Blue, mcpmcp.Count - 1, mcp0); mcp.RemoveAt(mcp.Count - 1); private void btnClear_Click(object sender, EventArgs e) mwp.Clear(); g.Clear(
28、Color.White); private void btnRectant_Click(object sender, EventArgs e) mwp.Clear(); /g.Clear(Color.White); Point wps = new Point4; wps0.X = 150; wps0.Y = 100; wps1.X = 400; wps1.Y = 100; wps2.X = 400; wps2.Y = 300; wps3.X = 150; wps3.Y = 300; mwp.AddRange(wps); g.DrawPolygon(Pens.Black, wps); g.Dra
29、wRectangle(Pens.Black,10, 10, picShow.Width-25 , picShow.Height-25 ); /求多邊形的包絡線 private void PloygonEnvelope(ref Point minP,ref Point maxP) minP.X = mwp0.X; minP.Y = mwp0.Y; maxP.X = mwp0.X; maxP.Y = mwp0.Y; for (int i =1; i mwp.Count; i+) if (mwpi.X minP.X) minP.X = mwpi.X; if (mwpi.Y maxP.X) maxP.X = mwpi.X; if (mwpi.Y maxP.Y) maxP.Y = mwpi.Y; /g.DrawRectangle(Pens.Blue,minP.X, minP.Y, maxP.X - m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)園區(qū)入駐合同協(xié)議
- 關于推進跨部門合作項目的工作計劃
- 關于采購流程的往來文書說明
- 商務會議溝通要點及會議紀要模板
- 健康管理平臺的構(gòu)建及運營規(guī)劃
- 機器人智能化生產(chǎn)線建設委托代理合同
- 交通物流調(diào)度管理系統(tǒng)建設方案
- 房屋預約買賣合同
- 木材原木購銷合同
- 2025年版《認識大熊貓》課件發(fā)布
- 醫(yī)院陪護管理制度
- 中國計量大學《微機原理及其應用》2021-2022學年第一學期期末試卷
- 中國技能大賽-第45屆世界技能大賽全國選拔賽“水處理技術”項目技術工作文件
- 混凝土工安全教育培訓試題及答案
- 臨床家庭化產(chǎn)房開展經(jīng)驗分享
- 安徽省六安市裕安區(qū)六安市獨山中學2024-2025學年高一上學期11月期中生物試題(含答案)
- 低血糖的護理查房
- GB/T 44718-2024城市軌道交通無障礙運營服務規(guī)范
- DB41T 2567-2023 消防技術服務機構(gòu)服務規(guī)范
- 2024年職工普法教育宣講培訓課件
- 音樂鑒賞與實踐 第一單元第四課音樂的力量(下)
評論
0/150
提交評論