




已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)圖形學(xué)課內(nèi)實(shí)驗(yàn)實(shí)驗(yàn)報(bào)告班級(jí):計(jì)算機(jī)22班姓名:顧佳烽學(xué)號(hào):2120505034日期:2014.11.08一、實(shí)驗(yàn)?zāi)康募耙罅私釵penGL圖形軟件包繪制圖形的基本過程及其程序框架,并在已有的程序框架中添加代碼實(shí)現(xiàn)直線和圓的生成算法,演示直線和圓的生成過程,從而加深對(duì)直線和圓等基本圖形生成算法的理解,本實(shí)驗(yàn)報(bào)告選擇DDA劃線算法作為主要內(nèi)容,DDA劃線算法是數(shù)字微分分析儀,是一種線段掃描轉(zhuǎn)換算法,基于首尾端點(diǎn)坐標(biāo)選擇一個(gè)坐標(biāo)軸,以一個(gè)單位間隔對(duì)線段取樣,從而確定一個(gè)坐標(biāo)軸上最靠近線路徑的對(duì)應(yīng)整數(shù)值,從而完整地較為準(zhǔn)確地畫出線段。2 實(shí)驗(yàn)環(huán)境 本次實(shí)驗(yàn)采用的是Microsoft C+6.0軟件,所用的語言是C+。3、 實(shí)驗(yàn)內(nèi)容對(duì)于書上給出的代碼,要求通過本次試驗(yàn)來具體的實(shí)現(xiàn)。由于實(shí)驗(yàn)已經(jīng)給出大體的框架,所以只需要按照書上的算法思想來設(shè)計(jì)具體實(shí)現(xiàn)代碼,DDA算法是對(duì)每一步都要進(jìn)行增量處理,然后取整,繪制。4、 數(shù)據(jù)結(jié)構(gòu)和算法描述具體的算法很簡(jiǎn)潔,關(guān)鍵在于如何在坐標(biāo)軸上面實(shí)現(xiàn)動(dòng)態(tài)地繪制過程,具體地,先調(diào)用clear算法對(duì)屏幕進(jìn)行清屏,然后在Delayms函數(shù)中實(shí)現(xiàn)了動(dòng)態(tài)繪制的功能,并且可以按照需求更改繪制速度等,具體的繪點(diǎn)函數(shù)是put函數(shù),然后在主函數(shù)run中實(shí)現(xiàn)了DDA的劃線功能。首尾端點(diǎn)坐標(biāo)分別為(x0,y0)和(xend,yend),計(jì)算橫向與縱向上面的差量,確定以哪一個(gè)坐標(biāo)軸方向?yàn)閱挝婚g隔取樣對(duì)象,依次確定另一個(gè)坐標(biāo)軸上最靠近線路經(jīng)的對(duì)應(yīng)整數(shù)值,從而確定下一個(gè)繪制的點(diǎn)。5、 調(diào)試過程及實(shí)驗(yàn)結(jié)果在實(shí)驗(yàn)初期,無法完成坐標(biāo)軸和動(dòng)態(tài)繪制的功能,在同學(xué)的幫助下,添加了clear,put,Delayms等等函數(shù)來實(shí)現(xiàn)上述功能,調(diào)試過程中基本沒有遇到問題,只有個(gè)別語法錯(cuò)誤需要糾正。實(shí)驗(yàn)結(jié)果截圖如下:六總結(jié)通過本次試驗(yàn),我進(jìn)一步加深了對(duì)于基本畫圖算法的理解。特別是對(duì)于DDA,Bresenham和畫圓以及畫橢圓算法。其中,DDA算法由于每一步都要處理浮點(diǎn)數(shù)的四舍五入,所以在繪圖時(shí)要進(jìn)行取整,效率較低,但是代碼直觀好懂,符合原理。而對(duì)于Bresenham及其改進(jìn)算法,都是在理論推導(dǎo)的基礎(chǔ)上來實(shí)現(xiàn)的,然后經(jīng)過整數(shù)化,形成了一個(gè)高效率的畫圖算法,所以需要適當(dāng)?shù)睦斫?,特別是對(duì)于取整操作判斷比較巧妙,實(shí)現(xiàn)了避免多次判斷計(jì)算浮點(diǎn)數(shù)的目的,所以比較高效。而繪制圓形的時(shí)候,用到的基本思想還是和Bresenham畫圖算法一樣,只不過需要注意的是八分法畫圓,這樣只需要繪制其中的八分之一就可以利用對(duì)稱的關(guān)系來繪制出整個(gè)圖形。而對(duì)于是否走下一步,或者是停留,判斷的依據(jù)還是誤差函數(shù),和前面的思想是類似。橢圓的畫法和中點(diǎn)圓的畫法并無二致,只是需要畫出四分之一,無法像圓一樣8分之一。另外,通過實(shí)驗(yàn)訓(xùn)練了自己的編程能力和動(dòng)手實(shí)踐能力,同時(shí)熟悉了OpenGL繪圖的函數(shù)和流程,也進(jìn)一步鞏固了相關(guān)的知識(shí),對(duì)計(jì)算機(jī)圖形學(xué)這門課程產(chǎn)生了更加濃厚的興趣,也堅(jiān)定了要學(xué)好這門課程的信心。七附錄(源程序清單)/實(shí)驗(yàn)要求:(1)理解glut程序框架 / (2)理解窗口到視區(qū)的變換 / (3)理解OpenGL實(shí)現(xiàn)動(dòng)畫的原理 / (4)理解坐標(biāo)軸的基本原理和操作定義/ (5)添加代碼實(shí)現(xiàn)DDA算法畫直線 /#define EnableAxis /刪去此行則不畫坐標(biāo)軸#define AxisScale 100 /設(shè)置坐標(biāo)軸刻度數(shù)字間隔,如果刪去這行就不畫數(shù)字刻度/#include #include #include #include #include using namespace std;/#include #include #include /HDC mdc;HWND hWnd;unsigned char* canvas;int width, height, origin_x = 0, origin_y = 0;int swidth, sheight, sstride;int px = 0, py = 0, px0, py0;int mx, my;bool movemode = false;float s = 1.0f;void FixPSize() int xlimit = (swidth - width) / 2; int ylimit = (sheight - height) / 2; px = min(max(px, -xlimit), xlimit); py = min(max(py, -ylimit), ylimit);typedef BOOL(WINAPI*MyStretchBltType)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);typedef HDC(WINAPI*MyCreateCompatibleDCType)(HDC);typedef HBITMAP(WINAPI*MyCreateDIBSectionType)(HDC, CONST BITMAPINFO *, UINT, void*, HANDLE, DWORD);typedef HGDIOBJ(WINAPI*MySelectObjectType)(HDC, HGDIOBJ);MyStretchBltType MyStretchBlt;MyCreateCompatibleDCType MyCreateCompatibleDC;MyCreateDIBSectionType MyCreateDIBSection;MySelectObjectType MySelectObject;void LoadGDIFunctions() HMODULE h = LoadLibraryA(gdi32.dll); MyStretchBlt = (MyStretchBltType)(GetProcAddress(h, StretchBlt); MyCreateCompatibleDC = (MyCreateCompatibleDCType)(GetProcAddress(h, CreateCompatibleDC); MyCreateDIBSection = (MyCreateDIBSectionType)(GetProcAddress(h, CreateDIBSection); MySelectObject = (MySelectObjectType)(GetProcAddress(h, SelectObject);LRESULT _stdcall WndProc(HWND hWnd, UINT uMSG, WPARAM wParam, LPARAM lParam) PAINTSTRUCT ps; HDC hdc; int delta; switch (uMSG) case WM_PAINT: hdc = BeginPaint(hWnd, &ps); MyStretchBlt(hdc, 0, 0, width, height, mdc, (int)(px + (swidth - width / s) / 2), (int)(py + (sheight - height / s) / 2), (int)(width / s), (int)(height / s), SRCCOPY); EndPaint(hWnd, &ps); return 0; case WM_SIZE: width = LOWORD(lParam); height = HIWORD(lParam); FixPSize(); return 0; case WM_LBUTTONDOWN: mx = GET_X_LPARAM(lParam); my = GET_Y_LPARAM(lParam); SetCapture(hWnd); movemode = true; px0 = px; py0 = py; break; case WM_LBUTTONUP: movemode = false; ReleaseCapture(); break; case 0x020A:/WM_MOUSEWHEEL: delta = (short)HIWORD(wParam); s += delta / 360.0f; s = max(s, 1.0f); RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); break; case WM_MOUSEMOVE: if (movemode) int nx = GET_X_LPARAM(lParam), ny = GET_Y_LPARAM(lParam); int rx = nx - mx, ry = ny - my; px = (int)(px0 - rx / s); py = (int)(py0 - ry / s); FixPSize(); RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); return 0; break; case WM_DESTROY: PostQuitMessage(0); return 0; default: break; ; return DefWindowProcA(hWnd, uMSG, wParam, lParam);DWORD _stdcall WorkThread(void*) while (1) void Run(); origin_y = origin_x = 0; Run(); RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); return 0;int main() MSG msg; WNDCLASSEXA cl = sizeof(cl), CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, 0, 0, LoadCursor(0, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), 0, Euterpe, 0 ; RegisterClassExA(&cl); hWnd = CreateWindowExA(0, Euterpe, 圖形學(xué)實(shí)驗(yàn), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, 0, 0); LoadGDIFunctions(); mdc = MyCreateCompatibleDC(GetDC(hWnd); swidth = GetSystemMetrics(SM_CXSCREEN) * 2; sheight = GetSystemMetrics(SM_CYSCREEN) * 2; sstride = (swidth * 3 + 3) / 4 * 4; BITMAPINFOHEADER bmih = sizeof(bmih), swidth, sheight, 1, 24, BI_RGB, 0, 0, 0, 0, 0 ; HBITMAP dib = MyCreateDIBSection(mdc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void*)&canvas, 0, 0); MySelectObject(mdc, dib); void Clear(); Clear(); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); CreateThread(0, 0, WorkThread, 0, 0, 0); while (GetMessageA(&msg, 0, 0, 0) TranslateMessage(&msg); DispatchMessageA(&msg); void Run();Run(); ExitProcess(0); return 0;void DelayMS(int ms) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); Sleep(ms);inline void DirectPut(int x, int y, unsigned char r, unsigned char g, unsigned char b) int i = y * sstride + x * 3; canvasi = b; canvasi + 1 = g; canvasi + 2 = r;inline void Put(int x, int y, unsigned char r = 0, unsigned char g = 0, unsigned char b = 0) x += swidth / 2 + origin_x; y += sheight / 2 + origin_y; if (0 = x & x swidth & 0 = y & y sheight) DirectPut(x, y, r, g, b);string ItoA(int x) ostringstream s; s x; return s.str();#ifdef AxisScalevoid DrawXAxisNumber(int x) RECT r = swidth / 2 + x - AxisScale, sheight / 2, swidth / 2 + x + AxisScale, sheight / 2 + AxisScale ; string s = ItoA(x); DrawTextA(mdc, s.c_str(), s.length(), &r, DT_CENTER); for (int i = 1; i 5; +i) Put(x, i);void DrawYAxisNumber(int y) RECT r = swidth / 2 - AxisScale, sheight / 2 - y - AxisScale, swidth / 2, sheight / 2 - y + AxisScale ; string s = ItoA(y); DrawTextA(mdc, s.c_str(), s.length(), &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE); for (int i = 1; i 5; +i) Put(i, y);void DrawAxisNumber() for (int x = AxisScale; x swidth / 2; x += AxisScale) DrawXAxisNumber(-x); DrawXAxisNumber(x); for (int y = AxisScale; y sheight
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 糧食儲(chǔ)備的社區(qū)糧食安全計(jì)劃考核試卷
- 釀酒行業(yè)節(jié)能減排措施考核試卷
- 道路工程測(cè)繪技術(shù)考核試卷
- 遙感技術(shù)在應(yīng)急管理與救援中的應(yīng)用考核試卷
- 組織結(jié)構(gòu)優(yōu)化與流程再造考核試卷
- 常見心臟疾病手術(shù)方式
- 新生兒NICU出科報(bào)告
- 麻醉專業(yè)就業(yè)分析研究
- Quadrilineatin-生命科學(xué)試劑-MCE
- 9-Heptadecanone-Heptadecan-9-one-生命科學(xué)試劑-MCE
- 雙液注漿施工方案
- 民兵訓(xùn)練管理規(guī)定
- 2025年國(guó)家公務(wù)員考試行測(cè)常識(shí)題庫(kù)及答案(共300題)
- 2024冀少版七年級(jí)下冊(cè)生物期末復(fù)習(xí)知識(shí)點(diǎn)提綱(詳細(xì)版)
- 2025年《義務(wù)教育小學(xué)體育課程標(biāo)準(zhǔn)測(cè)試卷2022版》測(cè)試題庫(kù)及答案
- 全國(guó)衛(wèi)生健康系統(tǒng)職業(yè)技能競(jìng)賽(傳染病防治監(jiān)督)參考試題(附答案)
- 人工智能算法與市場(chǎng)營(yíng)銷的融合研究
- DBJ50-T-157-2022房屋建筑和市政基礎(chǔ)設(shè)施工程施工現(xiàn)場(chǎng)從業(yè)人員配備標(biāo)準(zhǔn)
- 國(guó)家開放大學(xué)專本科《經(jīng)濟(jì)法學(xué)》期末紙質(zhì)考試總題庫(kù)2025春期版
- 顯示屏幕抗反光技術(shù)研究-洞察分析
- 地磅及地磅房施工方案
評(píng)論
0/150
提交評(píng)論