next up previous contents
Next: LEÇON : Frontières Up: LEÇON Triangulation Automatique Previous: Comment donner les points

Un premier module de triangulation automatique en C

/******************** Programme test pour mshptg.c *********************/
/********************  necessite les fichiers  mshptg.c et mshptg.h ****/
#include <stdio.h>
#include <math.h>
#include "mshptg2.h"

#define nbsmx 100 // nombre max de sommets (pour declaration des tableaux)
#define nbsdmx 1		// nombre max de sous-domaines
#define nbtmx 2*nbsmx   // nombre max de triangles
#define nbamx nbsmx+nbsdmx   // nombre d'ar\^ete

long c[2*nbsmx];		// coordonne'es des sommets en entier (out)
long tri[4*nbsmx+2*nbsdmx]; // tableau de travail (out)
long ar\^ete[2*nbamx];	//tableau des ar\^etes qui doivent etre retenues (in)
long sd[2*nbsdmx];		// numero de chaque sous-domaines (in)
long nu[6*nbtmx];		//sommets dans les triangles (1..3)+tableau de travail
long reft[nbtmx];		// tableau de travail (out)
float cr[2*nbsmx];	// coord des sommets specifies (in) et finaux (out)
float hh[nbsmx];		//hh[i]= taille souhaitee des ar\^etes autour de q^i (in)
long nbs;				// nb de points specifie's (in) et totaux (out)
long nba;				// nb d'ar\^ete (in) 
long nbt;				// nb de triangles (out)
long err;				// indicateur d'erreur (out)
long nbsmxx;			// nb maximum de sommets permis en tout (in)
long nbsd;				// nb de sous-dimaines
FILE* ff;				// fichier pour les sorties

void main()
{ /* exemple */
  int i;
      nbs=5;// nombre de sommets frontiere definis si facultatif enleve' 
      nba=nbs;				// nombre d'ar\^ete definie
      	
      cr[0]=0; cr[1]=0;  // 4x-------x 3  Les point du bords (ici 5 points)
      cr[2]=1; cr[3]=0; //   |       |    la geometrie correspond au dessin
      cr[4]=1; cr[5]=1; //   \ x 5   |  chaque point est rentrer par 2 coor
      cr[6]=0; cr[7]=1; //    /      | convention fortran pour les tableaux
      cr[8]=0.3;cr[9]=0.7;//1x-------x 2
            
      for(i=0;i<=nbs;i++)
      {
       ar\^ete[2*i]=i+1;  // le point de depart de l'ar\^ete
       ar\^ete[2*i+1]=i+2;//point d'arrive' de l'ar\^ete (convention fortran)
    }
   ar\^ete[2*nba-1]=1;  // la derniere ar\^ete qui ferme le profil

   
   for(i=0;i<=nbs;i++) hh[i]=0.1;  // la taille des ar\^etes souhaite'es
  hh[2]=0.01;
  hh[8]=0.01;
  
   sd[0]=1;    // le numero du domaine
   nbsmxx=10;   // nb max de sommets
   nbsd=1;    // nb de sous-domaines
   
   mshptg_(cr,hh,c,nu,&nbs,nbsmxx,tri,ar\^ete,nba,sd,nbsd,reft,
     &nbt,0.25,0.75,&err);

   printf("err= %d nbs= %d nbt= %d\n",(int)err,(int)nbs,(int)nbt);   

   ff=fopen("ctriangle.dta","w"); // ecriture dans le fichier ctriangle.dta

   fprintf(ff,"%d %d\n",(int)nbs,(int)nbt);
   for(i=0;i<2*nbs;i+=2)
     fprintf(ff,"%f %f %i\n", cr[i],cr[i+1],0);
   for(i=0;i<3*nbt;i+=3) 
fprintf(ff,"%d %d %d %d\n", (int)nu[i],(int)nu[i+1],(int)nu[i+2],1);
   fclose(ff);
}
Les fichiers mshptg.c et mshptg.h sont accessibles par ftp, ainsi que la version fortran mshptg.f dont elles sont dérivées par traduction automatique (f2c). L'auteur de ce module est F. Hecht (Frederic.Hecht@inria.fr).

exer628

Tester le programme précédent. Rajouter un petit trou carrée. Il faudra faire un makefile pour lier ce fichier avec mshptg.c et la bibliotheque mathematiques (lm). Le programme imprime une ligne a la console et il est important que nt= donne un chiffre >0 ce qui est le signe que le programme marche. Pour vereifier que la triangulation générée est la bonne on pourra utiliser le programme de conversion au format gnuplot ecrit à la leçon 2.

remarque572

On comprend mieux comment freefem génère des maillages. L'ordre border sert à définir les sommets du ou des contours ainsi que la liste des arêtes. L'ordre buildmesh appelle le module mshptg.



Olivier Pironneau
Mon May 17 17:14:42 METDST 1999