next up previous contents
Next: Protection contre les dépassements Up: Les classes d'une triangulation Previous: Le plus simple

Première amélioration

Une amélioration est donné par le programme

class Vertex { public:
        float x, y;         // cordinates            
        int where;          // on which boundary      
 };

class Triangle { public:
        Vertex* v[3];      // the 3 vertices of the triangle      
        int where;         //  in which region                  
        float area;
};

class Triangulation {  public:
        int nt, nv;         // nb of triangles, vertices
        Vertex* v;          // all vertices
        Triangle* t;        // all triangles      
Triangulation(const char *path );
int no(const Vertex*   pv) const { return pv - v;}       
int no(const Triangle* pt) const { return pt - t;}       
};

En quoi est-ce une amélioration? Les données sont mieux encapsulées dans leurs classes. Les triangles contiennent des pointeurs sur les vertex et non plus leurs numéros. Ainsi si la numérotation change on n'a pas besoin de mettre à jour les données. Le prix à payer est que les numéros des sommets et des triangles sont retrouvés par des fonctions no(), dont l'utilisation est illustrée ici:

void main ()
{
  Triangulation("test.msh");
  for(int k=0; k<g.nt; k++)
    if(k != g.no(&g.t[k]) cout << "error at k=" << k << endl;
}

Par ailleurs la ligne (*) dans la fonction Triangulation::Triangulation(...) devra etre remplaçée par: t[j].v[k] = &v[-i1];


exer277
Utiliser freefem pour gnérer une triangulation d'un cercle. (Modifier éventuelement le format de lecture ici pour s'adapter à freefem.) Ecrire une fonction qui réécrit la triangulation au format gnuplot.

Le format gnuplot consiste a écrire dans un fichier de nom "myfile.gnu":

  ofstream file("myfile.gnu");
  for(int k=0; k<g.nt; k++)
    file << t[k].v[0]->x <<'\t' << t[k].v[0]->y <<endl
         << t[k].v[1]->x <<'\t' << t[k].v[1]->y <<endl
         << t[k].v[2]->x <<'\t' << t[k].v[2]->y <<endl
         << t[k].v[0]->x <<'\t' << t[k].v[0]->y <<endl << endl;
Visualiser la trianguation par gnuplot et la commande plot "myfile.gnu" w l.



Pironneau Olivier
Jeudi 26 juin 1997 07:15:20