您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 实验二OpenGL颜色填充
实验二、OpenGL颜色填充1、实验目的1)了解OpenGL图形库的功能和结构;2)学习了解OpenGL程序的基本结构,及常用函数;3)学习使用OpenGL颜色填充算法;2、实验内容1)使用OpenGL编写一个简单的C++程序,使该程序能够填充多边形和圆等图形。2)使用OpenGL编写一个简单的C++程序,使该程序能够填充已填充过的图形。3、实验过程1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);2)使用VisualV++6.0新建一个C++文档,并创建相应的工程;3)在文档中引入OpenGL的头文件,编辑代码实现:对不同图形的不同颜色填充。4、实验结果可单击鼠标左键,填充选中的图形;可单击鼠标右键,调出菜单,可改变填充颜色,可恢复为填充状态。结果截图:1.初始状态:2.填充多边形:3.调出菜单,选择颜色:4.填充圆形:5.填充已填充的图形:5、实验代码1.#includestdio.h2.#includeGL/glut.h3.#includemath.h4.#includewindows.h5.6.////////////程序还有问题,不知如何解决7.////////圆周率8.constGLfloatPi=3.1415926536f;9.///////////窗口长宽10.GLfloatWinWidth=600.0,WinHeight=600.0;11.//////////种子点12.GLintfillx,filly;13.////////填充色14.GLubytefillColor[3]={255,0,255};15./////////判定点色16.GLubytePixel[3];17./////////取点色18.GLubyteOldColor[3];19.20.//////////绘制初始化21.voidinit(void)22.{23.glClearColor(1.0,1.0,1.0,1.0);24.glViewport(0,0,WinWidth,WinHeight);25.glMatrixMode(GL_PROJECTION);26.///////调用单位矩阵,去掉以前的投影参数设置27.glLoadIdentity();28.gluOrtho2D(0.0,WinWidth,0.0,WinHeight);29.}30.//////////比较颜色是否相同31.boolEqualColor(GLubytec1[],GLubytec2[]){32.if(c1[0]==c2[0]&&c1[1]==c2[1]&&c1[2]==c2[2])33.returntrue;34.elsereturnfalse;35.}36.///////////填充点色37.voidsetPixel(GLintx,GLinty){38.glColor3f(fillColor[0],fillColor[1],fillColor[2]);39.glBegin(GL_POINTS);40.glVertex3f(x,y,0.0);41.glEnd();42.}43.44.//////////////种子填充函数,四联通,递归45.voidfill(GLintx,GLinty){46.glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,Pixel);47.if(EqualColor(fillColor,OldColor))48.return;49.setPixel(x,y);50.//Sleep(1);51.52.glReadPixels(x,y-1,1,1,GL_RGB,GL_UNSIGNED_BYTE,Pixel);53.if(EqualColor(Pixel,OldColor))54.{fill(x,y-1);55.}56.57.glReadPixels(x-1,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,Pixel);58.if(EqualColor(Pixel,OldColor))59.{fill(x-1,y);60.}61.62.glReadPixels(x+1,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,Pixel);63.if(EqualColor(Pixel,OldColor))64.{fill(x+1,y);65.}66.67.glReadPixels(x,y+1,1,1,GL_RGB,GL_UNSIGNED_BYTE,Pixel);68.if(EqualColor(Pixel,OldColor))69.{fill(x,y+1);70.}71.//////////72.return;73.}74.75.///////////////////画圆函数76.voidDrawCircle(GLintx,GLinty,GLfloatR,GLintn)77.{78.inti;79.80.glBegin(GL_LINE_LOOP);81.for(i=0;i=n;++i)82.glVertex2f(R*cos(2*Pi/n*i)+x,R*sin(2*Pi/n*i)+y);83.glEnd();84.}85.86.voiddisplay(void)87.{88.glClear(GL_COLOR_BUFFER_BIT);89.//////////画填充三角形90.glColor3f(0,200,0);91.glBegin(GL_TRIANGLES);92.glVertex3f(150,50,0.0);93.glVertex3f(250,50,0.0);94.glVertex3f(250,150,0.0);95.glEnd();96.//////////画一个四角星97.glColor3f(200,0,0);98.glBegin(GL_LINE_LOOP);99.glVertex3f(50,50,0.0);100.glVertex3f(75,60,0.0);101.glVertex3f(100,50,0.0);102.glVertex3f(90,75,0.0);103.glVertex3f(100,100,0.0);104.glVertex3f(75,90,0.0);105.glVertex3f(50,100,0.0);106.glVertex3f(60,75,0.0);107.glEnd();108.///////////画一个多边形109.glColor3f(0.0,0.0,0.9);110.DrawCircle(150,100,50,8);111./////////画一个近似圆112.glColor3f(0.0,0.9,0.9);113.DrawCircle(300,100,50,1000);114.115.glFlush();116.117.}118.119./////////////////鼠标点击120.voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse){121.if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){122.fillx=xMouse;123.filly=WinHeight-yMouse;124.glReadPixels(fillx,filly,1,1,GL_RGB,GL_UNSIGNED_BYTE,&Pixel);125.OldColor[0]=Pixel[0];126.OldColor[1]=Pixel[1];127.OldColor[2]=Pixel[2];128.///////////填充129.fill(fillx,filly);130.//printf(x:%d,y:%d-R:%d,G:%d,B:%d\n,fillx,filly,Pixel[0],Pixel[1],Pixel[2]);131.}132.if(button==GLUT_RIGHT_BUTTON&&action==GLUT_UP){133.glutPostRedisplay();134.}135.}136.137.voidsetFillColor(GLintR,GLintG,GLintB){138.fillColor[0]=R;139.fillColor[1]=G;140.fillColor[2]=B;141.}142.143.voidProcessMenu(intvalue)144.{145.//iMode=value;146.switch(value){147.case1:setFillColor(255,0,0);break;148.case2:setFillColor(0,255,0);break;149.case3:setFillColor(0,0,255);break;150.case4:setFillColor(255,255,0);break;151.case5:setFillColor(255,0,255);break;152.case6:setFillColor(0,255,255);break;153.case7:setFillColor(0,0,0);break;154.case8:setFillColor(255,255,255);break;155.case9:glutPostRedisplay();break;156.157.}158.//glutPostRedisplay();159.}160.161.intmain(intargc,char**argv)162.{163.glutInit(&argc,argv);164.glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);165.glutInitWindowSize(WinWidth,WinHeight);166.glutInitWindowPosition(300,100);167.glutCreateWindow(颜色填充);168.init();169.170.////////////创建菜单并定义菜单回调函数/////////171.////////创建填充颜色菜单172.intnGlFillColor=glutCreateMenu(ProcessMenu);173.glutAddMenuEntry(红(255,000,000),1);174.glutAddMenuEntry(绿(000,255,000),2);175.glutAddMenuEntry(蓝(000,000,255),3);176.glutAddMenuEntry(黄(255,255,000),4);177.glutAddMenuEntry(紫(255,000,255),5);178.glutAddMenuEntry(青(000,255,255),6);179.glutAddMenuEntry(黑(000,000,000),7);180.glutAddMenuEntry(白(255,255,255),8);181.//////////创建主菜单182.intnMainMenu=glutCreateMenu(ProcessMenu);183.glutAddSubMenu(填充颜色,nGlFillColor);184.glutAddMenuEntry(恢复未填充,9);185./////右键调出菜单186.glutAttachMenu(GLUT_RIGHT_BUTTON);187.188.glutDisplayFunc(display);189.//////调用鼠标点击函数190.glutMouseFunc(MousePlot);191.glutMainLoop();192.193.return0;194.}
本文标题:实验二OpenGL颜色填充
链接地址:https://www.777doc.com/doc-7311198 .html