ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/p3d_nbsurf.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/diamesh/diamesh/src/p3d_nbsurf.cpp
File size: 4265 byte(s)
Log Message:

File Contents

# User Rev Content
1 5
2     #include <stdio.h>
3     #include "p3d_cst.h"
4     #include "m3d_struct.h"
5     #include "m3d_hotes.h"
6     #include "prototype.h"
7     extern GEST_MEM *gest ;
8     extern int debug ;
9     int p3d_nbsurf(void)
10     /* declaration des arguments */
11     {
12     /* declaration des variables internes a la procedure */
13     ELEMENT *front, *tete ;/* tete des elements du front */
14     SEGMENT *seg ;
15     int num , num1, num2, num3, n1, n2, gtrouve, vec_ele[3], k, numele, i ;
16     /* ************************************************* */
17     /* debut du code executable */
18     /* ************************************************* */
19    
20     /* on suppose que markele a ete initialise */
21    
22     /* nombre de surfaces */
23     gest->nb_surf = 0 ;
24     for (k=0 ;k<gest->nb_2d;k++)
25     {
26     (gest->tab_ele[k]).num = k ;
27     (gest->tab_ele[k]).mark = 0 ;
28     (gest->tab_ele[k]).suivant = NULL ;
29     }
30    
31     for (k=0;k<gest->nb_2d;k++)
32     {
33     /* l'element n'a pas ete traite : nouvelle strategie */
34     if ((gest->tab_ele[k]).mark == 0)
35     {
36     gest->nb_surf=gest->nb_surf + 1 ;
37     /* initialiser le front */
38     /* chercher l'element k et remplir le front */
39     /* element de numero k */
40     tete = &(gest->tab_ele[k]) ;
41     tete->mark = FRONT ;
42     front = NULL ;
43     /* insertion en tete */
44     INSERE_TETE(front,tete)
45     /* le front est non vide */
46     while (front!=NULL) /* tant que le front n'est pas vide */
47     {
48     /* numero de l'element */
49     num = front->num ;
50     /* reperer les segments qui constituent l'element */
51     num1 = gest->tabele[3*num] ;
52     num2 = gest->tabele[3*num+1] ;
53     num3 = gest->tabele[3*num+2] ;
54    
55     vec_ele[0] = UNKNOWN ;
56     vec_ele[1] = UNKNOWN ;
57     vec_ele[2] = UNKNOWN ;
58    
59     /* premier segment */
60     n1 = min(num1,num2) ;
61     n2 = max(num1,num2) ;
62     /* chercher l'element different de num connecte au segment n1,n2 */
63     seg = gest->tab_seg[n1] ;
64     gtrouve=FAUX ;
65     while ((seg!=NULL)&&(gtrouve==FAUX))
66     {
67     if ((seg->n2)==n2)
68     {
69     /* on a trouve le segment */
70     gtrouve==VRAI ;
71     /* la cardinalite du segment est egale a 2 */
72     if (seg->card == 2)
73     {
74     if (seg->tabele[0]!=num) vec_ele[0] = seg->tabele[0] ;
75     else vec_ele[0] = seg->tabele[1] ;
76     }
77     }
78     seg = seg->suivant ;
79     }
80    
81     /* deuxieme segment */
82     n1 = min(num2,num3) ;
83     n2 = max(num2,num3) ;
84     /* chercher l'element different de num connecte au segment n1,n2 */
85     seg = gest->tab_seg[n1] ;
86     gtrouve=FAUX ;
87     while ((seg!=NULL)&&(gtrouve==FAUX))
88     {
89     if ((seg->n2)==n2)
90     {
91     /* on a trouve le segment */
92     gtrouve==VRAI ;
93     /* la cardinalite du segment est egale a 2 */
94     if (seg->card == 2)
95     {
96     if (seg->tabele[0]!=num) vec_ele[1] = seg->tabele[0] ;
97     else vec_ele[1] = seg->tabele[1] ;
98     }
99     }
100     seg=seg->suivant ;
101     }
102    
103     /* troisieme segment */
104     n1 = min(num3,num1) ;
105     n2 = max(num3,num1) ;
106     /* chercher l'element different de num connecte au segment n1,n2 */
107     seg = gest->tab_seg[n1] ;
108     gtrouve=FAUX ;
109    
110     while ((seg!=NULL)&&(gtrouve==FAUX))
111     {
112     if ((seg->n2)==n2)
113     {
114     /* on a trouve le segment */
115     gtrouve==VRAI ;
116     /* la cardinalite du segment est egale a 2 */
117     if (seg->card == 2)
118     {
119     if (seg->tabele[0]!=num) vec_ele[2] = seg->tabele[0] ;
120     else vec_ele[2] = seg->tabele[1] ;
121     }
122     }
123     seg=seg->suivant ;
124     }
125     /* mise a jour du front */
126     /* suppression */
127     /* on supprime du front l'element de numero num */
128     tete->mark = gest->nb_surf ;
129     tete = front->suivant ;
130     /* restitution */
131     front=tete ;/* on detruit la tete, le suivant devient la nouvelle tete */
132     /* insertion des elements voisins */
133     for (i=0;i<3;i++)
134     {
135     numele = vec_ele[i] ;
136     /* numero de l'element connecte au segment i*/
137     if (numele != UNKNOWN)
138     if ((gest->tab_ele[numele]).mark == 0)
139     /* ne pas creer un element deja sur le front ou deja detruit afin de ne pas boucler */
140     {
141     /* creation d'un element */
142     tete = &(gest->tab_ele[numele]) ;
143     if (tete==NULL)
144     {
145     return(FAUX) ;
146     }
147     tete->mark = FRONT ;
148     INSERE_TETE(front,tete)
149     }
150     }
151     }
152     }
153     }
154     if (debug) printf(" nombre de surfaces : %d\n",gest->nb_surf) ;
155     return(VRAI) ;
156     }