《2022年2022年-计算机图形学实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年-计算机图形学实验报告 .pdf(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计算机图形学实验报告姓名:_ _ 学号:_ _ 班级:_ _ 时间:_2016年 12 月_ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 34 页 - - - - - - - - - 实验一OpenGL 编程与图形绘制1实验目的了解OpenGL 编程,并熟悉OpenGL 的主要功能、绘制流程和基本语法。学会配置OpenGL 环境,并在该环境中编程绘图。2实验内容OpenGL 的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实
2、时动画和交互技术。OpenGL 的绘制流程分为两个方面:一个完整的窗口系统的OpenGL 图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL 命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、 顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。OpenGL 的基本语法中相关库有:OpenGL 核心库:gl、 OpenGL 实用程序库:glu、 OpenG编程辅助库: aux、OpenGL 实用程序工具包 (OpenGL utility toolkit,GLUT
3、) :glut、Windows专用库: wgl。OpenGL 的基本语法中命名规则为:OpenGL 函数都遵循一个命名约定,即采用以下格式: 。了解了上述基础知识后,配置好OpenGL 环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。3实验代码及结果3.1 点的绘制:#includevoid Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);
4、 /设置投影参数void Display(void)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 34 页 - - - - - - - - - glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红/ glRectf(50.0f,100.0f,150.0f,50.0f); /绘制一个矩形glPointSize(10); /三个点glBegin(GL_POINTS)
5、;glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120)
6、; /设置窗口位置glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Display); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口GLUT 事件处理循环return 0;运行结果:3.2 直线的绘制:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 34 页 - - - - - - - - - #includevoid Initial(void)glCle
7、arColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色/ glRectf(50.0f,100.0f,150.0f,50.0f); /绘制一个矩形glBegin(GL_LINE_LOOP); /五角星glVertex
8、2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120);
9、 /设置窗口位置glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Display); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口 GLUT 事件处理循环return 0;运行结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 34 页 - - - - - - - - - 3.3 多边形面的绘制:#includevoid Initial(void)glC
10、learColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色/ glRectf(50.0f,100.0f,150.0f,50.0f); /绘制一个矩形glBegin(GL_TRIANGLES); /等边三角形glVe
11、rtex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120); /设置窗口位置名师资料总结 - - -精品资料欢迎下
12、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 34 页 - - - - - - - - - glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Display); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口GLUT 事件处理循环return 0;运行结果:实验二直线绘制实验1. 实验目的为了进一步熟悉OpenGL 编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数
13、值微分法、中点画线算法和Bresenham 算法。2. 实验内容(一)数值微分法数值微分法直接从直线的微分方程生成直线。给定直线的两端点:P0(X0,Y0) 和P1(X1,Y1) ,得到直线的微分方程dy/dx=y/x=(Y1-Y0)/(X1-X0)=k。数值微分算法的原理是,由于直线的一阶导数是连续的,而且x 和 y 是成比例的,因此通过在当前位置(Xi ,Yi )分别加上两个小增量x 和 y( 为无穷小的正数) 来名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 34
14、页 - - - - - - - - - 求下一点( X(i+1),Y(i+1))的 x,y 坐标。(二)中点画线算法给定直线的两端点:P0(X0,Y0) 和 P1(X1,Y1) ,可得到直线方程F(x,y)=y -kx-b=0 且 k=y/x=(Y1-Y0)/(X1-X0)。绘图过程如下:1.输入直线的两端点P0(X0,Y0) 和 P1(X1,Y1) 。2.计算初始值x, y,d= x-2 y,x=X0,y=Y0. 3. 绘制点 (x,y)。判断 d 的符号, 若 d0, 则(x,y)更新为 (x+1,y+1),同样将 e 更新为e-2 x;否则 (x,y)更新为 (x+1,y)。5.当直线没
15、有画完时,重复步骤3和4;否则结束。3. 实验代码及结果3.1 数值微分算法编程绘制直线代码:#include#includevoid Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口名师资料总结 - - -精品资料欢迎下载 - - - - - - -
16、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 34 页 - - - - - - - - - glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色glBegin(GL_LINES);int x0=10;int y0=20;int x1=30;int y1=40;int color=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=a
17、bs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k=epsl;k+)glVertex2i(int(x+0.5),(int)(y+0.5);x+=xIncre;y+=yIncre;glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWind
18、owSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120); /设置窗口位置glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Display); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口 GLUT 事件处理循环return 0;实验结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 34 页 -
19、- - - - - - - - 2.2 中点画线算法编程绘制直线代码:#include#includevoid Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色glBegi
20、n(GL_POINTS);int x0=50;int y0=20;int x1=100;int y1=120;int color=10;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;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 34 页 - - - - - - - - - d=dx -2*dy;UpIncre
21、=2*dx -2*dy; DownIncre=2*dy;while(x=x1)glVertex2i(x,y);x+;if(d0)y+;d+=UpIncre;else d+=DownIncre;glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPos
22、ition(100,120); /设置窗口位置glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Display); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口 GLUT 事件处理循环return 0;实验结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 34 页 - - - - - - - - - 2.3Bresenham 算法编程绘制直线代码:#
23、include #include void Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);/指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);/设置投影参数void Display(void)glClear(GL_COLOR_BUFFER_BIT);/用当前背景色填充窗口glColor3f(1.0f,0.0f,0.0f);/设置当前的绘图颜色为红色/Bresenham 算法glBegin(GL_POINTS);int x0 = 10;i
24、nt y0 = 20;int x1 = 90;int y1 = 90;int color=10;int x,y,dx,dy,e;dx = x1-x0;dy = y1 -y0;e=-dx;x=x0;y=y0;while(x0)y+;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 34 页 - - - - - - - - - e=e-2*dx;glEnd();glFlush();/清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,ch
25、ar*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的现实模式glutInitWindowSize(400,300);/设置窗口的尺寸glutInitWindowPosition(100,200);/设置窗口的位置glutCreateWindow( 点);/创建一个名为矩形的窗口glutDisplayFunc(Display);/设置当前窗口的显示函数Initial();/完成窗口的初始化glutMainLoop();/启动主 GLUT 事件处理循环return 0;实验结果:名师资料总结 -
26、 - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 34 页 - - - - - - - - - 实验三圆绘制实验1. 实验目的2. 实验内容(一)八分法画圆圆心位于原点的圆有4 条对称轴x=0,y=0,y=x,y= -x。若已知圆上任一点(x,y), 可以得到其在圆周上关于四条对称轴的另外7 个点 (y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x, -y)。(二)中点 Bresenham 画圆算法算法步骤如下:1输入圆的半径R2计算初始值d=1-R,x=0,y
27、=R 。3绘制点 (x,y)及其在八分圆中的另外7 个对称点。4判断 d 的符号。若d0, 则先将 d 更新为 d+2x+3, 再将(x,y)更新为 (x+1,y);否则先将d 更新为 d+2(x-y)+5,再将 (x,y) 更新为 (x+1,y-1)。5当 xy 时,重复步骤3和4;否则结束。(三)椭圆的中点Bresenham 算法算法步骤如下:1输入椭圆的长半轴a 和短半轴b。2计算初始值d=b2+a2(-b+0.25),x=0,y=b 。3绘制点 (x,y)及其在四分象限上的另外三个对称点。4判断 d 的符号。若d=0,则先将 d 更新为 d+b2(2x+3), 再将 (x,y)更新为
28、(x+1,y); 否则先将 d 更新为 d+b2(2x+3)+a2( -2y+2),再将 (x,y)更新为 (x+1,y -1)。5当 b2(x+1)a2(y -0.5)时,重复步骤3和4;否则转到步骤6。6用 上 半 部 分 计 算 的 最 后 点 (x,y) 来 计 算 下 半 部 分 中d的 初 值d=b2(x+0.5)2+a2(y -1)2-a2b27绘制点 (x,y)及其在四分象限上的另外三个对称点。8判断d 的符号。若d=0 时,重复步骤7和8;否则结束。3. 实验代码及结果3.1 八分法画圆程序代码:#include#includevoid Initial(void)glClea
29、rColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void CirclePoint(int x,int y,int color)glVertex2i(x+50,y+50);glVertex2i(y+50,x+50);glVertex2i( -y+50,x+50);glVertex2i( -x+50,y+50);glVertex2i( -x+50,-y+50);glVertex2i( -y+50,-x+50);
30、glVertex2i(y+50, -x+50);glVertex2i(x+50, -y+50);void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色glPointSize(10); glBegin(GL_POINTS);CirclePoint(10,20,20);glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv
31、);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120); /设置窗口位置名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 34 页 - - - - - - - - - glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Displ
32、ay); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口GLUT 事件处理循环return 0;实验结果:3.2 中点 Bresenham 算法绘制圆代码#include#includevoid Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void CirclePoint(int x,int y,int
33、color)glVertex2i(x+50,y+50);glVertex2i(y+50,x+50);glVertex2i( -y+50,x+50);glVertex2i( -x+50,y+50);glVertex2i( -x+50,-y+50);glVertex2i( -y+50,-x+50);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 34 页 - - - - - - - - - glVertex2i(y+50, -x+50);glVertex2i(x+50, -
34、y+50);void MidBresenhamCircle(int r,int color)int x,y,d;x=0;y=r;d=1 -r;while(x=y)CirclePoint(x,y,color);if(d0)d+=2*x+3;elsed+=2*(x -y)+5;y-;x+;void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色glPointSize(3); glBegin(GL_POINTS);MidBresenhamCircle(20,
35、10);glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120); /设置窗口位置glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口glutDisplayFunc(Display); /设置当前窗口
36、的显示回调函数Initial(); /完成窗口初始化名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 34 页 - - - - - - - - - glutMainLoop(); /完成窗口GLUT 事件处理循环return 0;实验结果:3.3 中点 Bresenham 算法绘制椭圆代码:#include#includevoid Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); /设置窗口背景颜色为白色glMatrixMod
37、e(GL_PROJECTION); /指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); /设置投影参数void MidBresenhamEllipse(int a,int b,int color)int x,y;float d1,d2;x=0;y=b;d1=b*b+a*a*( -b+0.25);glVertex2i(x+50,y+50); glVertex2i(-x+50,-y+50);glVertex2i( -x+50,y+50); glVertex2i(x+50, -y+50);while(b*b*(x+1)a*a*(y-0.5)if(d10)if(d2=0
38、)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y -;elsed2+=a*a*( -2*y+3);y-;glVertex2i(x+50,y+50); glVertex2i( -x+50,-y+50);glVertex2i( -x+50,y+50); glVertex2i(x+50, -y+50);void Display(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); /设置当前的绘图颜色为红色glPointSize(3); glBegin(GL_POINTS);MidBre
39、senhamEllipse(40,25,10);glEnd();glFlush(); /清空 OpenGL 命令缓冲区,执行OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120); /设置窗口位置glutCreateWindow( 矩形 ); /创建一个名为矩形的窗口名师资料总结 - - -精
40、品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 34 页 - - - - - - - - - glutDisplayFunc(Display); /设置当前窗口的显示回调函数Initial(); /完成窗口初始化glutMainLoop(); /完成窗口GLUT 事件处理循环return 0;实验结果:实验四填充算法实验1. 实验目的掌握用扫描线种子填充法,实现扫描线种子填充算法填充任一多边形区域的程序2. 实验内容算法步骤如下:(1)种子像素入栈。(2)执行如下三步操作:1栈顶像素出栈。2填充
41、出栈像素所在扫描线的连续像素段,从出栈的像素开始沿扫描线向左和向右填充,直到遇到边界像素为止,即每出栈一个像素,就对包含该像素的整个扫描线区间进行填充,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 34 页 - - - - - - - - - 并且记录下此时扫描线区间的x 坐标范围 x1,x2 。3分别检查上、下两条扫描线上位于x1,x2 坐标区间内的未被填充的连续水平像素段,将每个连续像素段的最左像素取作种子像素压人栈堆。(3)检查栈是否为空,若栈非空重复执行步骤(
42、2),若栈为非空则结束。3. 实验代码及结果代码:#include gl/glut.h#include math.h#include stdlib.h#include conio.h#include typedef float Color3;struct PointGLint x;GLint y;std:stack stk;void init(void)glClearColor(1.0,1.0,1.0,1.0);/Set display -window color white.glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,400.0,0.0,400.0)
43、;void setPixel(GLint x,GLint y);/种子像素坐标void setPixel(Point cur_point)glBegin(GL_POINTS);glVertex2i(cur_point.x,cur_point.y);glEnd();glFlush();void getPixel(Point cur_point,Color c)glReadPixels(cur_point.x,cur_point.y,1,1,GL_RGB,GL_FLOAT,c);bool rgbColorEqual(Color c1,Color c2)/c1 颜色数据与c2 颜色数据,当正负误差不
44、超过0.0001 时,返回值为1,否则为 0if(abs(c10 -c20)0.001)|(abs(c11 -c21)0.001)|(abs(c12 -c22)0.001)return 0;else return 1;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 34 页 - - - - - - - - - int FillLineRegion(Point cur_point,Color fillColor,Color borderColor,int directio
45、n)int count=0;Color interiorColor;glColor3f(fillColor0,fillColor1,fillColor2);getPixel(cur_point,interiorColor);while(!(rgbColorEqual(interiorColor,borderColor)&!(rgbColorEqual(interiorColor,fillColor)/这个判断保证读取的像素的颜色数据与边界颜色还有填充颜色数据在数值上相差较大/即当正读取像素不是多边形边界,且也没有被填充,则执行以下花括号内的操作setPixel(cur_point); /set
46、colot of pixel to fillColor. /为坐标为 (x,y)的像素上色if(direction=0)cur_point.x+;elsecur_point.x -;getPixel(cur_point,interiorColor);count+;return count;int IsPixelValid(Point cur_point,Color fillColor,Color borderColor)Color interiorColor;getPixel(cur_point,interiorColor);if(!(rgbColorEqual(interiorColor,b
47、orderColor)&!(rgbColorEqual(interiorColor,fillColor)return 1;elsereturn 0;void SearchLineNewSeed(int xLeft,int xRight,int y,Color fillColor,Color borderColor)/在种子像素所在扫描线上一条或下一条是扫描线寻找新种子像素int xt=xLeft;int seed_left= -1;Point seed_point;Point temp_point;while(xt=xRight)seed_left=-1;temp_point.x=xt;tem
48、p_point.y=y;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 34 页 - - - - - - - - - while(xt=xRight) /find the first valid pointif(IsPixelValid(temp_point,fillColor,borderColor)seed_left=temp_point.x;break;elsext+;temp_point.x=xt;while(xt=xRight) /find the next
49、invalid pointif(IsPixelValid(temp_point,fillColor,borderColor)xt+;temp_point.x=xt;elsebreak;if(seed_left!= -1)seed_point.x=seed_left;seed_point.y=y;stk.push(seed_point);void scanLine(Point cur_point,Color fillColor,Color borderColor)int count=0;int right,left;Point temp_point;while(!stk.empty()Point
50、 seed_point=stk.top();stk.pop(); /种子像素出栈count=FillLineRegion(seed_point,fillColor,borderColor,0);/填充种子像素所在的扫描线右边名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 34 页 - - - - - - - - - right=seed_point.x+count -1;temp_point.x=seed_point.x -1;temp_point.y=seed_poi