« INFO821 : Infographie » : différence entre les versions
Ligne 55 : | Ligne 55 : | ||
pour la partie 2. |
pour la partie 2. |
||
* |
* Dighotomie (2+0) : écrire une fonction <code>digothomie(point A, point B, double f(point))</code> qui en supposant que ''f(A)'' est négatif et ''f(B)'' est positif calcule une solution de l'équation ''f(M) = 0'' avec ''M'' sur le segment ''[A, B]''. |
||
un ou deux triangles d'un tétraère. Le prototype n'est donné qu'à titre indicatif. Il faut orienter les triangles |
|||
pour que la normale donnée par l'orientation choisie pointe vers les valeurs positives de la fonction ``f`` (-1) |
|||
* Traitement d'un tétraèdre (3+1) : écrire une fonction triangle* <code>test_tetra(point A, point B, point C, point D, double f(point))</code>, qui extrait zero, un ou deux triangles d'un tétraère. Le prototype n'est donné qu'à titre indicatif. Vous pouvez faire un tableau pour stocker les sommets par exemple. Il faut orienter les triangles pour que la normale donnée par l'orientation choisie pointe vers les valeurs positives de la fonction ''f'' (-1) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
==== Partie 2, pour ceux qui codent en C (indépendante de la partie 1) ==== |
==== Partie 2, pour ceux qui codent en C (indépendante de la partie 1) ==== |
Version du 27 janvier 2012 à 11:05
TPs et TDs
TD1
- Comment dessiner une sphère ? Nous réfléchirons ensemble ... Remarque les sphères de la librairie GLU (un composant d'openGL), ont un axe de symétrie particulier bien visible.
Le corrigé est ici . IL faut surtout regarder sphere.c et les fonctions qu'il utilise dans geometrie.c. Dans le fichier principal ̀td1_sphere.c il y a plein de choses qui pourront vous paraître obscure pour l'instant. Il faut juste regarder la fonction initGLScene()
En compilant vous devriez voir cela, de gauche à droite :
- 80 triangles en divisant les 20 faces d'un icosaedre en 4
- 72 triangles en divisant les 8 faces d'un octaedre en 9
- Version GLUSphere avec 64 triangles (un rectangle = 2 triangles)
Pour compiler ce corrigé, il faut :
- openGL version 1.X ou 2.X (testé avec 2.1).
- SDL 1.2 (librairie pour faire des jeux ...) que l'on utilise pour ouvrir une fenêtre avec le même code sous windows et linux !
- libgc : le GC de Boehm ... pour ne pas faire free(). Si vous n'arrivez pas à l'installer, remplacer GC_malloc et GC_malloc_atomic par malloc, mais il n'y aura pas de libération de la mémoire inutilisée.
TD 2 + Préparation TP
- Dessiner un ruban de Moebius (une bande de papier recollée sur elle même en faisant un demi tour).
- Le relier à un disque avec des courbes de Bézier (la bande n'a qu'un bord).
- Faire une animation pour mieux montrer ce qui se passe.
- Eliminer les arrêtes trop petites.
Voici un corrigé du TD 2, disponible aussi sous forme d'archive tar ... Enfin pas tout à fait, cf sujet de TP.
Ce corrigé comprends aussi du code utile pour le TP1 ...
Consignes générales sur les TPs
- Deux au maximum par groupe, si le nombre est impair, il y aura j'espère un solitaire.
- À partir du TP2 : bonus de 1pt pour tout changement de binôme.
- Les questions ont un nombre de points + un bonus si la question est finie pendant la séance (il faut donc m'appeler !). N'hésitez par à travailler en parallèle pour avoir plus de bonus.
- Je peux enlever des points pour la qualité du code.
- Les questions hors séances sont à rendre au maximum le lundi suivant le TP, avant 14H.
- Le code doit compiler sur ma machine (vous disposerez d'un compte ssh, le même pour tous, pour tester).
- Le programme au démarrage doit indiquer (par affichage sur la console ou via SDL), comment faire pour visualiser le résultat de chaque question (genre "taper 1 pour le voir ce que donne la question 1")
- Des contraintes supplémentaires sont données, avec le malus correspondant en cas de non respoect. C'est à vous d'indiquer si vous pensez que la contrainte a été respectée ou non.
TP 1, Marching cube
Partie 1
Tous ces programmes doivent être testable avec plusieurs fonctions (au moins 5), sélectionnable sans recompiler (-3).
Pour ceux qui ne code pas en C, il n'est pas nécessaire de stocker les triangles dans la structure de donnée avec demi-arêtes. Cela sera utile pour le TP 2. Ceux qui codent en C, doivent le faire, vu que le code est fourni ! (-3) et qu'il faut travailler dessus pour la partie 2.
- Dighotomie (2+0) : écrire une fonction
digothomie(point A, point B, double f(point))
qui en supposant que f(A) est négatif et f(B) est positif calcule une solution de l'équation f(M) = 0 avec M sur le segment [A, B].
- Traitement d'un tétraèdre (3+1) : écrire une fonction triangle*
test_tetra(point A, point B, point C, point D, double f(point))
, qui extrait zero, un ou deux triangles d'un tétraère. Le prototype n'est donné qu'à titre indicatif. Vous pouvez faire un tableau pour stocker les sommets par exemple. Il faut orienter les triangles pour que la normale donnée par l'orientation choisie pointe vers les valeurs positives de la fonction f (-1)
- Traitement d'un cube (2+1) : faire une fonction similaire pour un cube que l'on découpe en 6 tétraèdres.
- Marching-cube complet (2+2) : faire un algorithme de marching-cube divisant un cube en N3 petits cubes.
- Optionnel, affichage progressif (3+2) : proposer un affichage pendant le calcul, des interruptions du calcul, zoom, affichage des coordonnées, enfin tout ce que l'on peut vouloir pour débogger.
Partie 2, pour ceux qui codent en C (indépendante de la partie 1)
- Pb d'orientation (2+1) : Le code fourni pour la structure avec demi-arête ne peut être utilisé que si la surface est orientable. Donc, par pour un
ruban de Moëbus. Pour remédier à cela, il suffit de créer une nouvelle arête lorsque l'arête existe mais n'est "libre".
- Fuite de mémoire (2+1) : Une arête déjà utilisée par deux triangles de resservira pas : on peut l'éliminer du kd_tree (sans retirer aucun sommet).
- Itération (2+1) : Écrire des fonctions d'itérations similaires à iter_triangle pour les arêtes et les sommets. Si la partie 1 a été faite, tester en calculant
pour certaines surfaces T - A + S où T est le nombre de triangles, A le nombre d'arête et S le nombre de sommets. Pour une sphère on doit trouver 2, pour un tore (bouée), on doit trouver 0.
Partie 2, pour ceux qui codent en Java ou autres
- Bonus (?) à partager (par forcéments à parts égales) entre ceux ayant fait le code java initial, disponible au début du TP
et qui remplace le code C fourni.
- (4+3) Marche progressive : partir d'un petit cube rencontrant la surface et parcourir la surface au lieu de diviser un grand cube.
- (2+0) Comment trouver un petit cube rencontrant la surface ... Par recherche aléatoire, d'autres méthodes sont possibles ...
Représentation des objets
Nombres
- Nombres entiers (pb de taille)
- Nombres flottants (plus précisément virgule flottante) (pb de précision) norme IEEE 754
- Nombres à virgule fixe : peu utilisés/disponibles, mais pratique si l'on connait l'ordre de grandeur des nombres. Revient à utiliser
des entiers avec une unité bien choisie.
Points
- Tableaux (ou liste)
- Coordonnées cartésiennes :
* dans le plan * dans l'espace * Généralisation dans
Distinction entre points et vecteurs (direction). Opération sur les vecteurs : addition, multiplication, produits (par un scalaire, scalaire et vectoriel, déterminant), norme.
- Coordonnées projectives :
Idée : ajouter les points à l'infini. Intérêt : simplifie beaucoup de choses (transformation affine, projection, classification des quadriques, ...). Inconvéniant : certaines choses n'ont plus de sens (addition des vecteurs, ...)
* dans le plan projectif si . De plus si , * dans l'espace projectif * Généralisation dans
Comparaison avec les coordonnées cartésiennes : est le point à l'infini dans la direction (x,y,z) ou (-x:-y:-z). Parfois utile de distinguer de . représente le point si . Donc le point de coordonnées cartésiennes à les coordonnées projectives pour tout .
- On essaye de ne calculer qu'une fois les coordonnées de chaque point, pour éviter les erreurs d'arrondis (deux fois le même point avec des
coordonnées légèrement différente).
Courbes
- Courbe affine par morceaux : liste ou tableaux de points. Utilisation d'une indirection.
- Courbe paramétrée (droite, cercle).
- Discrétisation à vitesse constante :
- Discrétisation utilisant la courbure :
- Courbe de Bézier.
Surfaces
- Liste de triangles
- Liste de Quadrilatères et polygones (attention plan)
- Représentation avancée par demi-arrêtes (code à venir)
- Surfaces implicites (définition, rôle du gradient). Combinaison (max, min, produit, somme).
algorithme du marching-cube.
- Surfaces paramétrées
Triangulation de surfaces implicites Algorithme du marching-cube
- Idée générale
- Découpage du cube en tétrahèdre
- Algorithme
Traitement des triangulations
- Permutation des arrêtes
- Changement de résolution
Triangulation de nuages de points
Utilisation d'OpenGl
Bases mathématiques (vues au fur et à mesure)
Coordonnées cartésiennes dans le plan et l'espace
- dans le plan
- dans l'espace
- Généralisation dans
Distinction en point et vecteur (direction).
Problèmes de représentation en machine : virgule flottante, virgule fixe, entier ... Tableau ou enregistrement (record).
Opérations sur les vecteurs : sommes, multiplication par un scalaire, produit scalaire et produit vectoriel.
Coordonnées projectives dans le plan et l'espace
Idée : ajouté les points à l'infini. Intérêt : simplifie beaucoup de choses (transformation affine, projection, classification des quadriques, ...)
- dans le plan projectif si . De plus si ,
- dans l'espace projectif
- Généralisation dans
Comparaison avec les coordonnées cartésiennes : est le point à l'infini dans la direction (x,y,z) ou (-x:-y:-z). Parfois utile de distinguer de . représente le point si . Donc le point de coordonnées cartésiennes à les coordonnées projectives pour tout .
Opération sur les vecteurs : attention à la somme !
Équation d'un plan et d'une droite
Donnée d'une droite du plan par un point et une direction . est alors une direction orthgonale (on dit normale à la droite). Équation implicite en cartésien : . C'est à dire: . En projectif: (l'équation est homogène).
Donnée d'un plan de l'espace par un point et une direction normale . Équation implicite en cartésien : . C'est à dire: . En projectif: (l'équation est homogène).
Donnée d'une droite de l'espace par un point et une direction . ...