TP N° 4 / La belle courbe !!! - Jean
Transcription
TP N° 4 / La belle courbe !!! - Jean
Algorithmique et Langage C TP n°4 TP N° 4 / La belle courbe !!! PROBLEME Nous désirons écrire un programme capable de représenter en perspective les courbes de fonctions à valeurs réelles à deux variables réelles. UNE PREMIERE APPROCHE Le principe de base pour le tracé en perspective d'une courbe réelle à deux variables réelles est le suivant : - soit z = f(x,y) la surface à dessiner pour x [x_min, x_max] et y [y_min, y_max], - on trace N courbes qui sont l'intersection de la surface avec les plans y_max - y_min y = y_min + i pour i = 0, …, N-1 N-1 - chaque courbe sera représentée par une approximation affine par M morceaux, - l'effet de perspective sera obtenu en faisant correspondre au point (x,y,z) de la surface le point de coordonnées (xe,ye) sur l'écran tel que x - x_min y - y_min Taille_Ecran xe = ( + ) x_max - x_min 2(y_max - y_min) 1,5 z - z_min y - y_min Taille_Ecran ye = ( + ) z_max - z_min 2(y_max - y_min) 1,5 où z_max, z_min sont les valeurs maximales et minimales de la surface z = f(x,y) pour x [x_min, x_max] et y [y_min, y_max], et Taille_Ecran le minimum de la hauteur et de la largeur de l'écran (compté en pixel). A titre d'exemple, pour x et y z = sin 4š 2 x +y 2 [-1, 1], N égal 35 et M égal 200, voici le tracé de la courbe: 2 Jean-Luc Damoiseaux / I.S.I.T.V. 1 Algorithmique et Langage C TP n°4 AMELIORATION Comme vous pouvez le voir sur le dessin précédent, le tracé obtenu n'est pas très esthétique. On va améliorer ceci en éliminant les parties cachées de la courbe tracée. Pour cela, on utilisera l'algorithme de W. Hurg qui consiste à dessiner la surface d'avant en arrière, en conservant pour chaque i abscisse [0, Taille_Ecran], les ordonnées des pixels de l'écran correspondant respectivement au point le plus haut et le plus bas de la surface à dessiner (ces ordonnées seront mémorisées dans deux tableaux Haut et Bas). Pour l'exemple précédent, on aurait : Haut Bas Avant de tracer un segment élémentaire d'origine (xo,zo) et d'extrémité (xe,ze), on examine la visibilité de ses extrémités, un point (xc,zc) étant invisible ssi Bas[xc] < zc < Haut[xc]. Seule la ou les parties visibles du segment sont tracées. Jean-Luc Damoiseaux / I.S.I.T.V. 2 Algorithmique et Langage C TP n°4 (xo , zo ) (xi , zi ) Haut (xe, ze) Bas L'intersection d'un segment (xo,zo) - (xe,ze) avec l'horizon (Haut ou Bas) est choisie comme étant le point (xi,H[xi]) qui minimise | H[xi] - zi | où zi est calculée par extrapolation linéaire : ze - zo z i = z o+ (x - z ) xe - xo i o L'exemple suivant montre le tracé à l'écran (chaque carré représentant un pixel) d'un segment (en noir pour la partie visible, en hachuré pour la partie invisible) qui intersecte avec l'horizon Haut (en gris), le choix du point retenu pour l'intersection, ainsi que la mise à jour de l'horizon Haut : (xo zo ) Haut Haut (xi , Haut[xi ]) (xi , zi ) (xe, ze) ASPECTS TECHNIQUES La feuille de dessin est un rectangle de 640 pixels sur l'axe des x (0-639) et 480 pixels sur l'axe des y (0-479). D'autre part, les axes physiques de l'écran sont orientés gauche-droite de Jean-Luc Damoiseaux / I.S.I.T.V. 3 Algorithmique et Langage C TP n°4 l'écran pour l'axe des x, et haut-bas de l'écran pour l'axe des y. L'origine de ce repère est située en haut et à gauche de l'écran. Pour activer l'écran graphique vous utiliserez la fonction suivante : void Init_Graphisme(void) { int graphdriver, graphmode, error_code; graphdriver = DETECT; initgraph(&graphdriver,&graphmode,"c:\\"); error_code = graphresult(); if (error_code != grOk) { printf("erreur d'ouverture de la fenêtre graphique"); exit(1); } } où les fonctions initgraph, graphresult et les constantes DETECT et grOk sont définies dans le fichier en-tête graphics.h. Pour clore la session graphique vous activerez la fonction suivante : void Fin_Graphisme(void) { closegraph(); } où closegraph est une fonction définie dans graphics.h. Enfin, vous pouvez effacer l'écran graphique avec la fonction cleardevice qui ne possède pas d'argument. Les plus grandes abscisses et ordonnées de la fenêtre sont données par les deux fonctions sans argument getmaxx et getmaxy. En outre, pour dessiner un segment de droite entre deux points A(xa, ya) et B(xb, yb) vous disposez de la fonction line(xa, ya, xb, yb). Jean-Luc Damoiseaux / I.S.I.T.V. 4