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.