ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_recons.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 3906 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

# User Rev Content
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     }