M1 I3D: CAO
Courbe de Bézier par l'algorithme de Casteljau
Nous désirons tracer une courbe de Bézier cubique par l'algorithme de
Casteljau. Vous disposez pour démarrer des fichiers suivants :
makefile,
main.c
La bibliothèque graphique utilisée est opengl. Son étude n'étant pas
l'objet de ce TP, son utilisation est masquée et simplifiée par
quelques fonctions simples que vous utiliserez en priorité :
chooseColor, drawPoint et drawLine. Vous capturerez les evenements de
la souris (clics) dans la fonction mouse, les évenements clavier
(touche enfoncée) dans la fonction keyboard et dessinerez dans la
fonction display.
Tracé du polygone de contrôle
Votre premiere tache consiste à pouvoir saisir et visualiser un polygone de controle
en cliquant successivement dans la fenetre pour désigner ses points.
Prévoyez deux modes d'affichage (couleur blanche) : un mode où le
polygone de controle apparait comme une ligne brisée, un mode ou on ne
voit que les points. On basculera d'un mode a l'autre en appuyant sur
la touche C du clavier.
Interpolations successives
Pour tracer la courbe de Bézier, vous devez écrire une fonction :
Point Bezier(float t)
renvoyant pour toute coordonnée t entre 0 et 1 le point correspondant
(structure contenant x et y).
Ce point final est obtenu en pratiquant des interpolations successives (pour la valeur t) sur les n points du polygone de contrôle de départ jusqu'à ce qu'il n'en reste plus qu'un.
Tracé de la courbe
Dessinez la courbe de Bézier en faisant varier le paramètre t entre 0 et 1. Elle sera affichée comme une ligne brisée verte. Que remarquez vous si le nombre de points de contrôle augmente ? Essayez d'ajuster dynamiquement l'échantillonnage de la courbe de Bézier.
Interactions
En utilisant les fonctions mouse (pour détecter les clics souris) et mousemove (pour détecter les déplacements de la souris) ajoutez à votre programme la possibilité de saisir un sommet du polygone de controle et le déplacer en effectuant une opération de type "drag and drop". La courbe de Bézier doit se redessiner en conséquence.
Tracé des lignes de construction
Associez une touche à un mode d'affichage supplémentaire. Nous souhaitons maintenant visualiser les lignes de construction reliant les différents points du diagramme d'interpolations successives. Modifiez votre programme pour voir ces lignes pour une valeur fixe du paramètre t. Permettre ensuite d'incrémenter ou décrémenter cette valeur de t avec deux touches et observer les lignes de construction se redessiner.
Carreau de Bézier par l'algorithme de Casteljau
Récupérez le fichier de démarrage suivant : 3Dmain.c.
Définissez une variable "carreau" comme étant 4 points. Vous l'initialiserez aux valeurs suivantes : A(4,1,1), B(4,4,3), C(1,3,1), D(1,1,3). Dessinez le contour du carreau en lignes blanches puis préparer les modes d'affichage suivants.
Tracé de la surface sous forme de nuage de points
Ecrire une fonction Point bezier3D(float s, float t) qui calcule en deux interpolations successives, sur s puis sur t, le point final sur la surface de Bézier correspondant à ce couple de valeurs (s,t) (chacune entre 0 et 1). Faites varier s et t dans la fonction display pour tracer un nuage de points suffisamment dense pour voir la surface. Choisir une couleur différente du contour.
Interactions
Donner la possibilité de bouger un point de contrôle en translation, d'un petit incrément, lorsqu'on appuie sur les touches AZEQSD. Associez ces touches aux grands axes x,y et y, en + et en -. Permettre également de passer au point de contrôle suivant, de manière cyclique, en appuyant sur F. Observez la surface se déformer interactivement.
Tracé de la surface sous forme de petits quadrilatères
Dans un autre mode de dessin (vous associerez une touche à chaque mode) vous dessinerez la surface sous forme d'un maillage dense de petits quadrilatères en utilisant la fonction drawQuad fournie.
Tracé des droites d'interpolation sur s et sur t
Pour mieux visualiser le processus d'interpolation, créez un mode additionnel qui pourra se combiner avec l'un ou l'autre des modes précédents d'affichage. Dans ce mode vous dessinerez dans une couleur visible la droite reliant les deux premiers points issus de l'interpolation sur s des 4 points initiaux. Vous dessinerez également le point final sur la surface obtenu après l'interpolation sur t. Pour bien voir ce point faites appel à glPointSize pour grossir le dessin du point. Cet affichage dépendra donc d'une valeur pour un s et pour un t.
Donnez la possibilité de faire évoluer interactivement par incrément et décrément la valeur de s et t choisi pour le dessin, et testez le résultat.
Tracé de la grille de contrôle
Récuperez le fichier de démarrage : 3Dmain.c. Dessinez les points de controle suivants et reliez les pour voir la grille de contrôle (formée de plusieurs "carrés") :
P(0,0)=(0,0,0); P(0,1) = (0,1,0); P(0,2) = (0,2,0); P(0,3) = (0,3,0);
P(1,0)=(1,0,0); P(1,1) = (1,1,2); P(1,2) = (1,2,1); P(1,3) = (1,3,1);
P(2,0)=(2,0,0); P(2,1) = (2,1,2); P(2,2) = (2,2,1); P(2,3) = (2,3,1);
P(3,0)=(3,0,0); P(3,1) = (3,1,0); P(3,2) = (3,2,0); P(3,3) = (3,3,0);
Interpolations successives
Vous écrirez le contenu de la fonction :
Point Bezier(float s, float t)
qui à un point de coordonnées s et t du carreau associe sa position
dans l'espace 3D.
La grille de 4x4 points de contrôle est interpolée successivement pour le choix de paramètres s et t, pour donner une grille de 3x3 points puis 2x2, puis 1x1 = le point final.
Tracé de la surface sous forme de nuage de points
Dessinez grâce a la fonction drawPoint fournie la surface correspondant à nos points de contrôle.
Tracé de la surface sous forme d'un maillage de petits quadrilatères
Dessinez grâce a la fonction drawQuad fournie la surface correspondant à nos points de contrôle.
Interactions
Associez aux touches AZEQSD le mouvement en translation sur xyz d'un point de contrôle choisi par les touches F et G. Observez les mouvements de la surface lorsque vous bougez les points de contrôle.
Tracé des grilles d'interpolation
Pour mieux visualiser le processus d'interpolation, créez un mode additionnel qui pourra se combiner avec l'un ou l'autre des modes précédents d'affichage. Dans ce mode vous dessinerez dans une couleur visible, pour un choix fixe de s et t les grilles intermédiaires obtenues par interpolations successives (grille 3x3, grille 2x2 et point final).
Donnez la possibilité de faire évoluer interactivement par incrément et décrément la valeur de s et t choisi pour ce dessin, et observez le résultat.
Grille de taille différente dans les deux dimensions
Comment modifier le programme pour permettre de travailler avec une grille de taille quelconque NxM points ?