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