簡單種子填充算法

   在這裏就不多囉嗦解釋了,直接上代碼(自我感覺寫的簡潔明瞭!!!)

#include <GL/glut.h>
#include <fstream>

typedef float Color[3];

void Reshape(int w, int h)                   //窗口被移動或修改大小後的寬度和高度
{
	glViewport(0, 0, (GLsizei) w,  (GLsizei) h);  //調整像素矩形,用於繪製整個窗口
	glMatrixMode(GL_PROJECTION);    //接下來三個函數調整繪圖座標系,使左下角位置爲(0, 0),右上角爲(w, h)
	glLoadIdentity();
	gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
}

//獲取像素點的顏色
void getpixel(GLint x, GLint y, Color color) {
    glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, color);
}

//畫點函數
void setpixel(GLint x, GLint y) {
    glBegin(GL_POINTS);
    glVertex2f(x, y);
    glEnd();
}

//比較顏色是否相等
int compareColor(Color color1, Color color2) {

    if(color1[0] != color2[0] || color1[1] != color2[1] || color1[2] != color2[2]){
		return 0;
	}
    else{
		return 1;
	}
}

void boundaryFill4(int x, int y, Color fillColor, Color boarderColor) {
    Color interiorColor;
    getpixel(x, y, interiorColor);
    if (compareColor(interiorColor, fillColor) == 0 && compareColor(interiorColor, boarderColor) == 0) {
        setpixel(x, y);
        boundaryFill4(x + 1, y, fillColor, boarderColor);
        boundaryFill4(x - 1, y, fillColor, boarderColor);
        boundaryFill4(x, y + 1, fillColor, boarderColor);
        boundaryFill4(x, y - 1, fillColor, boarderColor);
    }
}

void polygon() {
    glBegin(GL_LINE_LOOP);
    glLineWidth(5);
    //此處修改座標,繪製多邊形
    glVertex2f(100, 100);
    glVertex2f(150, 200);
    //glVertex2f(200, 200);
    glVertex2f(200, 100);
    glEnd();
}

void display(void) {
    Color fillColor = {0.0, 1.0, 1.0};//填充顏色 藍色
    Color boarderColor = {0.0, 1.0, 0.0};//邊界顏色 綠色

	glClearColor(1, 1, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);  //將窗口的背景設置爲當前清空顏色
    glViewport(0, 0, 500, 500);
    glColor3fv(boarderColor);
    polygon();
    glColor3fv(fillColor);
    boundaryFill4(110, 110, fillColor, boarderColor);//設置起點座標及顏色
    glFlush();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);    //對GLUT進行初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);   //設置顯示方式,其中GLUT_RGB表示使用RGB顏色
    glutInitWindowPosition(100, 100);   //設置窗口在屏幕中的位置
    glutInitWindowSize(500, 500);   //設置窗口的大小
    glutCreateWindow("種子填充算法");   //參數將被作爲窗口的標題

	Reshape(500,500);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;

}

運行結果如下:

 

友情提示:我是強制要求用VC++,運行過程中要有耐心哦!!可能要等幾秒纔會出結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章