《2023年计算机图形学实验报告.pdf》由会员分享,可在线阅读,更多相关《2023年计算机图形学实验报告.pdf(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计算机图形学实验报告姓名:_ _ _ _ _ _ _ _学号:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _班级:时间:2023年12月实验一 OpenGL编程与图形绘制1.实验目的了解O penG L编程,并熟悉Op e nG L 的重要功能、绘制流程和基本语法。学会配置OpenGL环境,并在该环境中编程绘图。2.实验内容0 p enG L的重要功能:模型绘制、模型观测、颜色模式、光照应用、图像效果增强、位图和图像解决、纹理映射、实时动画和交互技术。0 p e nG L的绘制流程分为两个方面:一个完整的窗口系统的Open
2、GL图形解决系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为Op e n G L,最上面的层为应用软件;O penG L命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。0 penGL的基本语法中相关库有:Ope nG L 核心库:g k O p e nG L 实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenG Lu t ilitytool k it,G LUT):glut,Wind ow s 专用库:wg 1 OpenG L
3、 的基本语法中命名规则为:0p enG L 函数都遵循一个命名约定,即采用以下格式:库前缀 根命令可选的参数个数 可选的参数类型。了解了上述基础知识后,配置好O penG L环境,然后在该环境中编程练习图形的绘制,本次实验重要是对点的绘制、直线的绘制和多边形面的绘制。3.实验代码及结果3.1 点的绘制:#includ e g 1/glu t.hv oi d Init i a 1 (v o i d)g 1 Cie a rColor(l.Of,1 .Of,1 .O f,l.Of):/设立窗口背景颜色为白色glMatrixMode(GL_PROJECTION);/指定设立投影参数gl u Orth
4、o 2D(0.0,20 0.0,0.0,1 5 0.0);/设立投影参数)void D i splay(v o id)(glCle a r(GL_COLOR_BU F FE R_BIT);用当前背景颜色填充窗 口glCo 1 or3f(l.0 f,O.Of,O.Of);设立当前的绘图颜色为红/g 1 Rec t f(50.0f,1 OO.Of,1 5 0.Of,5 0.0 f);绘制一个矩形glPo i ntSize(10);三个点glBegin(GL_P O I N T S);g 1 C olor3 f(l.Of,0.Of,0.Of);gl V ertex 2 i(2,148);glVert
5、ex2i(100,75);glVert e x 2i(1 98,2);glEn d();glF us h();清空。p e n G L 命令缓冲区,执行Op e nG L 程序)in t ma i n(i nt arg c,cha r*arg v 口)(g 1 utln i t(&a r g c,argv);g 1 u t InitD i splayMode(GLUT_SINGLE|G LUT_RGB);初始化窗口的显示模式g lutlnitWindowS i ze(4 00,30 0);设立窗口 的尺寸gl u 11 n i t W indowPo s ition(100,1 2 0);/设
6、立窗口位置glutC rea t eWi n do w(矩形);/创建一个名为矩形的窗口glu t Disp 1 ayFun c(D is p 1 a y);调函数I nit i al();glutMa i nLoo p();环return 0;)设立当前窗口的显示回/完毕窗口初始化/完毕窗口G L U T事件解决循运营结果:3.2 直线的绘制:#inclu d evo i d Initial(vo i d)g 1 Cie a rColo r(1.0f,1.0f,1.0 f,1.0 f);/设立窗口背景颜色为白色glMat r ixM o d e(GL_PROJE C T 1 ON);/指定设
7、立投影参数g 1 uOrtho2D(0.0,2 0 0.0,0.0,15 0.0);设立投影参数v o id Disp 1 a y(vo i d)g 1 Clear(GL_COLOR_BUFFE R BIT);/用当前背景颜色填充窗口glColor 3 f(1.0 f,0.0 f,0.Of);/设立当前的绘图颜色为红色/glRectf(5 0.Of,1 0 0.0f,150.0f,50.0 f);/绘制一个矩形glBegi n(GL_LINE_LOOP);/五角星gl V ertex 2 i(1 0,1 0);g 1 Ve r t e x 2 i(3 0,3 5);g 1 Verte x 2i
8、(50,l 0);g 1 Vertex2i(5,25);gl V e rtex2i(55,25);g End();glFlus h();/清空0 penGL命令缓冲区,执行Ope nG L程序int main(i n t arg c,c h a r*ar g v)glutlnit(&argc,argv);glutl n itDi s playMode(G LUT_SINGLE I G LUT RGB);初始化窗口的显示模式glut I n i tWindowSiz e(400,30 0);/设立窗口的尺寸g 1 u tlnitWind o wPo s i t i o n(100,1 2 0);
9、/设立窗口位置g 1 u t C r ea t eWi n dow(矩形 0);创建一个名为矩形的窗glutD i sp 1 a yF u nc(Display);设立当前窗口的显示回调函数Init i a 1 ();g 1 u tMain Loop();决循环retur n 0;完毕窗口初始化/完毕窗口 G LU T事件解运营结果:矩形 目 回 区 3.3 多边形面的绘制:#in c 1 u d e v oid I n i ti a 1 (vo i d)glCle arColor(l.0 1.0f,1.0f);设立窗口背景颜色为白色glMa t r ixM o de(G L _ P ROJ
10、E CTION);/指定设立投影参数g 1 uOrtho2D(0.0,2 0 0.0,0.0,150.0);设立投影参数void D i s pla y(v o id)(glC 1 e ar(GL_COLOR_BUFFER_BIT);用当前背景颜色填充窗口/设立当前的绘图颜色为红色/绘制一个矩形g 1 Color3f(l.0 f,0.Of,O.Of);/g 1 Rec t f(50.Of,100.0f,150.0 f,50.0 f);glBe g in (GL_TRIANGLES);/等边三角形gl V e rt e x2f(0.0,0.0);g 1 V e rte x 2f(l 5,25.9
11、 5);glV e rtex 2 f(30,0);glE n d();g 1 Flush();OpenGL程序)i n t main(i n t argc,c har*argv)/清 空 Op e n G L 命令缓冲区,执行g 1 ut I n i t(&a r g c,a r g v);g 1 utlnit D i sp 1 ayMode(GLUT_S INGLE|G LU T RGB);式g lutInitWindowSize(400,3 0 0);gl u tl n i t W i n dowPo s it i o n(100,120);g 1 u tC r eat e Wind o
12、w(矩形);glutDis p 1 a yFunc(D i spl a y);调函数I nit i al();g lutMainLoop();初始化窗口的显示模/设立窗口的尺寸设立窗口位置创建一个名为矩形的窗口/设立当前窗口的显示回/完毕窗口初始化/完毕窗口 GLUT事件解决循环r e turn 0;运营结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Brcsenh a m 算法。2.实验内容(-)数值微分法数值微分法直接从直线的微分方程生成直线。给定直线的两端点:PO(XO,Y
13、 0)和 P1 (X1,Y1),得到直线的微分方程 dy/dx=Z y/Z x=(Yl-YO)/(Xl-XO)=k数值微分算法的原理是,由于直线的一阶导数是连续的,并 且 和 是 成 比 例 的,因此通过在当前位置(x i,Y i)分别加上两个小增量 *和 e y (为无穷小的正数)来求下一点(X(i+1),Y (i+D)的 x,y坐标。(-)中点画线算法给定直线的两端点:PO(XO,Y O)和 Pl(XI,Y 1 ),可得到直线方程F(x,y)=y-kx-b=(k=Z y A x=(Y 1 -Y 0 )/(X1-XO)绘图过程如下:错误!未定义书签。.输入直线的两端点PO(XO,Y O)和
14、Pl(X 1 ,Y l)o错误!.计算初始值*,A y,d=A x2 A y,x=XO,y=Y 0 .错误!未定义书签。.绘制点(x,y)。判断d的符号,若 d 0,则(x,y)更新为(x+1,y+1 ),同样将e更新为e-2 Z x;否 则(x,y)更新为(x+1 ,y)错误!.当直线没有画完时,反复环节错误!未定义书签。和错误!;否则结束。3.实验代码及结果3.1 数值微分算法编程绘制直线代码:#i n clu d e#i n c 1 u d e void I n i t ial(void)glClearColor(1.0f,1.0f,1.0f,l.O f);/设立窗口背景颜色为白色glM
15、atri x Mod e(GL_ P ROJE C TION);/指定设立投影参数gluOrtho2D(0.0,2 0 0.0,0.0,1 5 0.0);设立投影参数)void Di s p lay(void)(glC 1 e ar(GL_COLO R BUFFE R BIT);/用当前背景颜色填充窗口glColor3f(1.0f,0.0 f,0.0f);/设立当前的绘图颜色为红色g 1 B egi n(GL_L IN ES);in t x 0=1 0;i n t y0=2 0;in t xl=30;in t yl=40;int co 1 o r=10;i n t d x,d y,epsl,k
16、;f loat x,y,xlnc r e,y I n ere;d x=x l-x O;dy=y 1-yO;x=x 0;y=y 0;/if(ab s(dx)abs(dy)。e psl=abs(dx);e 1 se epsl=a bs(dy);xl n cre=(float)dx/(float)eps 1 ;y I ncre=(f 1 o a t)d y/(fl o a t)e psi;fb r(k=0;k=e p s 1 ;k+)g 1 V er t e x 2 i(i nt(x+0.5),(int)(y+0.5);x+=xlncre;oy+=y I n c r e;)g 1 End();glF
17、l u s h();/清 空 OpenGL命令缓冲区,执行OpenGL程序)i n t ma i n(i n t argc,char*a rgv)g 1 u tlnit(&argc,a r gv);g lutlni t Disp 1 ayMode(GLUT_SINGLE I GLUT RGB);/初始化窗口的显示模式glut I nitW i n dowS i z e(400,3 0 0);g 1 utl n itWindo w P o s it i on(1 00,120);gl u t CreateWi n dow(矩形);gl u tDisplay F u n c(Disp 1 a y)
18、;数I n i tial();glutMa i nL o op();循环r e turn 0;设立窗口的尺寸/设立窗口位置创建一个名为矩形的窗口/设立当前窗口的显示回调函完毕窗口初始化完毕窗口 GLUT事件解决实验结果:2.2中点画线算法编程绘制直线代码:#in c 1 ud e#in c 1 ud e windows.hv o i d Ini t ial(v o id)glC 1 earColo r(1.0 f,1.0 f,1.Of,1.0 f);设立窗口背景颜色为白色glMatr i xM ode(G L _P ROJECTION);/指定设立投影参数gluOrtho2D(0.0,200.
19、0,0.0,1 5 0.0);/设立投影参数void Display(void)(glC 1 ear(GL COLO R_BU FFER_BIT);/用当前背景颜色填充窗口g 1 Colo r3 f(1.0 f,0.Of,O.Of);/设立当前的绘图颜色为红色glBegin(GL_PO I NTS);intxO=5O;i n t yO=20;i n t xl=1 00;i nty 1 =1 2 0;i n t color=10;int d x,dy,d,UpIncre,D o wnlncre,x,y;i f(xOxl)(x=x l;xl=x 0;x 0=x;y=y l;yl=y 0;y0=y;
20、)x=x 0;y=y 0;dx=xl-x0;d y=yl-y 0:d=d x-2*dy;U piner e=2*d x-2*dy;D o wnlncre=2*dy;wh i 1 e(x=x 1)gl V ertex2i(x,y);x+;。if(d0)(y+;d+=Up In c r e;els e d+=DownIncre;glE n d();glFlu s h();/清 空 O p e n G L 命令缓冲区,执 行 OpcnGL 程序int ma i n(i nt ar g c,c h a r*argv)glutlnit(&ar g c,argv);g lutlnitDis p 1 a y
21、Mod e(GLUT_SINGLE|GLUT_RGB);式gl u tlnitWin d ow S ize(400,300);g 1 utl n i t W i ndo w Posi t io n(100,120);glut C r e a t eW i ndow(矩形);g l u t DisplayFun c(D isplay);数I n itia 1 ();gl u t MainLoop();解决循环re t um 0;/初始化窗口的显示模/设立窗口的尺寸设立窗口位置/创建一个名为矩形的窗口设立当前窗口的显示回调函完毕窗口初始化/完毕窗口 GLUT事件实验结果:矩形目回冈2.3 Bres
22、 e nh a m 算法编程绘制直线代码:#include#i n c I u de v o i d I n itial(v o id)glClea r Color(1.Of,1.Of,1.Of,1.O f);设立窗口背景颜色为白色ogIM a tr i xMo de(GL_PROJ ECT I ON);。/指定设立投影参数og 1 uO rtho2D (0.0,200.0,0.0,150.0);设立投影参数)v o id Dis p 1 ay(voi d)gl C lear(GL_CO L OR_BU F FER_BIT);。/用当前背景色填充窗口og 1 C olor 3 f(1.0 f,
23、0.0 f,0.O f);。/设立当前的绘图颜色为红色/Bresenh a m 算法glBegin(GL_POINTS);o i n t xO=1 0;i n t yO=2 0;i n t xl=9 0;in t yl=9 0;in t c o lor=l 0;int x,y,d x,dy,e;fid x=x 1-xO;d y=y 1 y 0;e=d x;x=x 0;y=y 0;owh i 1 e(x 0)。y f。e=e-2*dx;glEnd();g 1 Flush();。清空O penG L 命令缓冲区,执行O p enGL程序in t main(i n t argc,ch a r*a r
24、 gv)g lutl n it(&arg c,a r gv);oglu tin i tDi s p 1 ayMode(G LUT_SI N GLE|G L UT_ R G B);初始化窗 口的现实模式=gl u t InitW i n d owS i ze(400,3 0 0);。设立窗口的尺寸g 1 ut I ni t WindowP o s i tion(100,2 0 0);“/设立窗口 的位置g 1 utC r eateWindow(点);创建一个名为矩形的窗口gl u tDi s pla y Func(Dis p 1 ay);。/设立当前窗口的显示函数Init i a l();。完毕
25、窗口的初始化g l u t MainLo o p();。/启动主G LUT事件解决循环re t u r n 0;实验结果:点13回 区)实验三圆绘制实验i .实验目的2.实验内容(-)八分法画圆圆心位于原点的圆有4 条对称轴x=0,y=0,y=x,y=-Xo若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的此外7 个点(y,x),(x,y),(-x,-y),(-y,-x),(y,x),(x,-y)。(二)中 点 B re se nh am 画圆算法算法环节如下:错误!未定义书签。输入圆的半径R错误!计算初始值d=l-R,x=0,y =R错误!绘 制 点(x,y)及其在八分圆中的此外
26、7 个对称点。错误!未定义书签。判 断 d的符号。若 d 0,则先将d更新为d+2 x+3,再 将(x,y)更新为(x+l,y);否则先将d更新为d +2 (x-y)+5,再 将(x,y)更新为(x+1,y T)。当x y时,反复环节错误!和错误!未定义书签。;否则结束。(三)椭 圆 的中点B r e s e n h a m 算法算法环节如下:错误!输入椭圆的长半轴a 和短半轴b。错误!未定义书签。计算初始值d=bA2+aA 2 (-b+0.2 5),x =0,y =b。错误!未定义书签。绘制点(x,y)及其在四分象限上的此外三个对称点。o a c (0,4)判断d的符号。若 d=0,则先将d
27、更新为d+b入 2(2 x+3),再 将(x ,y)更新为(x+1 ,y);否则先将d更新为d +bA 2 (2 x+3)+a八 2 (-2 y +2),再将(x,y)更新为(x+1 ,y-1 )错误!当 b-2 (x+l)=0 时,反复环节错误!和错误!;否则结束。3.实验代码及结果3.1 八分法画圆程序代码:#i nclude#i n c 1 udevo i d I n itial(void)g l C le a r Color(1.0 f,1.Of,l.Of,1.O f);/设立窗口背景颜色为白色glM atrix M ode(G L PROJ ECTION);指定设立投影参数gluO
28、rtho2D(0.0,200.0,0.0,1 5 0.0);/设立投影参数)void C i rcl e Poin t(int x,i nt y,i n t color)gl Ve r te x 2 i(x+5 0,y+50);glVer t ex2i(y+5 0,x+5 0);glVert e x2i(-y+50,x+50);gl V ertex2i(-x+5 0,y+5 0);glVertex2i(-x+50,y+50);glV e rt e x2i(-y+5 0,-x+50);glVertex 2 i(y+50,x+50);g 1 Vertex2 i(x+5 0,-y+5 0);)voi
29、d Display(void)g 1 Clear(GL_CO L OR_BU F FER_BIT);/用当前背景颜色填充窗 口glColo r 3f(1.0f,0.0f,0.Of);/设立当前的绘图颜色为红色g IPointSize(1 0);g 1 Beg i n(GL_PO I NTS);CirclePoint(1 0,20,20);g 1 End();g 1 Flush();程序)i n t m a i n(int a rgc,char*a rgv)(g lu t I n i t(&a r gc,ar g v);glut I n式glu t I n itWi n dow S i z e(
30、4 0 0,300);glu t InitWi n d owPos i t i on(10 0,12 0);g l u t C r e a teW i ndow(矩形);g lutD i s p 1 ayFunc(D i splay);调函数 清空OpenGL命令缓冲区,执行O penGLitDi s playMode(GLU T _ S IN G LE|GLU T_RGB);/初始化窗口的显示模设立窗口的尺寸/设立窗口位置创建一个名为矩形的窗口/设立当前窗口的显示回In i tial();完毕窗口初始化glutM ainLoop();完毕窗口 GLU T 事件解决循环r e t ur n 0
31、;实验结果:矩形3.2I中点Bre s e nham 算法绘制圆代码#include#i n cludevoid Initial(vo i d)glClearC olor(1.0f,l.O f,1.0 f,LOf);设立窗口背景颜色为白色g IMatrixMode(GL_PROJE CTION);/指定设立投影参数g 1 uOr t ho2D(0.0,200.0,0.0,150.0);/设立投影参数)v oid Cir c 1 eP o i nt(i n t x,i n t y,int color)gl Vertex2 i(x+50,y+5 0);glVe r tex2i(y+5 0,x+50
32、);glVer t e x2i(y+5 0,x+50);gl V ert e x2i(-x+50,y+5 0);glV e r t e x 2i(-x+50,-y+5 0);g IVe r te x 2 i(y+50,-x+50);glVertex2 i(y+50,-x+50);glVe r t e x2 i(x+5 0,-y+5 0);void M i d Bre s e n h amC i rcl e(i nt r,int co 1 or)|int x,y,d;x=0;y=r;d=l-r;wh i le(x=y)(Cir c 1 e P oin t(x,y,c olor);。i f(d 0
33、)d+=2*x+3;oels e(d+=2*(x y)+5;。y-;X+;)void Display(voi d)g 1 C 1 ea r(GL_COLOR_BUFFER_ B IT);/用当前背景颜色填充窗 口g 1 C o lor3f(l.0f,0.0f,0.0 f);设立当前的绘图颜色为红色glPo i n t S i z e(3);glBegin(GL POINTS);Mi d Bresen h amCircle(20,1 0);gl E nd();g IFlu s h();p en G L 程序清空OpenGL命令缓冲区,执行。i n t main(i n t a rgc,cha r
34、*arg v 口)g l u t I n i t(&a rgc,argv);g 1 u t InitDisp 1 ayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的显示模式glu t I nit Wind o wSi z e(4 0 0,300);g 1 utlnitWi n d o w P o sitio n (100,120);g 1 utCreateWindow(矩形)glutDisplayFu n c(Disp la y);数I n itial();glutMain Lo o p();环r e tur n 0;)设立窗口的尺寸设立窗口位置/创建一个名为矩形的窗口设
35、立当前窗口的显示回调函/完毕窗口初始化/完毕窗口 G LUT事件解决循实验结果:矩形目|回冈3.3中点Bres e nham 算法绘制椭圆代码:#inc 1 ud e#i n cludev o id Ini t ial(v o id)(glCl e arC o 1 o r(1.Of,1 .Of,1.Of,1.0 f);设立窗口背景颜色为白色glMa t rixMod e(GL_P R 0 J E C T ION);指定设立投影参数g 1 uOrtho2D(0.0,200.0,0.0,1 5 0.0);/设立投影参数v o id Mid B re s enh a mElli p se(int a
36、,i n t b,i n t color)int x,y;f loa t d 1 ,d 2;x=0;y=b;dl=b*b+a*a*(-b+0.25);glV e rtex2 i(x+5 0,y+50);glV e rte x 2i(-x+50,-y+50);glV e r tex2 i(x+5 0,y+50);g IVerte x 2i(x+5 0 y+5 0);w h ile(b*b*(x+l)a*a*(y0.5)(if(dl0)if(d2V=0)。d 2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;e lsed2+=a*a*(2*y+3);y-;oglV e r t e
37、x2 i(x+5 0,y+50);gl Ve r te x 2i(-x+5 0,-y+5 0);glVe r tex2i(-x+5 0,y+5 0);glVert e x2i(x+50,-y+5 0);)void D i splay(v o i d)g 1 Clear(GL_COLOR_BUFFER_B I T);/用当前背景颜色填充窗口glColor3f(1.0 f,0.0 f,O.Of);设立当前的绘图颜色为红色gl P oi n tSiz e(3);g 1 Be gin(GL_PO I NTS);Mid B re s en h amEllipse(40,25,10);glEn d();g
38、lu t D i s p la y F unc(Dis play);g 1 Flush();OpenGL程序)int m a i n(int a r gc,char*a r gv )g lutln i t(&argc,a r g v);glutlni t Dis p layM o de(G L UT SIN G LE 1glu t I n itWindo w Size(4 0 0,300);glu t I n itW in d o wPosi t i o n(l 0 0,120);glut C reat e Windo w(n 矩 形)/清空OpenG L 命令缓冲区,执行GLUT_RGB);
39、初始化窗口的显示模式设立窗口的尺寸/设立窗口位置 创建一个名为矩形的窗口/设立当前窗口的显示回调函数Ini tial();完毕窗口初始化g 1 utM ainLoop();完毕窗口 G L U T 事件解决循环ret u r n 0;)实验结果:矩形 B0B实验四填充算法实验i .实验目的掌握用扫描线种子填充法,实现扫描线种子填充算法填充任一多边形区域的程序2.实验内容算法环节如下:(1)种子像素入栈。(2)执行如下三步操作:错误!未定义书签。校顶像素出栈。填充出栈像素所在扫描线的连续像素段,从出栈的像素开始沿扫描线向左和向右填充,直到碰到边界像素为止,即每出栈一个像素,就对包含该像素的整个扫
40、描线区间进行填充,并且记录下此时扫描线区间的x 坐标范围x 1 ,x 2 o错误!未定义书签。分别检查上、下两条扫描线上位于x l,x 2坐标区间内的未被填充的连续水平像素段,将每个连续像素段的最左像素取作种子像素压人栈堆。(3)检查栈是否为空,若栈非空反复执行环节(2),若栈为非空则结束。3.实验代码及结果代码:#inc 1 u d e gl/gl u t.h#include math.h#includ e stdlib.h#include co n io.h#i n elude t y pede f float C o 1 or3;s t r uct Point(G L int x;G L
41、 int y;;s t d:s t a c k st k;v o id in i t(v oid)glCl e arColor(1.0,1.0,1.0,1.0);/S e t displaywindow co 1 or whi t e.g 1 M a trixM o d e (GL_PROJECTION);g lu O r t ho2D(0.0,400.0,0.0,4 0 0.0);v o id setPixel(GLin t x,G L i n t y);种子像素坐标v o id se t P i xel(P o i n t curjpoi n t)glBeg i n(GL_POINTS);
42、g 1V ertex2i(cur_po i nt.x,c ur_ p o i n t.y);glEnd();glFl u sh();vo i d getPixel(Po i n t cur_ p o i n t,Col o r c)glR e adP i x e 1 s(c ur_poi n t.x,cur_ poi n t.y,l,1,G L _RGB,G L FLO A T,c);bo o 1 r g bColorEq u a 1 (Col o r cl,C o 1 or c2)(c l 颜色数据与c2颜色数据,当正负误差不超过0.0 001时,返回值为1,否则为0oif(a bs(cl0
43、-c20)0.0 0 1)|(abs(c 1 1-c2l)0,0 0 1)|(ab s(c 1 2-c22)0.0 0 1)re t urn 0;els e r e turn 1;)i nt FillLine R e gion(Poi n t c ur_ point,C o 1 or fillC olo r,C ol o r borderCo 1 or,i ntdire c tion)in t c o unt=0;Co 1 o r int e r i orColor;glC o 1 o r 1 Color 0,f i UCol o r 1,fil 1 Color 2);g e tPix e l
44、(cur_p o in t JnteriorC o Io r);while(!(rg b Colo r Equ a 1 (inter i or C olo r,b ord e rColo r)&!(rgb C ol o r E q ua 1(i n t eri o r Col o r,fil 1 C o lor)/这个判断保证读取的像素的颜色数据与边界颜色尚有填充颜色数据在数值上相差较大。即当正读取像素不是多边形边界,且也没有被填充,则执行以下花括号内的操作(setP i x e l(cur_poin t);/set c olot o f pixel to fillCol o r.为坐标为(x
45、,y)的像素上色iftdi r ectio n=0)cur_ p o int.x+;e Ises c ur po i nt.xg e tPixe 1 (c u r_p o i nt,i nteriorColo r);count+;retu r n co u nt;i n t I sPixelValid(P oint cur_point,Color fillColor,Co 1 or b o rde r C o lo r)(Col o r i nterior C o 1 or;g etPixel(cu r _point,inter i o rCo 1 o r);oif(!(rg b C o lo
46、 rE q u al(i n ter i o r Col o r,b o rd e r C o lo r)&!(rgbCo 1 orEqu a1 (interi o rCol o r,f i 11C o lor)。“e t u r n 1;elseretu r n 0;voi d S e arch Lin e NewSe e d(int x Left,i n t x Ri g ht,int y,C olor f ill C olor,ColorborderColor)/在种子像素所在扫描线上一条或下一条是扫描线寻找新种子像素(int x t=xL e f t;int s eed_ left=1
47、;P o in t se e d_point;P oin t t e mp_ p o in t;wh i le(xt=xR i g h t)s e e d_left=-1 ;o t e mp_point.x=x t;。temp_point.y=y;wh i 1 e(x t=xRight)/find th e fir s t v a 1 i d point(。if(I sP i x e 1 Vali d(t e mp_point,f i l l Color,bo r de r Color)0 seed_le f t=tem p_p o i nt.x;。br e a k;e Is e X temp
48、_po i nt.x=xt;0 owh i 1 e(xt=x Right)/fi n d the next in v alid poin t0 i f(IsP i x e IValid(t emp_p o int,fillCol o r,bor d erCo 1 or)O O d 。X t+;g temp_point.x=x t;o。e 1 s e。bre a k;000 1)i f(se e d _ left!=-l)0 s eed_ point.x=sced_left;seed_point.y=y;s t k.p u s h(seed_p o i n t);0 voi d sea n Li
49、ne(P o in t cur_ p o i nt,C o lor fil 1 C o lor,Colo r borde r Co 1 o r)i n t c oun t=0;int r i g ht,left;P o in t temp_p o int;while(!stk.e mpty()|o P o in t seed_point=s t k top();。s t k.pop();种子像素出栈。c o u nt=Fi 1 ILin e R e g ion(s e cd_ point,f i 11C olor,b orderC ol o r,0);填充种子像素所在的扫描线右边r i g h
50、t=seed_ p o int.x+coun t-1;。tem p _p o int.x=seed_ poi n t,x-1;temp_ p oin t.y=s e ed_point.y;。c oun t=F i 1 ILineR eg ion(tem p _ point,fill C olor,borderColo r,1);/填充种子像素所在扫描线左边。left=s ee d _point.xcount;。SearchLineNewS e e d(left,right,se e d point.y l,fillC o 1 or,borderColor);/在种 子 像素所在扫描线上方一条扫