L'exécutable

Le source : TD-RemplissagePolygoneConvexe.cpp

/* Auteur: Nicolas JANEY           */
/* nicolas.janey@univ-fcomte.fr    */
/* Mars 2002                       */
/* Contours d'un polygone convexe  */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

#include "ModuleCouleurs.h"
#include "ModuleMenus.h"
#include "ModuleReshape.h"
#include "ModuleFont.h"

struct coord3D {
  float x;
  float y; } ;

struct polygone {
  int np;
  coord3D *p; } ;

static int aff = 0 ;
static int pol = 0 ;
static coord3D pt1[5] = { { 55,30 },
                          { 35,48 },
                          { 20,44 },
                          { 9,18 },
                          { 44,13 } };
static coord3D pt2[7] = { { 56,32 },
                          { 37,52 },
                          { 20,52 },
                          { 9,29 },
                          { 23,13 },
                          { 40,8 },
                          { 49,11 } };
static polygone p1 = { 5,pt1 };
static polygone p2 = { 7,pt2 };

void myinit() {
  glClearColor(0.8F,0.8F,0.8F,1.0F);
  setAlignement(CENTER);
}

void dessinePolygone(float *coul,polygone *p) {
  int i;
  glPushMatrix() ;
  glColor4fv(coul) ;
  glBegin(GL_POLYGON) ;
  for ( i = 0 ; i < p->np ; i++ )
    glVertex2fv((float *) &p->p[i]);
  glEnd() ;
  glColor4fv(couleurNoir()) ;
  glLineWidth(2.0) ;
  glBegin(GL_LINE_LOOP) ;
  for ( i = 0 ; i < p->np ; i++ )
    glVertex2fv((float *) &p->p[i]);
  glEnd() ;
  glLineWidth(1.0) ;
  for ( i = 0 ; i < p->np ; i++ ) {
    float x = p->p[i].x-30;
    float y = p->p[i].y-30;
    float d = sqrt(x*x+y*y);
    x /= d/15.0F;
    y /= d/15.0F;
    placeFontCursor(p->p[i].x,p->p[i].y,0.0) ;
    deplacementCursor(x,-y,0) ;
    simpleBitmapOutput(1,REGULAR8x13,"P%d",i) ;
    deplacementCursor(x,(p->p[i].y>30) ? -y-16:-y+16,0) ;
    simpleBitmapOutput(1,REGULAR8x13,"(%d,%d)",(int) p->p[i].x,(int) p->p[i].y) ; }
  glPopMatrix() ;
}

void minMaxPolygone(int *min,int *max,polygone *p) {
  int i;
  for ( i = 0 ; i < p->np ; i++ ) {
    p->p[i] = p->p[i]; }
  *min = 0;
  *max = 0;
  for ( i = 0 ; i < p->np ; i++ ) {
    if ( p->p[*min].y > p->p[i].y )
      *min = i ;
    if ( p->p[*max].y < p->p[i].y )
      *max = i ; }
}

void affichageMinMaxPolygone(polygone *p) {
  dessinePolygone(couleurRouge(),p);
  int min;
  int max;
  minMaxPolygone(&min,&max,p);
  glColor4fv(couleurJaune()) ;
  placeFontCursor(30.0,30.0,1.0) ;
  simpleBitmapOutput(1,REGULAR8x13,"MIN = %d",min) ;
  deplacementCursor(0,20,0) ;
  simpleBitmapOutput(1,REGULAR8x13,"MAX = %d",max) ;
}

void contoursPolygone(float *cd,float *cg,polygone *p) {
  int i;
  int min;
  int max;
  minMaxPolygone(&min,&max,p);
  glPushMatrix() ;
  glLineWidth(2.0) ;
  glColor4fv(cd) ;
  glBegin(GL_LINE_STRIP) ;
  for ( i = min ; i != max ; i = (i+1)%p->np ) {
    glVertex2fv((float *) &p->p[i]) ; }
  glVertex2fv((float *) &p->p[i]) ;
  glEnd() ;
  glColor4fv(cg) ;
  glBegin(GL_LINE_STRIP) ;
  for ( i = max ; i != min ; i = (i+1)%p->np ) {
    glVertex2fv((float *) &p->p[i]) ; }
  glVertex2fv((float *) &p->p[i]) ;
  glEnd() ;
  glLineWidth(1.0) ;
  glColor4fv(couleurNoir()) ;
  for ( i = 0 ; i < p->np ; i++ ) {
    float x = p->p[i].x-30;
    float y = p->p[i].y-30;
    float d = sqrt(x*x+y*y);
    x /= d/15.0F;
    y /= d/15.0F;
    placeFontCursor(p->p[i].x,p->p[i].y,0.0) ;
    deplacementCursor(x,-y,0) ;
    simpleBitmapOutput(1,REGULAR8x13,"P%d",i) ;
    deplacementCursor(x,(p->p[i].y>30) ? -y-16:-y+16,0) ;
    simpleBitmapOutput(1,REGULAR8x13,"(%d,%d)",(int) p->p[i].x,(int) p->p[i].y) ; }
  glPopMatrix() ;
}

void display() {
  polygone *p;
  switch ( pol ) {
    case 0 : p = &p1;
             break;
    case 1 : p = &p2;
             break; }
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  switch (aff) {
    case 0 : dessinePolygone(couleurRouge(),p) ;
             break ;
    case 1 : affichageMinMaxPolygone(p) ;
             break ;
    case 2 : contoursPolygone(couleurRouge(),couleurVert(),p) ;
             break ; }
  glPopMatrix();
  glFlush();
  glutSwapBuffers() ;
}

void key(unsigned char key,int x,int y) {
  switch ( key ) {
    case 0x1B : exit(0);
                break;
    case 0x0D : aff = (aff+1)%3;
                glutPostRedisplay();
                break;
    case 'p'  : 
    case 'P'  : pol = (pol+1)%2;
                glutPostRedisplay();
                break; }
}

int main(int argc,char **argv) {
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  glutInitWindowSize(340,300); 
  glutInitWindowPosition(50,50); 
  glutCreateWindow("Contours d'un polygone convexe"); 
  myinit(); 
  creationMenuBasique();
  setParametresOrthoBasique(0.0,60.0,0.0,60.0,-50.0,50.0);
  glutReshapeFunc(reshapeOrthoBasique);
  glutKeyboardFunc(key);
  glutDisplayFunc(display);
  glutMainLoop();
  return(0);
}

Les modules utilitaires : Modules.zip

RETOUR