1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| #include <windows.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stack>
#include <iostream>
#include "Point.h"
#include "fonctions.h"
using namespace std;
int nWindowID;
const int g_nWidth = 1280;
const int g_nHeight = 1024;
void affichage(void);
void attente(void);
void clavier(unsigned char touche, int x, int y);
int couleur_bg[3] = {0 , 0 , 0};
int main(int argc,char *argv[])
{
// initialisation de GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_SINGLE);
glutInitWindowSize(g_nWidth, g_nHeight);
int g_nWindowID = glutCreateWindow("Remplissage par germes");
glutDisplayFunc(affichage);
glutIdleFunc(attente);
glClearColor(couleur_bg[0], couleur_bg[1], couleur_bg[2], 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutMainLoop();
return 0;
}
void affichage(void)
{
float midLarg = ((float)g_nWidth) / 2.0f;
float midHaut = ((float)g_nHeight) / 2.0f;
glOrtho(-midLarg, midLarg, -midHaut, midHaut, -1 , 1);
/**
Nombre de sommets du polygone
*/
int nb_sommet = 5;
unsigned char * pixel = new unsigned char[18];
int couleur_contour[3] = {1 , 1 , 1};
int couleur_contenu[3] = {1 , 0 , 0};
stack<Point> pile;
/**
Liste des sommets du polygone
*/
Point * POLY[255] = {
new Point(-50 , 80)
, new Point(0 , 20)
, new Point(60 , 40)
, new Point(40 , -50)
, new Point(-50 , -50)
};
Point first = Point(0 , 0);
Point cur;
glColor3f(1.0 , 1.0 , 1.0);
glBegin(GL_LINE_LOOP);
/**
Tracé du contour du polygone en blanc (1,1,1)
*/
for(int i = 0 ; i < nb_sommet ; i++)
{
glVertex2f(POLY[i]->x , POLY[i]->y);
}
glEnd();
glReadBuffer(GL_FRONT);
glReadPixels(first.x , first.y , 1 , 1 , GL_RGBA , GL_UNSIGNED_BYTE , pixel);
/**
FIN - Tracé du contour du polygone en blanc (1,1,1)
*/
glColor3f(couleur_contenu[0] , couleur_contenu[1] , couleur_contenu[2]);
if(!eq(couleur_contour , pixel) && !eq(couleur_contenu , pixel))
{
pile.push(first);
while(pile.size() != 0 && pile.size() < 500000)
{
cur.x = pile.top().x;
cur.y = pile.top().y;
pile.pop();
glBegin(GL_POINTS);
glVertex2f(cur.x , cur.y);
glEnd();
glReadBuffer(GL_FRONT);
glReadPixels(cur.x , cur.y +1 , 1 , 1 , GL_RGBA , GL_UNSIGNED_BYTE , pixel);
afficher(pixel);
if(!eq(couleur_contour , pixel) && !eq(couleur_contenu , pixel))
pile.push(Point(cur.x , cur.y +1));
glReadBuffer(GL_FRONT);
glReadPixels(cur.x , cur.y -1 , 1 , 1 , GL_RGBA , GL_UNSIGNED_BYTE , pixel);
afficher(pixel);
if(!eq(couleur_contour , pixel) && !eq(couleur_contenu , pixel))
pile.push(Point(cur.x , cur.y -1));
glReadBuffer(GL_FRONT);
glReadPixels(cur.x +1 , cur.y , 1 , 1 , GL_RGBA , GL_UNSIGNED_BYTE , pixel);
afficher(pixel);
if(!eq(couleur_contour , pixel) && !eq(couleur_contenu , pixel))
pile.push(Point(cur.x +1 , cur.y));
glReadBuffer(GL_FRONT);
glReadPixels(cur.x -1 , cur.y , 1 , 1 , GL_RGBA , GL_UNSIGNED_BYTE , pixel);
afficher(pixel);
if(!eq(couleur_contour , pixel) && !eq(couleur_contenu , pixel))
pile.push(Point(cur.x -1 , cur.y));
}
}
glFlush();
glutSwapBuffers();
}
/* Fréquence de rafraichissement de l'image */
void attente(void)
{
static int nWaitUntil = glutGet(GLUT_ELAPSED_TIME);
int nTimer = glutGet(GLUT_ELAPSED_TIME);
if(nTimer >= nWaitUntil)
{
glutPostRedisplay();
nWaitUntil = nTimer + 100000;
}
} |
Partager