實驗一OpenGL直線、圓的繪制_第1頁
實驗一OpenGL直線、圓的繪制_第2頁
實驗一OpenGL直線、圓的繪制_第3頁
實驗一OpenGL直線、圓的繪制_第4頁
實驗一OpenGL直線、圓的繪制_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗一、OpenGL直線、圓的繪制1、實驗目的1〕了解OpenGL圖形庫的功能和結構;2〕學習了解OpenGL程序的根本結構,及常用函數(shù);3〕學習使用OpenGL繪制根本圖形〔線、圓〕;2、實驗內容1〕使用OpenGL編寫一個簡單的C++程序,使該程序能夠繪制出直線。2〕使用OpenGL編寫一個簡單的C++程序,使該程序能夠繪制出圓。3、實驗過程1〕在系統(tǒng)上配置好OpenGL的環(huán)境〔頭文件,庫文件,和鏈接庫文件〕;2〕使用VisualV++6.0新建一個C++文檔,并創(chuàng)立相應的工程;3〕在文檔中引入OpenGL的頭文件,編輯代碼實現(xiàn)鼠標拖動畫直線,畫圓。4、實驗結果可單擊鼠標左鍵,然后拖動鼠標畫出兩條直線,并同時畫出圓;可單擊鼠標右鍵,然后拖動鼠標畫出兩個圓,并同時畫出直線。結果截圖:鼠標左鍵主要控制繪制的直線:鼠標右鍵主要控制繪制的圓:5、實驗代碼#include<gl/glut.h>#include<math.h>//GLintpNum=0;GLintpx1,py1,px2,py2,cx,cy,r;GLintwinWidth=600,winHeight=600;//////////////////畫直線////////////voidDraw_Bresenham(intpStartx,intpStarty,intpEndx,intpEndy){//用Bresenham算法畫直線inti;if(pStartx==pEndx){//為豎線if(pStarty<=pEndy){for(i=pStarty;i<=pEndy;i++)glVertex2f(pStartx,i);}else{for(i=pEndy;i<=pStarty;i++)glVertex2f(pStartx,i);}return;}//為橫線if(pStarty==pEndy){if(pStartx<=pEndx){for(i=pStartx;i<=pEndx;i++)glVertex2f(i,pStarty);}else{for(i=pEndx;i<=pStartx;i++)glVertex2f(i,pStarty);}return;}//為斜線floatm=(pEndy-pStarty)*1.0/(pEndx-pStartx);floatp;p=2*m-1;if(m>0&&m<=1){if(pStartx<pEndx){while(pStartx<=pEndx){glVertex2f(pStartx++,pStarty);if(p>=0){p+=2*m-2;pStarty++;}elsep+=2*m;}}else{while(pEndx<=pStartx){glVertex2f(pEndx++,pEndy);if(p>=0){p+=2*m-2;pEndy++;}elsep+=2*m;}}return;}p=-2*m-1;if(m<0&&m>=-1){if(pStartx<pEndx){while(pStartx<=pEndx){glVertex2f(pStartx++,pStarty);if(p>=0){p+=-2*m-2;pStarty--;}elsep+=-2*m;}}else{while(pEndx<=pStartx){glVertex2f(pEndx++,pEndy);if(p>=0){p+=-2*m-2;pEndy--;}elsep+=-2*m;}}return;}p=2/m-1;if(m>1){if(pStarty<pEndy){while(pStarty<=pEndy){glVertex2f(pStartx,pStarty++);if(p>=0){p+=2/m-2;pStartx++;}elsep+=2/m;}}else{while(pEndy<=pStarty){glVertex2f(pEndx,pEndy++);if(p>=0){p+=2/m-2;pEndx++;}elsep+=2/m;}}return;}p=-2/m-1;if(pStarty<pEndy){while(pStarty<=pEndy){glVertex2f(pStartx,pStarty++);if(p>=0){p+=-2/m-2;pStartx--;}elsep+=-2/m;}}else{while(pEndy<=pStarty){glVertex2f(pEndx,pEndy++);if(p>=0){p+=-2/m-2;pEndx--;}elsep+=-2/m;}}}//////////////////畫圓/////////////////////其他象限繪制voidCirclePoints(intx,inty){//第1象限glVertex2f(x,y);glVertex2f(y,x);//第2象限glVertex2f(-x,y);glVertex2f(-y,x);//第3象限glVertex2f(-y,-x);glVertex2f(-x,-y);//第4象限glVertex2f(x,-y);glVertex2f(y,-x);}//////////中點算法畫圓voidDrawCircle(intcx,intcy,intradis){glPushMatrix();glTranslatef(cx,cy,0); glPointSize(1); glColor3f(0.5f,0.5f,1.0f); glBegin(GL_POINTS);intx,y;doublep;x=0;y=radis;p=1.25-radis;while(x<=y+1){CirclePoints(x,y);x++;if(p>=0){y--;p+=2.0*(x-y)+5;}elsep+=2*x+3;} glEnd(); glPopMatrix();}//////////繪制坐標軸voidDrawOx(){ glColor3f(0.95,0.7,0.8); glPointSize(1); glBegin(GL_LINES); glVertex2f(-winWidth/2,0); glVertex2f(winWidth/2,0); glVertex2f(0,winHeight/2); glVertex2f(0,-winHeight/2); glEnd();}//////////顯示函數(shù)voidDisplay(){////////GL_COLOR_BUFFER_BIT(用背景顏色填充)glClear(GL_COLOR_BUFFER_BIT); DrawOx(); glColor3f(0.0,0.0,1.0); glBegin(GL_POINTS); //BresenhamLine(px1,py1,px2,py2); Draw_Bresenham(px1,py1,px2,py2); glEnd(); glBegin(GL_POINTS); Draw_Bresenham(py1,px1,py2,px2); glEnd();//glBegin(GL_LINES); //glVertex2f(px1,py1); //glVertex2f(px2,py2); //glVertex2f(py1,px1); //glVertex2f(py2,px2); //glEnd();DrawCircle(cx,cy,r);DrawCircle(cy,cx,r);///交換緩沖區(qū) glutSwapBuffers(); //glFlush();//刷新繪圖命令 }//設置渲染狀態(tài)〔聽起來滿下人,實際上很簡單〕voidSetupRC(void){ //去除顏色〔這里為黑色,為了方便找畫的那個點〕,可以理解成背景顏色 //和glColor4f(1.0f,0.0f,0.0f,1.0f)一樣,所有參數(shù)都在0.0到1.0之間,后綴f是表示參數(shù)是浮點型的 //最后的那個1.0f是透明度,0.0f表示全透明,1.0f是完全不透明 glClearColor(1.0f,1.0f,1.0f,1.0f);}//當繪制的窗口大小改變時重新繪制,使繪制的圖形同比例變化,//幾乎所有OpenGL程序中的這個函數(shù)都是一樣的,所以,放心大膽的拷貝吧voidChangeSize(intw,inth){ winWidth=w; winHeight=h; //設置觀察視野為窗口大小〔用FLASH里面的話來說應該叫設置攝象機視野〕 glViewport(0,0,w,h); //重置坐標系統(tǒng),指定設置投影參數(shù) glMatrixMode(GL_PROJECTION); ///////調用單位矩陣,去掉以前的投影參數(shù)設置 glLoadIdentity();//////設置投影參數(shù) gluOrtho2D(-w/2,w/2,-h/2,h/2);}/////////////////鼠標點擊voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse){ if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){ px1=xMouse-winWidth/2; py1=winHeight/2-yMouse; } if(button==GLUT_LEFT_BUTTON&&action==GLUT_UP){ px2=xMouse-winWidth/2; py2=winHeight/2-yMouse; glutPostRedisplay(); } if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN){ cx=xMouse-winWidth/2; cy=winHeight/2-yMouse; }}////////////////鼠標移動voidMouseMove(GLintxMouse,GLintyMouse){

溫馨提示

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

最新文檔

評論

0/150

提交評論