Une amélioration est donnée par le programme suivant. D'abord la structure est enrichie; le tableaux des arêtes est défini, les sommets connaissent les numéros de tous les triangles auquel ils appartiennent (supp), ainsi que les numero des sommets auquels ils sont reliés par une arête (mate). De même les triangles connaissent non seulement leurs 3 sommets mais aussi leurs 3 arêtes et les 3 triangles voisins par les arêtes.
class Vertex { public: float x, y; // cordinates int no, where; // on which boundary int nsupp; // nb of triangles which contains this vertex Triangle* supp; //all triangles which contain the vertex int nmate; // number of neighbor vertices Vertex* mate; // all neighbors }; class Triangle { public: Vertex* v[3]; // the 3 vertices of the triangle Edge* e[3]; // pointer to the edges opposite each vertex int no, where; // in which region float area; }; class Edge { public: Vertex *in, *out; // oriented by first to last vertex Triangle *left, *right; // triangles on each side of edge int where; // on which curve (or boundary) float length; }; class Grid { public: int nt, nv, ne; // nb of triangles, vertices and edges int nbholes; // nb of holes in the domain int bdth; // bandwidth Vertex* v; // all vertices Triangle* t; // all triangles Edge* e; // all edges Grid(const char *path ); };
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 doivent être stockés afin de pouvoir y accéder (c'est le champs no), mais nous verrons qu'on peut en fait se débarrasser de ce champs et retrouver leurs numéros par leurs adresses.