glBegin(GL_LINES); //mudando cor da linha para branco glColor3f (1.0, 1.0, 1.0); //desenha linhas das regioes for(float i = -0.5;i <= 0.5; i = i + 1) { glVertex2f( -1, i);//coordenada inicial da linha glVertex2f( 1, i);//coordenada final da linha } //desenha linhas das regioes for(float i = -0.5;i <= 0.5; i = i + 1){ glVertex2f( i, -1);//coordenada inicial da linha glVertex2f( i, 1);//coordenada final da linha } glEnd();}//linha entre os vertices e' desenhada aquivoiddrawLineBetweenVertexes(){ glBegin(GL_LINE_STRIP); //Setando a cor da linha para amarelo glColor3f(1.0f, 1.0f, 0.0f); //se a quantidade de vertices for satisfeita if(currentVertex == N_VERTEX){//entao as linhas entre os vertices sao desenhadas for (int i = 0; i < N_VERTEX; i++) glVertex3fv(&vertexes[i][0]); //a linha e' desenhada com a funcao glVerte3fv } glEnd();}//rotina callback de display OpenGLvoidrenderScene(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Define valores p/ glClear glClearColor(0.0, 0.0, 0.0, 0.0); // Mudando a cor para vermelho // R G B glColor3f(1.0f, 0.0f, 0.0f); glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); glGetIntegerv( GL_VIEWPORT, viewport ); //Aqui sao desenhados os pontos(mostrados a partir do clique do mouse) drawPoints(); //linha entre os vertices e' desenhada aqui drawLineBetweenVertexes(); printStrings(-0.8, 0.7, "1001");//imprimindo string 1001 printStrings(-0.05, 0.7, "1000");//imprimindo string 1000 printStrings( 0.7, 0.7, "1010");//imprimindo string 1010 printStrings(-0.8, 0.0, "0001");//imprimindo string 0001 printStrings(-0.05, 0.0, "0000");//imprimindo string 0000 printStrings( 0.7, 0.0, "0010");//imprimindo string 0010 printStrings(-0.8, -0.8, "0101");//imprimindo string 0101 printStrings(-0.05,-0.8, "0100");//imprimindo string 0100 printStrings( 0.7, -0.8, "0110");//imprimindo string 0110 drawRegionLines();//Desenha linhas que delimitam as regioes glutSwapBuffers();//Fazendo troca de Buffers}//Funcao callback p/ tecladovoidkeyboard (unsigned char key, int x, int y){ switch (key){ case 27://se pressionar ESC exit(0);//sai do programa break; case 'r'://Faz chamada ao algoritmo Cohen-Sutherland para recorte CohenSutherlandLineClipAndDraw(vertexes[0][0], vertexes[0][1], vertexes[1][0], vertexes[1][1], X_MIN, X_MAX, Y_MIN, Y_MAX); glutPostRedisplay();//faz redisplay break; case ' '://comando que apaga linhas e vertices currentVertex = 0;//zera quantidade de vertices glutPostRedisplay();//faz redisplay break; }}//funcao callback para mousevoidmouse(int button, int state, int x, int y){ //caso botao do mouse seja pressionado if (state == GLUT_DOWN){ //passando para coordenadas do mundo real winX = (float)x; //passando o valor de x por cast, pois a variavel winX e' do tipo GLfloat winY = (float)viewport[3] - (float)y; //viewport[3] e y sao inteiros, por isso sao passados por cast p/ winY que e' GLfloat //funcao que pega as coordenadas de x, y gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); //guardando a posicao de x quando pressiona o botao direito do mouse vertexes[currentVertex][0] = posX; //guardando a posicao de y quando pressiona o botao direito do mouse vertexes[currentVertex][1] = posY; //incrementa a quantidade de vertices para o desenho dos pontos do //vertice e para o desenho da linha if(currentVertex < N_VERTEX){ currentVertex++;//incrementando } //fazendo redisplay glutPostRedisplay(); }}//Funcao principalintmain(int argc, char *argv[]){ //inicializando glut glutInit(&argc, argv); //definindo tamanho da tela glutInitWindowSize(800,600); //definindo posicao inicial da janela glutInitWindowPosition(100,15); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); //definindo nome da janela glutCreateWindow("Algoritmo Cohen-Sutherland"); //rotina callback de display OpenGL glutDisplayFunc(renderScene); //Rotina callback para teclado glutKeyboardFunc(keyboard); //rotina callback para o mouse glutMouseFunc(mouse); //loop principal do glut glutMainLoop(); return EXIT_SUCCESS;}