Question 1

 

Question 2

void reshape(int w,int h) {
  glViewport(0,0,w,h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(15.0,(float) w/h,30.0,100.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(0.0,30.0,50.0,0.0,0.0,0.0,0.0,1.0,0.0);
}

Il s'agit d'une fonction reshape classique à laquelle a été ajouté un appelle à gluLookAt en dernière fonction exécutée pour configurer la position de la caméra selon les caractéristiques de placement et d'orientation souhaitées. La configuration des caractéristique de visualisation est réalisée via l'appel à la fonction gluPerspective en mode GL_PROJECTION.

Question 3

void pixel(int x,int y,coord2D *c,int i) {
  c[i][0] = x;
  c[i][1] = y;
}

coord2D *calculLigne(coord2D p1,coord2D p2,int *l) {
  int dx,dy,i,xinc,yinc,cumul,x,y ;
  x = p1[0] ;
  y = p1[1] ;
  dx = p2[0] - p1[0] ;
  dy = p2[1] - p1[1] ;
  xinc = ( dx > 0 ) ? 1 : -1 ;
  yinc = ( dy > 0 ) ? 1 : -1 ;
  dx = abs(dx) ;
  dy = abs(dy) ;
  coord2D *p =(coord2D *) calloc(1+((dx > dy) ? dx : dy),
                                 sizeof(coord2D)) ;
  pixel(x,y,p,0) ;
  if ( dx > dy ) {
    *l = dx+1;
    cumul = dx / 2 ;
    for ( i = 1 ; i <= dx ; i++ ) {
      x += xinc ;
      cumul += dy ;
      if (cumul >= dx) {
        cumul -= dx ;
        y += yinc ; }
      pixel(x,y,p,i) ; } }
    else {
    *l = dy+1;
    cumul = dy / 2 ;
    for ( i = 1 ; i <= dy ; i++ ) {
      y += yinc ;
      cumul += dx ;
      if ( cumul >= dy ) {
        cumul -= dy ;
        x += xinc ; }
      pixel(x,y,p,i) ; } }
  return(p);
}

int testPixel(int x,int y,coord2D *p,int l) {
  for ( int i = 0 ; i < l ; i++ )
    if ( ( x == p[i][0] ) && ( y == p[i][1] ) )
      return(1);
  return(0);
}

int cherchePixelCommun(coord2D p1,coord2D p2,coord2D *p,int l) {
  int dx,dy,i,xinc,yinc,cumul,x,y ;
  x = p1[0] ;
  y = p1[1] ;
  dx = p2[0] - p1[0] ;
  dy = p2[1] - p1[1] ;
  xinc = ( dx > 0 ) ? 1 : -1 ;
  yinc = ( dy > 0 ) ? 1 : -1 ;
  dx = abs(dx) ;
  dy = abs(dy) ;
  if ( testPixel(x,y,p,l) )
    return(1) ;
  if ( dx > dy ) {
    cumul = dx / 2 ;
    for ( i = 1 ; i <= dx ; i++ ) {
      x += xinc ;
      cumul += dy ;
      if (cumul >= dx) {
        cumul -= dx ;
        y += yinc ; }
      if ( testPixel(x,y,p,l) )
        return(1) ; } }
    else {
    cumul = dy / 2 ;
    for ( i = 1 ; i <= dy ; i++ ) {
      y += yinc ;
      cumul += dx ;
      if ( cumul >= dy ) {
        cumul -= dy ;
        x += xinc ; }
      if ( testPixel(x,y,p,l) )
        return(1) ; } }
  return(0);
}

int testLignes(coord2D pi1,coord2D pf1,coord2D pi2,coord2D pf2) {
  int l;
  coord2D *p1 = calculLigne(pi1,pf1,&l);
  int v = cherchePixelCommun(pi1,pf2,p1,l);
  free(p1);
  return(v);
}

La fonction testLignes utilise deux variantes de l'algorithme de Bresenham.
La première permet de remplir un tableau de pixels pour déterminer tous les pixels qui seraient tracés lors du tracé du premier segment.
La seconde utilise ce tableau pour tester s'il présente un pixel commun avec ceux qui seraient tracés lors du tracé du second segment. Cette fonction s'arrète sitôt qu'une coïncidence est trouvée.

Question 4

 

 

Horizontale.gif (2348 octets)

Remarques, erreurs
nicolas.janey@univ-fcomte.fr