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