8连通、4连通的洪泛填充以及边界填…

来源:互联网 发布:京瓷2550网络扫描 编辑:程序博客网 时间:2024/05/18 10:24

 运用八连通边界填充算法进行多边形的填充

1)首先通过颜色混合的方式形成一个图形包中函数的对多边形的填充,如下图所示:

8连通、4连通的洪泛填充以及边界填充 <wbr>计算机图形学 <wbr> <wbr>Opengl

【注】主要代码如下://实现多边形的简单填充
#include<windows.h>

#ifdef__APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include<stdlib.h>

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);  // Set display-window colorto white.
    glMatrixMode(GL_PROJECTION);      // Set projection parameters.
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
void lineSegment (void)
{
    glClear(GL_COLOR_BUFFER_BIT);  // Clear displaywindow.
    glColor3f(0.0, 0.0,1.0);     // Set line segment color to red.
   //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    glBegin(GL_POLYGON);
   glShadeModel(GL_TRIANGLES);
       glVertex2i(20,40);
       glVertex2i(25,60);
       glVertex2i(30,70);
       glVertex2i(40,80);
       glColor3f(1.0,0.0,0.0);
       glVertex2i(30,90);
       glVertex2i(20,75);
    glEnd ();
    glFlush ();    // Process all OpenGL routines as quickly as possible.
}
int main (int argc, char** argv)
{
    glutInit(&argc,argv);                        // Initialize GLUT.
   glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB);   // Set displaymode.
   glutInitWindowPosition (50,100);   // Set top-leftdisplay-window position.
   glutInitWindowSize (400,300);     // Set display-window width and height.
   glutCreateWindow ("An Example OpenGL Program"); // Create displaywindow.
    init ();                           // Execute initialization procedure.
   glutDisplayFunc(lineSegment);      // Send graphics to display window.
    glutMainLoop();                   // Display everything and wait.
    return0;
}

 

2通过8连通边界填充算法进行填充多边形,多边形边界使用4倍线宽。

8连通、4连通的洪泛填充以及边界填充 <wbr>计算机图形学 <wbr> <wbr>Opengl

【注】主要代码如下:

void BoundaryFill8(int x, int y,Color fillColor,Color borderColor)

{

//在此添加4连通或8连通代码

    Color interColor;

 

    //glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_INT,color);

    getPixel(x,y,interColor);

    if (!rgbColorEqual(interColor,borderColor) && !rgbColorEqual(interColor,fillColor)){

        setPixel(x,y);

        BoundaryFill8(x+1,y,fillColor,borderColor);

        BoundaryFill8(x-1,y,fillColor,borderColor);

        BoundaryFill8(x,y+1,fillColor,borderColor);

        BoundaryFill8(x,y-1,fillColor,borderColor);

        BoundaryFill8(x+1,y+1,fillColor,borderColor);

        BoundaryFill8(x-1,y-1,fillColor,borderColor);

        BoundaryFill8(x-1,y+1,fillColor,borderColor);

        BoundaryFill8(x-1,y-1,fillColor,borderColor);

    }

}

3通过4连通洪泛填充算法进行填充多边形,多边形边界使用4倍线宽。

8连通、4连通的洪泛填充以及边界填充 <wbr>计算机图形学 <wbr> <wbr>Opengl

【注】主要代码如下:


//实现多边形的简单填充
#include<windows.h>

#ifdef__APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include<stdlib.h>
#include <math.h>
typedef  float Color[3];
bool rgbColorEqual(Color c1,Color c2)
{
 if(fabs(c1[1]-c2[1])<0.001&&fabs(c1[2]-c2[2])<0.001&&fabs(c1[0]-c2[0])<0.001)
  return true;
 else
  return false;
}
void setPixel(GLint x,  GLint y)
{
 glBegin(GL_POINTS);
 glVertex2i(x, y);
 glEnd();
}
void getPixel(GLint x, GLint y, Color c)
{
 glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,c);
}

voidBoundaryFill4(int x, int y,Color fillColor,Color borderColor)
{
 //在此添加4连通或8连通代码
    ColorinterColor;

   //glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_INT,color);
   getPixel(x,y,interColor);
    if(!rgbColorEqual(interColor,borderColor)&&!rgbColorEqual(interColor,fillColor)){
       setPixel(x,y);
       BoundaryFill4(x+1,y,fillColor,borderColor);
       BoundaryFill4(x-1,y,fillColor,borderColor);
       BoundaryFill4(x,y+1,fillColor,borderColor);
       BoundaryFill4(x,y-1,fillColor,borderColor);
    }
}

voidFloudFill4(int x, int y,Color fillColor,Color initColor)
{
 //在此添加4连通或8连通代码
    ColorinterColor;

   //glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_INT,color);
   getPixel(x,y,interColor);
    if(rgbColorEqual(interColor,initColor)&&!rgbColorEqual(interColor,fillColor)){
       setPixel(x,y);
       FloudFill4(x+1,y,fillColor,initColor);
       FloudFill4(x-1,y,fillColor,initColor);
       FloudFill4(x,y+1,fillColor,initColor);
       FloudFill4(x,y-1,fillColor,initColor);
    }
}

voidBoundaryFill8(int x, int y,Color fillColor,Color borderColor)
{
 //在此添加4连通或8连通代码
    ColorinterColor;

   //glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_INT,color);
   getPixel(x,y,interColor);
    if(!rgbColorEqual(interColor,borderColor)&&!rgbColorEqual(interColor,fillColor)){
       setPixel(x,y);
       BoundaryFill8(x+1,y,fillColor,borderColor);
       BoundaryFill8(x-1,y,fillColor,borderColor);
       BoundaryFill8(x,y+1,fillColor,borderColor);
       BoundaryFill8(x,y-1,fillColor,borderColor);
       BoundaryFill8(x+1,y+1,fillColor,borderColor);
       BoundaryFill8(x-1,y-1,fillColor,borderColor);
       BoundaryFill8(x-1,y+1,fillColor,borderColor);
       BoundaryFill8(x-1,y-1,fillColor,borderColor);
    }
}

voidinit(void)
{
 glClearColor(1.0,1.0,1.0,0.0);
 glMatrixMode (GL_PROJECTION);
 gluOrtho2D (0.0, 200.0, 0.0, 200.0);

}
void Draw(void)
{
 Color a={1.0,1.0,0.0},b={0.0,1.0,1.0};

 glClear(GL_COLOR_BUFFER_BIT);
   glLineWidth(4.0);
   glViewport(0,0,200,200);
   glColor3fv(b);
 glBegin(GL_LINE_LOOP);
    glVertex2i(90, 40);
    glVertex2i(120, 100);
    glVertex2i(90, 160);
  glVertex2i(60, 160);
  glVertex2i(60, 40);
 glEnd();
 glColor3fv(a);
 BoundaryFill4(70,60,a,b);

 glViewport(200,0,200,200);
   glColor3fv(b);
 glBegin(GL_POLYGON);
    glVertex2i(90, 40);
    glVertex2i(120, 100);
    glVertex2i(90, 160);
  glVertex2i(60, 160);
  glVertex2i(60, 40);
 glEnd();
 glColor3fv(a);
 FloudFill4(70,60,a,b);
   glFlush();
}
int main(int argc, char *argv[])
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGB |GLUT_SINGLE);
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(400, 200);
 glutCreateWindow("4连通边界和洪泛填充算法!");
 init();
 glutDisplayFunc(Draw);
 glutMainLoop();
 return 0;
}