OpenGL实现不规则区域填充算法
本文实例为大家分享了OpenGL实现不规则区域填充算法,供大家参考,具体内容如下
一、简单递归
利用Dfs实现简单递归填充。
核心代码:
//简单深度搜索填充(四连通) voidDfsFill(intx,inty) { if(x<0||y<0||x>23||y>23) { return; } if(a[x][y]==0) { a[x][y]=2; DfsFill(x-1,y); DfsFill(x+1,y); DfsFill(x,y-1); DfsFill(x,y+1); } }
二、扫描线种子填充算法(四连通)
1.种子点(x,y)入栈。
2.栈顶元素(x,y)出栈作为种子点。
3.从种子点(x,y)开始沿着扫描线向左右两个方向逐个像素进行填充,直到到达边界像素为止。
4.将上述填充区段的左右端点的横坐标分别记为xleft和xright.
5.在与当前扫描线相邻的上下两条扫描线的[xleft,xright]范围内进行检查,看看是否全部为边界像素或已填充像素,若存在着非边界且未填充的像素,那么将该区段的最右端像素作为种子点入栈。
voidScanFill(intx,inty) { if(a[x][y]!=0) { return; } Posfirst(x,y); s.push(first); while(!s.empty()) { intrightX=0; intleftX=0; Poscur=s.top(); s.pop(); a[cur.x][cur.y]=2; //遍历当前行 for(inti=1;i<24;i++) { if(cur.x+i<24) { if(a[cur.x+i][cur.y]==0) a[cur.x+i][cur.y]=2; else { rightX=cur.x+i-1; break; } } if(i==23) { rightX=23; } } for(inti=1;i<24;i++) { if(cur.x-i>-1) { if(a[cur.x-i][cur.y]==0) a[cur.x-i][cur.y]=2; else { leftX=cur.x-i+1; break; } } if(i==0) { leftX=0; } } cout<=0) { downRightX=i; } } if(downRightX!=-1) { PostemPos(downRightX,cur.y-1); s.push(temPos); } } }
完整代码:
#include#include #include"gl/glut.h" #include"iostream" usingnamespacestd; #definePI3.14 structPos { intx; inty; Pos(intmx,intmy):x(mx),y(my){}; Pos():x(0),y(0){}; }; stack s; inta[24][24]={0}; voidinit(void) { glClearColor(1.0,1.0,1.0,1.0); glMatrixMode(GL_PROJECTION);//设置投影矩阵 gluOrtho2D(0.0,600.0,0.0,600.0);//二维视景区域 glPointSize(12.0f); } //画棋子 voidDrawtri(intx,inty,intcolor) { doublen=200;//分段数 floatR=10;//半径 inti; if(color==1) { glColor3f(1.0,0.0,0.0); } elseif(color==2) { glColor3f(0.0,1.0,0.0); } glBegin(GL_POLYGON); glVertex2f(x,y); for(i=0;i<=n;i++) glVertex2f(R*cos(2*PI/n*i)+x,R*sin(2*PI/n*i)+y); glEnd(); glPopMatrix(); } //绘制格线 voidplayMap() { glColor3f(0.0,0.0,0.0); glBegin(GL_LINES); for(inti=0;i<600;i+=25) { glVertex2f(i,0); glVertex2f(i,600); } for(intj=0;j<600;j+=25) { glVertex2f(0,j); glVertex2f(600,j); } glEnd(); for(intk=0;k<24;k++) { for(intl=0;l<24;l++) { if(a[k][l]==1) { Drawtri(k*25+12,l*25+12,1); } elseif(a[k][l]==2) { Drawtri(k*25+12,l*25+12,2); } } } } //简单深度搜索填充(四连通) voidDfsFill(intx,inty) { if(x<0||y<0||x>23||y>23) { return; } if(a[x][y]==0) { a[x][y]=2; DfsFill(x-1,y); DfsFill(x+1,y); DfsFill(x,y-1); DfsFill(x,y+1); } } //扫描线种子填充算法(四连通) voidScanFill(intx,inty) { if(a[x][y]!=0) { return; } Posfirst(x,y); s.push(first); while(!s.empty()) { intrightX=0; intleftX=0; Poscur=s.top(); s.pop(); a[cur.x][cur.y]=2; //遍历当前行 for(inti=1;i<24;i++) { if(cur.x+i<24) { if(a[cur.x+i][cur.y]==0) a[cur.x+i][cur.y]=2; else { rightX=cur.x+i-1; break; } } if(i==23) { rightX=23; } } for(inti=1;i<24;i++) { if(cur.x-i>-1) { if(a[cur.x-i][cur.y]==0) a[cur.x-i][cur.y]=2; else { leftX=cur.x-i+1; break; } } if(i==0) { leftX=0; } } cout< =0) { downRightX=i; } } if(downRightX!=-1) { PostemPos(downRightX,cur.y-1); s.push(temPos); } } } voiddisplayFcn(void) { glClear(GL_COLOR_BUFFER_BIT); playMap(); glFlush(); } voidmouse(GLintbutton,GLintaction,GLintx,GLinty) { intcurX,curY; if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN) { curX=x/25; curY=(600-y)/25; a[curX][curY]=1; glutPostRedisplay();//重绘窗口 } if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN) { curX=x/25; curY=(600-y)/25; ScanFill(curX,curY); glutPostRedisplay();//重绘窗口 } } voidmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(300,100); glutInitWindowSize(600,600); glutCreateWindow("mouse"); init(); glutDisplayFunc(displayFcn); glutMouseFunc(mouse); glutMainLoop(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。