实验二、OpenGL颜色填充1、实验目的1)了解OpenGL 图形库的功能和结构;2)学习了解OpenGL 程序的基本结构,及常用函数;3)学习使用OpenGL 颜色填充算法;2、实验内容1)使用OpenGL 编写一个简单的C++程序,使该程序能够填充多边形和圆等图形。
2 )使用OpenGL 编写一个简单的C++程序,使该程序能够填充已填充过的图形。
3、实验过程1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);2)使用Visual V++6.0 新建一个C++文档,并创建相应的工程;3)在文档中引入OpenGL的头文件,编辑代码实现:对不同图形的不同颜色填充。
4、实验结果可单击鼠标左键,填充选中的图形;可单击鼠标右键,调出菜单,可改变填充颜色,可恢复为填充状态。
结果截图:1.初始状态:2.填充多边形:3.调出菜单,选择颜色:4.填充圆形:5.填充已填充的图形:5、实验代码1.#include "stdio.h"2.#include <GL/glut.h>3.#include <math.h>4.#include "windows.h"5.6.////////////程序还有问题,不知如何解决7.////////圆周率8.const GLfloat Pi = 3.1415926536f;9.///////////窗口长宽10.GLfloat WinWidth=600.0, WinHeight=600.0;11.//////////种子点12.GLint fillx,filly;13.////////填充色14.GLubyte fillColor[3]={255,0,255};15./////////判定点色16.GLubyte Pixel[3];17./////////取点色18.GLubyte OldColor[3];19.20.//////////绘制初始化21.void init(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.bool EqualColor(GLubyte c1[],GLubyte c2[]){32.if(c1[0]==c2[0]&&c1[1]==c2[1]&&c1[2]==c2[2])33.return true;34.else return false;35.}36.///////////填充点色37.void setPixel(GLint x,GLint y){38.glColor3f(fillColor[0], fillColor[1], fillColor[2]);39.glBegin(GL_POINTS);40.glVertex3f(x,y,0.0);41.glEnd();42.}43.44.//////////////种子填充函数,四联通,递归45.void fill(GLint x, GLint y){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.void DrawCircle(GLint x,GLint y,GLfloat R,GLint n)77.{78.int i;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.void display(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.void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse){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.void setFillColor(GLint R,GLint G,GLint B){138.fillColor[0]=R;139.fillColor[1]=G;140.fillColor[2]=B;141.}142.143.void ProcessMenu(int value)144.{145.//iMode = value;146.switch (value){147.case 1:setFillColor(255,0,0);break; 148.case 2:setFillColor(0,255,0);break; 149.case 3:setFillColor(0,0,255);break; 150.case 4:setFillColor(255,255,0);break; 151.case 5:setFillColor(255,0,255);break; 152.case 6:setFillColor(0,255,255);break; 153.case 7:setFillColor(0,0,0);break; 154.case 8:setFillColor(255,255,255);break; 155.case 9:glutPostRedisplay();break; 156.157.}158.//glutPostRedisplay();159.}160.161.int main(int argc, 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.int nGlFillColor = 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.int nMainMenu = 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.return 0 ;194.}。