Grenoble INP ENSIMAG École Nationale Supérieure dinformatique et de Mathématiques Appliquées Rapport de Travaux d'études et de Recherche Eectué au Laboratoire Jean Kuntzmann Design d'un champ de vecteurs tangents Allemand-Giorgis Léo 2e année Option MMIS Laboratoire Jean Kuntzmann Responsable du TER 51 Rue des Mathématiques Hahmann Stefanie Campus de Saint Martin d'hères 38041 Grenoble cedex 09
2 TABLE DES MATIÈRES Table des matières 1 Introduction 4 1.1 Présentation du sujet.............................. 4 1.2 Contexte du travail............................... 4 2 La méthode d'interpolation 4 2.1 Présentation de la méthode.......................... 4 2.2 Les données du problèmes........................... 5 2.3 Le fonctionnement de la méthode....................... 5 2.3.1 Création d'une base polaire...................... 5 2.3.2 Création d'un lien entre deux facettes................. 5 2.3.3 Calculs le long de l'arête duale barycentrique............. 7 2.3.4 Calcul du vecteur au point P..................... 7 3 Implémentation 8 3.1 Le programme de départ............................ 8 3.1.1 Description du programme de base.................. 8 3.1.2 Structure de données des maillages.................. 8 3.2 Conception du code............................... 9 3.3 Implémentation de la méthode......................... 9 3.3.1 Contrainte dû à la structure de données............... 9 3.3.2 Entrées de la méthode......................... 9 3.3.3 Les problèmes rencontrés........................ 10 4 Résultats données par la méthode 10 4.1 Des succès.................................... 10 4.2 Les problèmes non résolus........................... 10 5 Commentaires sur la méthode 12 5.1 Le champ est-il continu?............................ 12 5.1.1 Dans la facette............................. 12 5.1.2 Les sommets............................... 12 5.1.3 Passage entre deux facettes...................... 12 5.2 Comportement des lignes de champ...................... 12 6 Conclusions 13 6.1 Conclusion du projet.............................. 13 6.2 Conclusion du TER............................... 13
TABLE DES MATIÈRES 3 Remerciements Je voudrais remercier Stefanie Hahmann pour m'avoir accueilli tout au long du TER, pour m'avoir inviter à des conférences et pour m'avoir permis d'assister à une réunion de l'équipe IMAGINE. Je voudrais aussi remercier l'équipe IMAGINE et particulièrement Marie-Paule Cani pour nous avoir permis d'assister à une de leur réunion d'équipe.
4 2 LA MÉTHODE D'INTERPOLATION 1 Introduction 1.1 Présentation du sujet Les domaines de la dynamique des uides, ou encore la modélisation par des méthodes aux éléments nis utilisent souvent des méthodes d'interpolation de champs de vecteurs. Par exemple, pour visualiser des champs de vecteurs, on utilise souvent de l'interpolation linéaire qui possède les avantages d'être très simple et peu coûteuse. Malheureusement, cette méthode ne permet pas de reproduire la complexité de tout champ de vecteur. En eet, les champs ayant des points de singularités qui ne sont pas du premier ordre ne peuvent pas être représenté. Cela implique un changement dans la topologie du champ de vecteur. Il faut donc trouver d'autres manières de faire une interpolation d'un champ de vecteur. Une méthode a été trouvé par Wan-Chiu Li, Bruno Vallet, Nicolas Ray et Bruno Lévy. Cette méthode est déni dans Representing Higher-Order Singularities in Vector Fields and Piecewise Linear Surfaces. L'idée est de représenter les vecteurs dans chaque facette en coordonnées polaires et d'utiliser un paramètre donnant le nombre de tour que doit faire le champ de vecteur lorsqu'il va d'un centre de gravité d'une facette au centre de gravité d'une facette adjacente. Ce projet a pour but d'implémenter cette méthode d'interpolation dans un programme déjà existant tournant sous OpenGL. 1.2 Contexte du travail Le travail a été eectué la plupart du temps dans la tour IRMA, le mardi après-midi. J'ai travaillé en collaboration avec Pierre-Luc Manteaux, un autre étudiant de TER, qui a aussi travaillé sur une méthode d'interpolation de vecteurs. Un programme nous a été fournis et nous y avons ajouté nos méthodes d'interpolation et nous avons mis des méthodes de visualisation de champ de vecteurs dur un maillage. 2 La méthode d'interpolation 2.1 Présentation de la méthode Le principe de la méthode est de faire une interpolation entre les vecteurs aux centres de gravité des facettes. On relie les deux centres de gravité de deux facettes adjacentes et on fait que le vecteur change de manière continue le long de la ligne qui relie les deux facettes en faisant varier la norme de façon linéaire et en faisant tourner le vecteur (voir la gure 1).
2.2 Les données du problèmes 5 Figure 1 Façon d'interpoler entre A et B (image tirée de la publication Representing Higher-Order Singularities in Vector Fields and Piecewise Linear Surfaces 2.2 Les données du problèmes Pour appliquer la méthode d'interpolation, nous avons besoin d'un maillage. Si possible, toute arête doit appartenir à deux facettes distinctes. Dans le cas contraire, le résultat ne sera pas prévisible. 2.3 Le fonctionnement de la méthode Nous allons chercher l'interpolation du champ de vecteur en point d'une facette que nous appellerons P. La normale à la facette sera notée n. 2.3.1 Création d'une base polaire Pour commencer, nous avons besoin d'une base polaire de la facette. Nous allons donc prendre une arête comme première composante de notre base (noté x) et le produit vectoriel de x par n nous donnera la deuxième composante. Un vecteur v de la facette pourra alors être écrit : ( ) ρ cos θ v = ρ sin θ avec ρ = v et dans R. ( cos θ sin θ ) = v. Le paramètre θ correspond à un angle que nous prendrons v 2.3.2 Création d'un lien entre deux facettes Nous allons créer un lien entre notre facette de départ et une deuxième facette. Pour cela, nous allons chercher l'arête la plus proche du point P. La facette qui contient notre arête et qui est bien sûr diérente de notre facette de départ sera alors la deuxième facette sur laquelle nous allons travailler. Nous pouvons voir par exemple la gure 2 où la facette courante est f et la deuxième facette sera la facette f. Nous dénissons de même qu'à la partie 2.3.1 une base polaire pour f. Ensuite, il faut transformer les champs de vecteurs que nous avons au centre de gravité des facettes en coordonnées polaires. Nous noterons ρ(f) et θ(f) les coordonnées polaires
6 2 LA MÉTHODE D'INTERPOLATION Figure 2 Deux facettes et un point P du vecteur au centre de gravité de la facette f et ρ(f ) et θ(f ) les coordonnées polaires du vecteur au centre de gravité de la facette f. L'interpolation des vecteurs se fera le long de la ligne passant par le centre de gravité de f, le milieu de l'arête commune aux deux facettes et par le centre de gravité de f. Cette ligne peut être vue sur la gure 3. Celle-ci est appelée l'arête duale barycentrique et nous la noterons e. Figure 3 La ligne reliant les deux facettes
2.3 Le fonctionnement de la méthode 7 2.3.3 Calculs le long de l'arête duale barycentrique Les calculs important se feront le long de l'arête duale car c'est sur celle-ci que l'on fera tourner le vecteur. Pour faire ceci, nous allons calculer la diérence d'angle entre les extrémités de e : θ(e) = ang(v G, v G ) + θ(f ) θ(f) + 2pπ La fonction ang calcule l'angle entre deux vecteurs et sont résultat appartient à ( π, π]. Le paramètre p est un entier relatif et est appelé période de saut. Ce paramètre sert à choisir la façon dont va être interpolé le champ de vecteur le long de la ligne e. Ensuite, il faut faire de même pour la diérence en norme : ρ(e) = ρ(f ) ρ(f) Nous allons maintenant dénir un coecient α qui correspond au rapport entre la longueur de e qui est dans la facette f et la longueur totale de la ligne. En appelant M le milieu de l'arête commune, on a : α = GM GM + MG La dernière dénition va être celle du paramètre t qui est la solution de P = (1 t)g + tm. Enn, nous pouvons faire l'interpolation du champ de vecteur sur la ligne e. Pour cela, il faut calculer l'angle et la norme des vecteurs sur la ligne. On fait une simple interpolation linéaire. En prenant I un point de la ligne e : θ(i) = θ(f) + θ(e)αt et ρ(i) = ρ(f) + ρ(e)αt 2.3.4 Calcul du vecteur au point P Pour calculer l'interpolation du vecteur au point P, il faut tout d'abord trouver le sommet de la facette courante le plus proche de P, nous le noterons V. C'est forcément un des sommets de l'arête trouvée dans la partie 2.3.2. On cherche alors le point d'intersection I entre la droite (P V ) et la ligne e. Le vecteur au point P sera alors le même que celui au point I. Nous voyons donc que les vecteurs seront constants le long du segment [V I]. La gure 4 montre l'interpolation du champ au points P et P à partit du calcul au point I. Les vecteurs en ces deux points sont égaux au vecteur au point I.
8 3 IMPLÉMENTATION 3 Implémentation Figure 4 Interpolation du champ au point P, P et I 3.1 Le programme de départ 3.1.1 Description du programme de base Le programme qui m'a été donné en début de TER permet d'acher des maillages en OpenGL (et donc de tourner autour du maillage, de faire des zooms). Il comprend aussi une méthode d'interpolation des champs de vecteurs. La méthode utilisé est une méthode utilisant les vecteurs aux sommets. Soient V 1, V 2 et V 3 les sommets d'une facette ayant pour vecteurs respectifsv 1, v 2 et v 3. On note P le point de la facette où l'on veut connaître le champ. Il existe α, β et γ tels que P = αv 1 + βv 2 + γv 3, alors : v P = αv 2 + βv 2 + γv 3 On peut acher les lignes de champ qui partent du centre de gravité des facettes et qui utilisent cette méthode d'interpolation. Le programme est écrit en C. 3.1.2 Structure de données des maillages La structure de données était imposée par le programme initial. Dans cette structure, les maillages sont composés de sommets, d'arêtes et de facettes. A chaque sommet correspond un entier qui est son numéro et ses coordonnées dans la base cartésienne de l'espace. Une arête comprend son numéro, les deux numéros des sommets qui la dénissent et les numéros des deux facettes adjacentes.
3.2 Conception du code 9 Une facette a un numéro, les trois numéros des arêtes qui la composent, les numéros des trois sommets et les coordonnées d'une normale à la facette. Ceci est écrit dans un format nommé.ngb qui n'est pas un format standard. Celui-ci ne sera pas détaillé ici. Ensuite, chaque sommet comporte un champ correspondant au vecteur du champ en ce point. Ces vecteurs sont dénis dans un chier.vec. 3.2 Conception du code Pierre-Luc Manteaux a travaillé avec moi sur l'ajout de nos codes au programme initial. Nous avons choisi de faire chacun deux chiers contenant notre méthode (un chier.h et un chier.c) et de faire un chier qui contiendrait des outils dont nous aurions besoin tout les deux. Dans ce chier, nous avons par exemple mis le calcul d'angle entre deux vecteurs. Ensuite, nous avons modié le code existant pour intégrer nos programmes pour l'achage de lignes de champ. Nous avons aussi travaillé ensemble sur l'achage du champ de vecteur sur le maillage. Nous en avons fait deux : une met des vecteurs un peu partout sur le maillage et l'autre ache les vecteurs sur les lignes entre les barycentres des facettes et les milieux des arêtes. Cette dernière méthode d'achage est très intéressante pour la méthode d'interpolation que j'ai implémentée. 3.3 Implémentation de la méthode 3.3.1 Contrainte dû à la structure de données La structure de données ne donnant pas le champ de vecteur au centre de gravité mais sur les sommets des facettes. J'ai donc choisi de faire une interpolation linéaire pour avoir le vecteur au centre de gravité de la facette. De plus, le champ que l'on trouve avec l'interpolation linéaire ne se situe pas forcément dans le plan de la facette. La méthode utilise un champ dans le plan, donc le vecteur est projeté dans le plan de la facette. 3.3.2 Entrées de la méthode Dans l'appel de la méthode faisant l'interpolation, il faut donner le paramètre de p (période de saut), le numéro de la face courante, le point où l'on veut faire l'interpolation et les listes de sommets, arêtes et facettes qui composent le maillage. La méthode n'a pas vraiment besoin de connaître tout le maillage, elle n'utilise que deux facettes. Mais, soit la recherche de la facette la plus proche du point se faisait dans la méthode, et donc on a besoin du maillage, soit à l'extérieur, mais nous avons préféré que dans l'achage graphique, il n'y ait l'appel que d'une seule fonction pour ne pas compliquer le code.
10 4 RÉSULTATS DONNÉES PAR LA MÉTHODE 3.3.3 Les problèmes rencontrés Plusieurs problèmes ont été rencontrés pendant l'implémentation : Le plus gros problème est venu de la compréhension du code principal. En eet, celui-ci manque vraiment de commentaires et est donc dicilement utilisable rapidement. Un des chier que j'ai eu à manipuler comprenait dans les 2500 lignes avant que des changements soient faits. Mais il a très peu de commentaires La recherche d'une arête ou d'un sommet à partir d'une arête ou d'un sommet n'a pas toujours été évidente. La structure de données n'est pas toujours facile a utilisé dès lors que l'on doit mêler les trois composantes du maillage. Il y a eu des problèmes avec la structure de données. En eet, il y a normalement plus de choses dans la structure de données que ce que j'ai décrit, mais certains champs n'étaient pas remplis. L'intersection de deux droites dans l'espace m'a posé des problèmes : il y a des cas diérents à faire car il faut vérier que les dénominateurs ne sont pas nuls, et j'ai fait des erreurs dans les conditions et des échanges de variables. Ces erreurs n'ont pas été faciles à trouver. J'ai eu du mal à comprendre ce qu'est le paramètre α (voir 2.3.3). Il était expliqué grâce à un dessin que je n'avais pas compris au moment de l'implémentation. La première version ne donnait pas la bonne chose. 4 Résultats données par la méthode 4.1 Des succès Lorsque l'on observe les vecteurs le long des lignes entre les centres de gravité des facettes et les milieux des arêtes, on voit que le plus souvent ils tournent comme nous le voulons et sur d'autres gures, on voit que les vecteurs sont constants selon des lignes passant par les sommets. La gure 5 est un exemple où l'on voit les vecteurs tourner le long de la ligne. 4.2 Les problèmes non résolus Il reste plusieurs problèmes : A certains endroits, les vecteurs sont constant le long de ligne e dans une même facette. Cela semble provenir de l'implémentation de la méthode d'intersection de deux droites. La gure 6 montre ce problème. Lorsque les lignes de champs s'approchent des sommets, elles deviennent instables et sortent parfois du maillage.
4.2 Les problèmes non résolus 11 Figure 5 Exemple où le champ est correct Figure 6 Exemple où le champ n'est pas correct
12 5 COMMENTAIRES SUR LA MÉTHODE 5 Commentaires sur la méthode 5.1 Le champ est-il continu? 5.1.1 Dans la facette Pour savoir si le champ est continue, il sut de regarder la continuité sur la ligne e qui est dans une facette. On voit que θ et ρ sont continus le long de la ligne, le champ est donc continu dans la facette. 5.1.2 Les sommets Mais il faut se demander comment se comporte le champ au sommet. Le sommet est sur toutes les lignes passant par lui-même et la ligne e. Le champ à un sommet prend donc toutes les valeurs qu'il y a sur la ligne. Comme ces valeurs ne sont pas constantes, le champ ne peut pas être déni en ce sommet. Le champ n'est donc pas continue aux sommets du maillage. 5.1.3 Passage entre deux facettes Les vecteurs étant dans le plan des facettes, le passage ne peut pas être continu si les facettes ne sont pas dans le même plan. Mais on peut dire qu'il y a une sorte de pseudo-continuité puisque sur l'arête entre les deux facettes, l'angle et la norme dépendent du vecteur que l'on trouve pour le milieu de l'arête. Il faut donc choisir la base polaire de la deuxième facette de façon à ce que les deux bases polaires soient égales si les deux facettes sont dans le même plan. Donc pour avoir la base polaire de la seconde facette, on prend la base polaire de la première et on la fait tourner autour de l'arête qui est contenu dans les deux facettes jusqu'à ce que l'on se retrouve dans le plan de la deuxième facette. 5.2 Comportement des lignes de champ Le programme permet de tracer des lignes de champ qui partent du barycentre. J'ai pu alors observer que celle-ci avait tendance à aller vers un des sommet de la facette d'où elle part. Ceci est dû au fait que l'on fait tourner le vecteur le long de la ligne. En faisant ceci, il y a des chances qu'à un moment, le vecteur d'un point P de la ligne e soit dirigé vers un des sommets de l'arête la plus proche de P. Comme les vecteurs sont constants le long du segment entre P et ce sommet, si la ligne de champ arrive sur ce segment, elle sera envoyé sur le sommet. De plus, les vecteurs qui sont proches de cette ligne ont tendance à ramener la ligne de champ vers ce segment. On peut donc dire que la ligne de champ va souvent se diriger vers un sommet sans changer de facette.
13 Figure 7 Comportement des lignes de champ Un exemple est montré à la gure 7 où l'on voit bien que la ligne de champ va vers un des sommets de la facette. 6 Conclusions 6.1 Conclusion du projet Malgré le problème que l'on rencontre, la méthode fonctionne en de nombreux points du maillage. De plus, les deux méthodes d'achage du champ de vecteurs donnent un bon rendu. Le code est réutilisable et est commenté. En changeant un paramètre à l'intérieur du code, il est possible de contrôler la valeur des paramètres à chaque partie du code. Grâce à cela, il doit être possible de comprendre ce qu'il se passe et comment enlever l'erreur. 6.2 Conclusion du TER Le TER a été une bonne expérience pour moi, j'ai pu découvrir le monde de la recherche en travaillant dans un des bureau du laboratoire ou encore en assistant à une réunion de l'équipe de recherche IMAGINE. J'ai aussi pu voir des présentation de travaux d'étudiants en thèse dans le domaine des mathématiques appliqués.