| Exercice
    1: Calculs d'illumination a) Une lumière ponctuelle est caractérisée par une position dans
    l'espace (implantation en coordonnées homogènes), une énergie (flottant compris entre 0
    et l'infini) et une couleur RVB (flottants compris entre 0 et 1). On pourra
    éventuellement ajouter un champ alpha à la couleur. b) La lumière étant colorée, l'énergie reçue est, elle-même,
    colorée.La fonction développée prend en paramètre une source lumineuse ponctuelle et une
    position et rend une énergie.
 Une fonction distance2 est développée pour calculer le carré de la distance entre deux
    positions.
 c) La formule de Lambert fait appel à un coefficient de diffusion qui
    prendra une valeur pour le rouge, une valeur pour le vert et une valeur pour le bleu (plus
    éventuellement une valeur pour le canal alpha). Ces valeurs sont des coefficients et sont
    donc compris entre 0 et 1. Pour l'implantation des coefficients de diffusion, je crée une
    structure Matérial avec un champ Kd de type couleur.La fonction développée prend en paramètre une position, une direction (la normale à la
    surface), un matériau et une source lumineuse ponctuelle et rend une énergie.
 Une structure Direction (en coordonnées homogènes) est utilisée pour représentée les
    directions.
 Une fonction produitScalaire est développée pour calculer le produit scalaire entre deux
    directions.
 Une fonction calculVecteurNorme est développée pour calculer la direction normée entre
    deux positions.
 Au cours de l'implantation, l'obtention d'un produit scalaire négatif conduit à une
    énergie diffusée nulle car la surface se masque elle-même vis à vis de la source
    lumineuse.
 Fichier
    source complet : Exam-TD-2003-2004-Exo1.cppModules utilitaires: Modules.zip
 Exercice 2: Lancer de rayons La fonction programmée prend en paramètre les deux directions  et  considérées comme normées. Elle rend comme
    résultat le rayon réfléchi  calculé et un booléen.Elle utilise la fonction produitScalaire écrite pour l'exercice
    1. Si le produit scalaire donne une valeur inférieure à 0. La fonction ne calcule pas le
    rayon réfléchi et rend faux sinon elle calcule le rayon réfléchi et rend vrai.
 Fichier
    source complet : Exam-TD-2003-2004-Exo2.cppModules utilitaires: Modules.zip
 Exercice 3: Programmation OpenGL On s'efforce de programmer cet exercice selon les caractéristiques
    suivantes:- Les appels de fonction OpenGL sont réalisés uniquement dans les fonctions init et
    display et pas dans les fonctions idle et key.
 - On place dans init les appels de fonction OpenGL devant être réalisés une fois pour
    toutes (pour le calcul de la première image et de toutes les suivantes) et dans display
    les appels de fonction OpenGL correspondant à des changements entre chaque image.
 - GLUT ne boucle pas sur une fonction idle (même vide) s'il n'y a pas d'animation en
    cours -> La consommation CPU du programme est optimisée.
 - La fonction display n'intègre pas de fonctionnalité de gestion de l'animation (elle ne
    boucle pas pour calculer plusieurs images, elle ne se lance pas elle-même, elle ne teste
    pas la fin de l'animation, ...). La fonction idle gère les aspects de la programmation
    liés à l'animation.
 - On utilise le minimum de variables globales (nécessaires avec le idle de GLUT).
 - On fait attention aux divisions entières.
 - La fonction display intègre tous les appels OpenGL nécessaires (glClear, glFlush,
    ...).
 - Les fonctions idle et key postent les redisplay à bon escient.
 Fichier
    source complet : Exam-TD-2003-2004-Exo3.cppModules utilitaires: Modules.zip
 Exercice 4: Algorithmique L'algorithme développé pour la 3D répondra aux mêmes caractéristiques
    essentielles que la version 2D:- Tout voxel (pixel) du segment discret est traversé par le segment continu.
 - Tout voxel du segment discret touche au moins un autre voxel soit par l'une de ses
    faces, soit par une de ses arêtes, soit par l'un de ses sommets (26-connexité).
 - On trace le moins possible de voxels.
 L'algorithme fait appel à 3 portions de code similaires:- une où l'on itère en x car l'axe x est l'axe où la différence entre les coordonnées
    des deux extrémités est maximum,
 - une où l'on itère en y car l'axe y est l'axe où la différence entre les coordonnées
    des deux extrémités est maximum,
 - une où l'on itère en z car l'axe z est l'axe où la différence entre les coordonnées
    des deux extrémités est maximum.
 Dans chacune de ces portions, on utilise deux variables d'accumulation:
    une pour chacune des deux autres coordonnées. Les incréments sont gérés via et sur ces
    variables comme dans la version 2D (un if simple, surtout pas de while). Fichier
    source complet : Exam-TD-2003-2004-Exo4.cppModules utilitaires: Modules.zip
 |