Si le domaine de la fonction f est triangulé par des triangles, le plus raisonnable est d'approcher la fonction par son "interpolée P1", c'est a dire la seule fonction qui soit
![]()
Démonstration
Soit x un point à l'intérieur d'un triangle T donné
par ses coordonnées barycentriques:
![]()
on définit la valeur de l'interpolé P1 en x par
![]()
Si x est sur une arête on défini l'interpolé par
![]()
On voit facilement que la définition interne coincide avec la définition
sur les arêtes car si x tend vers une arête une des coordonnées
barycentriques tend vers 0.
Les lignes de niveau de f sont
![]()
Si on remplace f par son interpolé, les lignes de
niveau seront des lignes polygonales, car sur chaque triangle ce sont des
segments de droite, puisque la fonction est affine.
Un point d'intersection q de la courbe de niveau avec une arête e du triangle
sera trouvé s'il existe i,j et a, avec
![]()
Le principe de tracé d'une ligne de niveau est donc le suivant:
for(int k = 0; k<nt; k++)
{ m=0;
for(int i1=0;i1<3;i1++)
{
int j1 = (i1+1) % 3;
int i = t[k].v[i1]->no, j = t[k].v[j1]->no;
float a = (mu - f[j]) / (f[i] - f[j]);
if((a>=0)&&(a<=1))
{ m++; if(m==1) move2(a * q[i].x + (1-a) * q[j].x,
a * q[i].y + (1-a) * q[j].y);
else line2(a * q[i].x + (1-a) * q[j].x,
a * q[i].y + (1-a) * q[j].y);
}
}
}
A ce programme il convient d'ajouter la vérification que les dénominateurs
sont non nuls, que la fonction n'est pas identiquement constante, et
de rajouter le tracé des frontières du domaine.
![]()
Ecrire un programme qui lit un fichier
freefem
de triangulation et
un fichier de valeurs d'une fonction puis écrit un fichier gnuplot
des tracés de ligne de niveau. On testera la présence de 2 parametres
sur la ligne de commande UNIX. S'il n'y en a qu'un on tracera la triangulation
au lieu de la fontion