1 |
|
5 |
#include <stdio.h>
|
2 |
|
|
#include "m3d_struct.h"
|
3 |
|
|
#include "m3d_const.h"
|
4 |
|
|
#include "m3d_hotes.h"
|
5 |
|
|
#include "m3d_erreur.h"
|
6 |
|
|
#include "prototype.h"
|
7 |
|
|
extern float crit_min ;
|
8 |
|
|
extern int debug ;
|
9 |
|
|
extern int lissage ;
|
10 |
|
|
extern GEST_MEM *gest ;
|
11 |
|
|
int m3d_recons(FACE **tab_front,int *tab_connec,int nb_tetra)
|
12 |
|
|
{
|
13 |
|
|
int i, iordre[10], nb, num_resu, tab[4], k, ind, hist ;
|
14 |
|
|
FACE *face, *fin, *courant ;
|
15 |
|
|
NOEUD *nresu ;
|
16 |
|
|
iordre[0] = OPTI ;
|
17 |
|
|
iordre[1] = ATTENTE ;
|
18 |
|
|
|
19 |
|
|
nb = ind = 0 ;
|
20 |
|
|
face = tab_front[2*NUM_REST] ;
|
21 |
|
|
courant = face ;
|
22 |
|
|
if (courant!=NULL)
|
23 |
|
|
{
|
24 |
|
|
while (courant!=NULL)
|
25 |
|
|
{
|
26 |
|
|
courant->essai = OPTI ;
|
27 |
|
|
courant = courant->suivant ;
|
28 |
|
|
}
|
29 |
|
|
/* insertion en tete de liste OPTI */
|
30 |
|
|
fin = tab_front[2*NUM_REST+1] ;
|
31 |
|
|
fin->suivant = tab_front[2*OPTI] ;
|
32 |
|
|
/* double chainage */
|
33 |
|
|
if (tab_front[2*OPTI] != NULL) (tab_front[2*OPTI])->prec = fin ;
|
34 |
|
|
tab_front[2*OPTI] = face ;
|
35 |
|
|
if (tab_front[2*OPTI+1]==NULL) tab_front[2*OPTI+1] = fin ;
|
36 |
|
|
tab_front[2*NUM_REST] = NULL ;
|
37 |
|
|
tab_front[2*NUM_REST+1] = NULL ;
|
38 |
|
|
face = tab_front[2*OPTI] ;
|
39 |
|
|
}
|
40 |
|
|
|
41 |
|
|
while (face!= NULL) /* tant que le front n'est pas vide */
|
42 |
|
|
{
|
43 |
|
|
/* recherche du noeud connectable */
|
44 |
|
|
nresu = NULL ;
|
45 |
|
|
for (i=0;i<nb_tetra;i++)
|
46 |
|
|
{
|
47 |
|
|
nb = 0 ;
|
48 |
|
|
if (tab_connec[4*i] != 123456789)
|
49 |
|
|
{
|
50 |
|
|
for (k=0;k<4;k++) tab[k] = VRAI ;
|
51 |
|
|
if (face->n1->num == tab_connec[4*i]) {nb++ ; tab[0] = FAUX ;}
|
52 |
|
|
else if (face->n1->num == tab_connec[4*i+1]) {nb++ ; tab[1] = FAUX ;}
|
53 |
|
|
else if (face->n1->num == tab_connec[4*i+2]) {nb++ ; tab[2] = FAUX ;}
|
54 |
|
|
else if (face->n1->num == tab_connec[4*i+3]) {nb++ ; tab[3] = FAUX ;}
|
55 |
|
|
|
56 |
|
|
if (face->n2->num == tab_connec[4*i]) {nb++ ; tab[0] = FAUX ;}
|
57 |
|
|
else if (face->n2->num == tab_connec[4*i+1]) {nb++ ; tab[1] = FAUX ;}
|
58 |
|
|
else if (face->n2->num == tab_connec[4*i+2]) {nb++ ; tab[2] = FAUX ;}
|
59 |
|
|
else if (face->n2->num == tab_connec[4*i+3]) {nb++ ; tab[3] = FAUX ;}
|
60 |
|
|
|
61 |
|
|
if (face->n3->num == tab_connec[4*i]) {nb++ ; tab[0] = FAUX ;}
|
62 |
|
|
else if (face->n3->num == tab_connec[4*i+1]) {nb++ ; tab[1] = FAUX ;}
|
63 |
|
|
else if (face->n3->num == tab_connec[4*i+2]) {nb++ ; tab[2] = FAUX ;}
|
64 |
|
|
else if (face->n3->num == tab_connec[4*i+3]) {nb++ ; tab[3] = FAUX ;}
|
65 |
|
|
if (nb == 3) break ;
|
66 |
|
|
}
|
67 |
|
|
}
|
68 |
|
|
if (nb!=3)
|
69 |
|
|
{
|
70 |
|
|
if (debug) printf("ERREUR SYSTEME M3D_RECONS \n") ;
|
71 |
|
|
m3d_erreur(ERR_FIN) ;
|
72 |
|
|
return(FAUX) ;
|
73 |
|
|
}
|
74 |
|
|
for (k=0;k<4;k++) if(tab[k] == VRAI) ind = k ;
|
75 |
|
|
num_resu = tab_connec[4*i+ind] ;
|
76 |
|
|
tab_connec[4*i] = 123456789 ;
|
77 |
|
|
ADRESSE(noeud,num_resu,nresu) /* noeud solution */
|
78 |
|
|
/* ***************************************************************** */
|
79 |
|
|
/* ----------------------------------------------------------------- */
|
80 |
|
|
/* MISE A JOUR DU FRONT */
|
81 |
|
|
/* ----------------------------------------------------------------- */
|
82 |
|
|
/* ***************************************************************** */
|
83 |
|
|
hist = ADJACENT ;
|
84 |
|
|
if (!m3d_update2(face,nresu,tab_front,&hist))
|
85 |
|
|
{
|
86 |
|
|
if (debug) printf("%s\n"," Erreur m3d_update M3D_RECHNOE ") ;
|
87 |
|
|
return(FAUX) ;
|
88 |
|
|
}
|
89 |
|
|
i = 0 ;
|
90 |
|
|
face = NULL ;
|
91 |
|
|
while (face==NULL)
|
92 |
|
|
{
|
93 |
|
|
switch(iordre[i])
|
94 |
|
|
{
|
95 |
|
|
case OPTI : face = tab_front[2*OPTI] ; break ;
|
96 |
|
|
case ATTENTE :
|
97 |
|
|
courant = tab_front[2*ATTENTE] ;
|
98 |
|
|
while (courant!=NULL)
|
99 |
|
|
{
|
100 |
|
|
courant->essai = OPTI ;
|
101 |
|
|
courant = courant->suivant ;
|
102 |
|
|
}
|
103 |
|
|
tab_front[2*OPTI] = tab_front[2*ATTENTE] ;
|
104 |
|
|
tab_front[2*OPTI+1] = tab_front[2*ATTENTE+1] ;
|
105 |
|
|
tab_front[2*ATTENTE] = NULL ;
|
106 |
|
|
tab_front[2*ATTENTE+1] = NULL ;
|
107 |
|
|
face = tab_front[2*OPTI] ;
|
108 |
|
|
break ;
|
109 |
|
|
}
|
110 |
|
|
i++ ;
|
111 |
|
|
if (i==3) return(VRAI) ;
|
112 |
|
|
}
|
113 |
|
|
}
|
114 |
|
|
return(VRAI) ;
|
115 |
|
|
}
|