next up previous contents
Next: Les Exercices de Up: LEÇON Les classes Triangulation Previous: Deuxième amélioration

Contruction du tableau des arêtes

En faisant une boucle sur les triangles et une boucle sur les 3 cotés de chaque triangle on décrit certainement toutes les arêtes. Le principe de la construction est donc

for(int k=0;k<g.nt;k++)
  for(int iloc=0;iloc<3;iloc++)
  {
    e[l].in = t[k].v[iloc];
    e[l++].out = t[k].v[(iloc+1)%3];
  }

Toutefois ce procédé décrivant 2 fois les arêtes internes, celles-ci se retrouvent 2 fois dans le tableau e.

Il faut donc prendre la convention qu'on ne mettra l'arête dans e seulement si, par convention, le numéro du sommet "in" est plus petit que le numéro du sommet "out":

for(int k=0;k<g.nt;k++)
  for(int iloc=0;iloc<3;iloc++)
  {
    Vertex& vin = t[k].v[iloc], vout = t[k].v[(iloc+1)%3];
    if(g.no(vin) < g.no(vout))
    {
      e[l].in = t[k].v[iloc];
      e[l++].out = t[k].v[(iloc+1)%3];
    }
  }
(Se reporter au troisième exercice ci-dessous pour le mécanisme de la fonction no() qui rend le numéro d'un sommet ou d'un triangle.)

Mais alors certaines arêtes frontières, qui elles ne sont décrites qu'une fois, risquent de ne pas rentrer dans le tableau e. Il ne faut donc faire ce test que si l'arête n'est pas frontière.

Par convention, une arète frontière est une arête dont les 2 sommets sont frontières. Donc

for(int k=0;k<g.nt;k++)
  for(int iloc=0;iloc<3;iloc++)
  {
    Vertex& vin = t[k].v[iloc], vout = t[k].v[(iloc+1)%3];
    if((vin.where && vout.where) || (g.no(vin) < g.no(vout)))
    {
      e[l].in = t[k].v[iloc];
      e[l++].out = t[k].v[(iloc+1)%3];
    }
  }


remarque572
Malheureusement il existe des arêtes qui verifient la définition "frontière" et qui pourtant sont internes dans le sens qu'elles appartiennent à deux triangles distincts. On ne peut, hélas, pas résoudre ce cas pathologique et c'est le format freefem qui est en défaut! Il faut soit prévenir l'utilisateur, soit faire une vérification a posteriori du tableau e pour retirer ces arêtes qui sont en double exemplaire.



Pironneau Olivier
Jeudi 12 mars 1998 16:24:39