用opengl编写一个简单的画图软件示例代码

本文介绍了一个使用OpenGL实现的简易绘图软件示例代码。该软件支持多种绘图模式,如直线、矩形等,并提供了颜色选择、像素大小调整等功能。尽管代码中存在一些问题,如闪烁现象,但为初学者提供了一个很好的起点。

//用opengl编写一个简单的画图软件示例代码(存在闪烁问题) //本代码,抄写自一本教授opengl的书,可惜,里面的代码存在一些问题,导致不能正常显示,现在是增加了一些语句的代码 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gl/glut.h> #include <GL/gl.h> #define NULL 0 #define LINE 1 #define RECTANGLE 2 #define TRIANGLE 3 #define POINTS 4 #define TEXT 5 void mouse(int,int,int,int); void key(unsigned char,int,int); void display(void); void drawSquare(int,int); void myReshape(GLsizei,GLsizei); void myinit(void); void screen_box(int,int,int); void right_menu(int); void middle_menu(int); void color_menu(int); void pixel_menu(int); void fill_menu(int); int pick(int,int); ///// long time(int); long baset; ///// GLsizei wh=500,ww=500; GLfloat size=3.0; int draw_mode=0; int rx,ry; GLfloat r=1.0,g=1.0,b=1.0; int fill=0; void drawSquare(int x,int y) { y=wh-y; glColor3ub((char)rand()%256,(char)rand()%256,(char)rand()%256); glBegin(GL_POLYGON); glVertex2f(x+size,y+size); glVertex2f(x-size,y+size); glVertex2f(x-size,y-size); glVertex2f(x+size,y-size); glEnd(); } void myReshape(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION);//模式 glLoadIdentity(); glOrtho(0.0,(GLdouble)w,0.0,(GLdouble)h,-1.0,1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(0,0,w,h); glClearColor(0.8,0.8,0.8,1.0); glClear(GL_COLOR_BUFFER_BIT); display(); glFlush(); ww=w; wh=h; } void myinit(void) { glViewport(0,0,ww,wh); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0,(GLdouble)ww,0.0,(GLdouble)wh,-1.0,1.0); glClearColor(0.8,0.8,0.8,1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); } void mouse(int btn,int state,int x,int y) { static int count; int where; static int xp[2],yp[2]; if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN) { glPushAttrib(GL_ALL_ATTRIB_BITS); where=pick(x,y); glColor3f(r,g,b); if(where!=0) { count=0; draw_mode=where; } else switch(draw_mode) { case (LINE): if(count=0) { count++; xp[0]=x; yp[0]=y; } else { glBegin(GL_LINES); glVertex2i(x,wh-y); glVertex2i(xp[0],wh-yp[0]); glEnd(); draw_mode=0; count=0; } break; case(RECTANGLE): if(count=0) { count++; xp[0]=x; yp[0]=y; } else { if(fill) glBegin(GL_POLYGON); else glBegin(GL_LINE_LOOP); glVertex2i(x,wh-y); glVertex2i(xp[0],wh-yp[0]); glVertex2i(xp[0],wh-yp[0]); glVertex2i(xp[0],wh-y); glEnd(); draw_mode=0; count=0; } break; case(TRIANGLE): switch(count) { case (0): count++; xp[0]=x; yp[0]=y; break; case (1): count++; xp[1]=x; yp[1]=y; break; case (2): if(fill) glBegin(GL_POLYGON); else glBegin(GL_LINE_LOOP); glVertex2i(xp[0],wh-yp[0]); glVertex2i(xp[1],wh-yp[1]); glVertex2i(x,wh-y); glEnd(); draw_mode=0; count=0; } break; case(POINTS): { drawSquare(x,y); count++; } break; case(TEXT): { rx=x; ry=wh-y; glRasterPos2i(rx,ry); count=0; } } glPopAttrib(); glFlush(); } } int pick(int x,int y) { y=wh-y; if(y<wh-ww/10) return 0; else if(x<ww/10) return LINE; else if(x<ww/5) return RECTANGLE; else if(x<3*ww/10) return TRIANGLE; else if(x<2*ww/5) return POINTS; else if(x<ww/2) return TEXT; else return 0; } void screen_box(int x,int y,int s) { glBegin(GL_QUADS); glVertex2i(x,y); glVertex2i(x+s,y); glVertex2i(x+s,y+s); glVertex2i(x,y+s); glEnd(); } //////************ void idle(void) { char out[]="00:00:00"; long t,time(int a); int min, sec, hr; glPushAttrib(GL_ALL_ATTRIB_BITS); t = 5623; hr=t/3600; min = (t - 3600*hr) /60; sec = (t - 3600*hr - 60*min); hr = hr%24; out[0]='0'+hr/10; out[1]='0'+hr%10; out[3]='0'+min/10; out[4]='0'+min%10; out[6]='0'+sec/10; out[7]='0'+sec%10; glRasterPos2i(ww-80, wh-15); glColor3f(0.9 ,1.0 ,1.0); glBegin(GL_QUADS); glVertex2i(ww-80, wh-15); glVertex2i(ww, wh-15); glVertex2i(ww, wh); glVertex2i(ww-80, wh); glEnd(); glColor3f(1.0,1.0,1.0); glCallLists(strlen(out) , GL_BYTE, out); glutSwapBuffers(); glPopAttrib(); } /////************* void right_menu(int id) { if(id==1) exit(0); else display(); } void middle_menu(int id) { } void color_menu(int id) { if(id==1) {r=1;g=0;b=0;} else if(id==2) {r=0;g=1;b=0;} else if(id==3) {r=0;g=0;b=1;} else if(id==4) {r=0;g=1;b=1;} else if(id==5) {r=1;g=0;b=1;} else if(id==6) {r=1;g=1;b=0;} else if(id==7) {r=1;g=1;b=1;} else if(id==8) {r=0;g=0;b=0;} } void pixel_menu(int id) { if(id==1) size=2*size; else if(size>1) size=size/2; } void fill_menu(int id) { if(id==1) fill=1; else fill=0; } void key(unsigned char k,int xx,int yy) { if(draw_mode!=TEXT) return; glColor3f(0.0,0.0,0.0); glRasterPos2i(rx,ry); glutBitmapCharacter(GLUT_BITMAP_9_BY_15,k); rx+=glutBitmapWidth(GLUT_BITMAP_9_BY_15,k); } void display(void) { int shift=0; glPushAttrib(GL_ALL_ATTRIB_BITS); glClearColor(0.8,0.8,0.8,1.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); screen_box(0,wh-ww/10,ww/10); glColor3f(1.0,0,0); screen_box(ww/10,wh-ww/10,ww/10); glColor3f(1.0,0,0); screen_box(ww/5,wh-ww/10,ww/10); glColor3f(1.0,0,0); screen_box(3*ww/10,wh-ww/10,ww/10); glColor3f(1.0,1.0,0); screen_box(2*ww/5,wh-ww/10,ww/10); glColor3f(0,0,0); screen_box(ww/10+ww/40,wh-ww/10+ww/40,ww/20); glBegin(GL_LINES); glVertex2i(wh/40,wh-ww/20); glVertex2i(wh/40+ww/20,wh-ww/20); glEnd(); glBegin(GL_TRIANGLES); glVertex2i(wh/5+ww/40,wh-ww/10+ww/40); glVertex2i(ww/5+ww/20,wh-ww/40); glVertex2i(ww/5+3*ww/40,wh-ww/20); glEnd(); glPointSize(3.0); glBegin(GL_POINTS); glVertex2i(3*ww/10+ww/20,wh-ww/20); glEnd(); glRasterPos2i(2*ww/5,wh-ww/20); glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'A'); shift=glutBitmapWidth(GLUT_BITMAP_9_BY_15,'A'); glRasterPos2i(2*ww/5+shift,wh-ww/20); glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'B'); shift+=glutBitmapWidth(GLUT_BITMAP_9_BY_15,'B'); glRasterPos2i(2*ww/5+shift,wh-ww/20); glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'C'); glFlush(); ///////**** glutIdleFunc(idle); glutSwapBuffers(); //////****** glPopAttrib(); } int main(int argc,char** argv) { int c_menu,p_menu,f_menu; glutInit(&argc,argv);//初始化 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//缓存模式 glutInitWindowSize(500,500);//显示框大小 //glutInitWindowPosition(50,50); glutCreateWindow("simpleCAD"); glutDisplayFunc(display); c_menu=glutCreateMenu(color_menu); glutAddMenuEntry("Red",1); glutAddMenuEntry("Green",2); glutAddMenuEntry("Blue",3); glutAddMenuEntry("Cyan",4); glutAddMenuEntry("Magenta",5); glutAddMenuEntry("Yellow",6); glutAddMenuEntry("White",7); glutAddMenuEntry("Black",8); p_menu=glutCreateMenu(pixel_menu); glutAddMenuEntry("increase pixel size",1); glutAddMenuEntry("decrease pixel size",2); f_menu=glutCreateMenu(fill_menu); glutAddMenuEntry("fill on",1); glutAddMenuEntry("fill off",2); glutCreateMenu(right_menu); glutAddMenuEntry("quit",1); glutAddMenuEntry("clear",2); glutAttachMenu(GLUT_RIGHT_BUTTON); glutCreateMenu(middle_menu); glutAddSubMenu("Colors",c_menu); glutAddSubMenu("Pixel Size",p_menu); glutAddSubMenu("fill",f_menu); glutAttachMenu(GLUT_MIDDLE_BUTTON); myinit(); glutReshapeFunc(myReshape); glutKeyboardFunc(key); glutMouseFunc(mouse); glutMainLoop();//进入glut事件处理循环 return (0); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值