Citar
... en el programa existe una única copia en memoria de cada vértice ...
Bueno, tomando en cuenta ese detalle hice una función que determina si un triangulo tiene un vecino en una lista de triangulos (un arreglo de punteros a triangulo). En este caso en lugar de pasarle una dupla de vertices del triangulo como parámetro le pasamos el triangulo completo.
Código [Seleccionar]
struct triangle *buscar_vecinos(struct triangle *lv[], int num_triangulos,
struct triangle *t1)
{
struct vertex *p1,*p2,*p3,*q1,*q2,*q3;
p1=t1->a; p2=t1->b; p3=t1->c;
for(int i=0;i<num_triangulos;i++)
{
q1=lv[i]->a; q2=lv[i]->b; q3=lv[i]->c;
if((p1==q1 && (p2==q2 || p2==q3 || p3==q2 || p3==q3))||
(p1==q2 && (p2==q1 || p2==q3 || p3==q1 || p3==q3))||
(p1==q3 && (p2==q1 || p2==q2 || p3==q1 || p3==q2))||
(p2==q1 && (p1==q2 || p1==q3 || p3==q2 || p3==q3))||
(p2==q2 && (p1==q1 || p1==q3 || p3==q1 || p3==q3))||
(p2==q3 && (p1==q1 || p1==q2 || p3==q1 || p3==q2))||
(p3==q1 && (p1==q2 || p1==q3 || p2==q2 || p2==q3))||
(p3==q2 && (p1==q1 || p1==q3 || p2==q1 || p2==q3))||
(p3==q3 && (p1==q1 || p1==q2 || p2==q1 || p2==q2)))
return lv[i];
}
return NULL;
}
La llamada a la funcion se haria de la siguiente manera:
Código [Seleccionar]
struct triangle *pos_vecinos_tri[12];
struct triangle *A, *vecino;
...
vecino = buscar_vecinos(pos_vecinos_tri,12,A); // buscamos un vecino al triangulo apuntado por A
Creo que que esta función toma en cuenta todas las posibilidades así que deberia funcionar si o si.
Saludos
