OpenGL通過(guò)中點(diǎn)法繪制直線和圓
更新時(shí)間:2020年02月20日 08:56:22 作者:陳紋欽
這篇文章主要為大家詳細(xì)介紹了OpenGL通過(guò)中點(diǎn)法繪制直線和圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了OpenGL繪制直線和圓的具體代碼,供大家參考,具體內(nèi)容如下
#include <gl/glut.h> #include <math.h> static int i=1; void Initial(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //設(shè)置窗口背景顏色為白色 glMatrixMode(GL_PROJECTION); //指定設(shè)置投影參數(shù) gluOrtho2D(-200.0,200.0,-200.0,200.0); //設(shè)置投影參數(shù) //指的是視圖范圍,如果(0,200,0,200)的話就只能在第一象限顯示,就1/4圓,第1,3的參數(shù)是左下角坐標(biāo),第2,4的參數(shù)是右上角坐標(biāo) } /*void Display(void) { glClear(GL_COLOR_BUFFER_BIT); //用當(dāng)前背景色填充窗口 glColor3f(1.0f, 0.0f, 0.0f); //設(shè)置當(dāng)前的繪圖顏色為紅色 glRectf(50.0f, 100.0f, 150.0f, 50.0f); //繪制一個(gè)矩形 glFlush(); //處理所有的OpenGL程序 } */ void DDALine(int x0,int y0,int x1,int y1) { //glVertex2f(10,10); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx = x1 - x0; dy = y1 - y0; x = x0; y = y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; glPointSize(2); glBegin(GL_POINTS); for(k = 0;k <= epsl; k++) { glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(int(x+0.5),int(y+0.5)); x += xIncre; y += yIncre; } glEnd(); } void Mid_B(int x0,int y0,int x1,int y1) { int dx,dy,d,UpIncre,DownIncre,x,y; if(x0 > x1) { x = x1; x1 = x0; x0 = x; y = y1; y1 = y0; y0 = y; } x = x0; y = y0; dx = x1 - x0; dy = y1 - y0; d = dx - 2*dy; UpIncre = 2*dx - 2*dy; DownIncre =- 2*dy; glPointSize(2); glBegin(GL_POINTS); while(x <= x1) { glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(x,y); x++; if(d < 0) { y++; d += UpIncre; } else d += DownIncre; } glEnd(); } void G_B(int x0,int y0,int x1,int y1) { int x,y,dx,dy,e; dx = x1 - x0; dy = y1 - y0; e =- dx; x=x0; y=y0; glPointSize(2); glBegin(GL_POINTS); while(x <= x1) { glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(x,y); x++; e = e + 2*dy; if(e > 0) { y++; e = e - 2*dx; } } glEnd(); } void CirclePoint(int x, int y) { glPointSize(2); glBegin(GL_POINTS); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(x,y); glVertex2f(y,x); glVertex2f(-y,x); glVertex2f(-x,y); glVertex2f(-x,-y); glVertex2f(-y,-x); glVertex2f(y,-x); glVertex2f(x,-y); glEnd(); } void MidBresenhamCircle(int r) { int x = 0, y = r, d = 1-r; //glPointSize(2); //glBegin(GL_POINTS); while(x <= y) { CirclePoint(x,y); if(d < 0) d += 2*x+3; else { d += 2*(x-y)+5; y--; } x++; } glEnd(); } void ProcessMenu(int value) { i = value; glutPostRedisplay(); } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); //用當(dāng)前背景色填充窗口 glViewport(0,0,400,400); //前兩個(gè)參數(shù)改變?cè)c(diǎn)坐標(biāo),后兩個(gè)參數(shù)改變圖形長(zhǎng)寬(放大縮?。? switch(i) { case 1: DDALine(2,3,55,83); break; case 2: Mid_B(2,3,55,83); break; case 3: G_B(2,3,55,83); break; case 4: MidBresenhamCircle(50); break; } glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); //初始化GLUT庫(kù),處理命令行參數(shù) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的顯示模式 glutInitWindowSize(400,400); //設(shè)置窗口的尺寸 glutInitWindowPosition(100,100); //設(shè)置窗口的位置 glutCreateWindow("直線"); //創(chuàng)建一個(gè)名為矩形的窗口 int MainMenu = glutCreateMenu(ProcessMenu); //創(chuàng)建主菜單 glutAddMenuEntry("DDA算法",1); glutAddMenuEntry("中點(diǎn)Bresenham算法",2); glutAddMenuEntry("改進(jìn)的Bresenham算法",3); glutAddMenuEntry("中點(diǎn)bresenham畫(huà)圓",4); glutAttachMenu(GLUT_RIGHT_BUTTON); glutDisplayFunc(Display); //設(shè)置當(dāng)前窗口的顯示回調(diào)函數(shù) Initial(); //完成窗口初始化 glutMainLoop(); //啟動(dòng)主GLUT事件處理循環(huán) return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
c++中處理相關(guān)數(shù)學(xué)函數(shù)
數(shù)學(xué)庫(kù)函數(shù)聲明在 math.h 中,主要有:2013-04-04Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例
驗(yàn)證碼的原理基于人類(lèi)視覺(jué)和計(jì)算機(jī)視覺(jué)的差異性,通過(guò)給用戶顯示一些難以被機(jī)器識(shí)別的圖形或文字,讓用戶進(jìn)行人機(jī)交互,確認(rèn)自己的身份,這樣可以有效保護(hù)網(wǎng)站安全,所以本給大家介紹了Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例,感興趣的朋友可以參考下2024-01-01C++哈希表之閉散列方法的模擬實(shí)現(xiàn)詳解
閉散列指(開(kāi)放定址法)發(fā)生沖突時(shí),如果哈希表沒(méi)有被填滿,則表內(nèi)一定還有其他空閑位置,可以把沖突值放到下一個(gè)沒(méi)有被占用的空余位置上。本文將模擬實(shí)現(xiàn)閉散列方法,需要的可以參考一下2022-11-11c++中的字節(jié)序與符號(hào)位的問(wèn)題
這篇文章主要介紹了c++中的字節(jié)序與符號(hào)位的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語(yǔ)言 volatile與const同時(shí)使用應(yīng)注意的問(wèn)題
“volatile”的含義是“請(qǐng)不要做沒(méi)譜的優(yōu)化,這個(gè)值可能變掉的”,而并非“你可以修改這個(gè)值”。因此,它們本來(lái)就不是矛盾的2013-09-09美化你的代碼 vb(VBS)代碼格式化的實(shí)現(xiàn)代碼
雖然VB.NET出現(xiàn)很久了,但還有好多人仍然在使用VB6。我在實(shí)現(xiàn)一些小功能的時(shí)候也喜歡用VB6,畢竟誰(shuí)都不想每天的美好心情被VS那烏龜般的啟動(dòng)速度影響2012-05-05