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
|