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];
}
}
![]()
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.