实验二OpenGL颜色填充.docx
- 文档编号:11020765
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:10
- 大小:86.27KB
实验二OpenGL颜色填充.docx
《实验二OpenGL颜色填充.docx》由会员分享,可在线阅读,更多相关《实验二OpenGL颜色填充.docx(10页珍藏版)》请在冰豆网上搜索。
实验二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.#include"stdio.h"
2.#include
3.#include
4.#include"windows.h"
5.
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.}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 OpenGL 颜色 填充