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

File Contents

# User Rev Content
1 5
2     #include <stdio.h>
3     #include <stdlib.h>
4     #include <math.h>
5     #include "m3d_const.h"
6     #include "m3d_hotes.h"
7     #include "m3d_struct.h"
8     #include "m3d_erreur.h"
9     #include "prototype.h"
10     extern GEST_MEM *gest ;
11     extern int adap ;
12     extern int debug;
13     extern float dimp ;
14     int m3d_crit(void)
15     {
16     int i, j , num1, num2, num3, num;
17     int *tab_voisin ;
18     float dmin ;
19     SURFACE *surf_ext, *tete ;
20     ELEMENT *ele, *tele ;
21     float dist, dmoyen, vec[3] ;
22     float *coord ;
23     int *tabele ;
24     int is_ok = 1;
25     float *tab_crit ;
26    
27     coord = gest->coord ;
28     tabele = gest->tabele ;
29     tab_crit = gest->val_noeud ;
30    
31     surf_ext = (gest->envel)->surf_ext ;
32    
33     gest->tab_voisin = (int*)calloc(gest->nb_init * NB_MAX_VOISIN,sizeof(int)) ;
34     ERREUR_ALLOC_FAUX(gest->tab_voisin)
35     tab_voisin = gest->tab_voisin ;
36     for (i=0;i<(gest->nb_info) * NB_MAX_VOISIN;i++) tab_voisin[i] = NUM_STOP ;
37    
38     /* surface exterieure */
39     tele = surf_ext->ele ;
40     ele = tele ;/* on se place en tete de liste des elements de la surface */
41     while (ele!=NULL)/* parcours des elements sur la surface */
42     {
43     /* sommets */
44     num = ele->num ;/* numero de l'element */
45     num1=tabele[3 * num] ;
46     num2=tabele[3 * num + 1] ;
47     num3=tabele[3 * num + 2] ;
48     /* voisins du noeud num1 */
49     if (!m3d_i_cnc(num1,num2,num3,tab_voisin))
50     /* on doit inserer un noeud et il n'y a plus de place : erreur */
51     {
52     return(FAUX) ;
53     }
54     /* voisins du noeud num2 */
55     if (!m3d_i_cnc(num2,num1,num3,tab_voisin))
56     /* on doit inserer un noeud et il n'y a plus de place : erreur */
57     {
58     return(FAUX) ;
59     }
60     /* voisins du noeud num3 */
61     if (!m3d_i_cnc(num3,num1,num2,tab_voisin))
62     /* on doit inserer un noeud et il n'y a plus de place : erreur */
63     {
64     return(FAUX) ;
65     }
66     ele=ele->suivant ;
67     }
68     /* parcours des surfaces interieures */
69     tete = (gest->envel)->surf_int ;/* tete de liste des surfaces interieures */
70     while (tete!=NULL)
71     {
72     tele = tete->ele ;
73     ele = tele ;/* on se place en tete de liste des elements de la surface */
74     while (ele!=NULL)/* parcours des elements sur la surface */
75     {
76     /* sommets */
77     num = ele->num ;/* numero de l'element */
78     num1=tabele[3 * num] ;
79     num2=tabele[3 * num + 1] ;
80     num3=tabele[3 * num + 2] ;
81     /* voisins du noeud num1 */
82     if (!m3d_i_cnc(num1,num2,num3,tab_voisin))
83     /* on doit inserer un noeud et il n'y a plus de place : erreur */
84     {
85     return(FAUX) ;
86     }
87     /* voisins du noeud num2 */
88     if (!m3d_i_cnc(num2,num1,num3,tab_voisin))
89     /* on doit inserer un noeud et il n'y a plus de place : erreur */
90     {
91     return(FAUX) ;
92     }
93     /* voisins du noeud num3 */
94     if (!m3d_i_cnc(num3,num1,num2,tab_voisin))
95     /* on doit inserer un noeud et il n'y a plus de place : erreur */
96     {
97     return(FAUX) ;
98     }
99     ele=ele->suivant ;/* element suivant */
100     }
101     tete=tete->suivant ;/* surface suivante */
102     }
103     /*
104     for (i=0;i<nb_seg;i++)
105     {
106     num1=tab_seg[2*i] ;
107     num2=tab_seg[2*i+1] ;
108     num3 = UNKNOWN ;
109     if (!m3d_i_cnc(num1,num2,num3,tab_voisin))
110     {
111     return(FAUX) ;
112     }
113     if (!m3d_i_cnc(num2,num1,num3,tab_voisin))
114     {
115     return(FAUX) ;
116     }
117     }
118     */
119     for (i=0;i<gest->nb_info;i++)
120     {
121     j= 0 ;/* on se place en tete du tableau */
122     dmoyen = 0. ;
123     dmin = dimp ;
124     while(tab_voisin[i* NB_MAX_VOISIN +j]!= NUM_STOP)
125     {
126     num = tab_voisin[i* NB_MAX_VOISIN +j] ;
127     vec[0] = coord[x(i)] - coord[x(num)] ;
128     vec[1] = coord[y(i)] - coord[y(num)] ;
129     vec[2] = coord[z(i)] - coord[z(num)] ;
130     dist = NORME(vec) ;
131     dmin = min(dist,dmin) ;
132     dmoyen = dmoyen + dist ;
133     j++ ;
134     }
135     /* modif pour segments de controle */
136     if (j<1)
137     {
138     tab_crit[i] = dimp ;
139     is_ok = FAUX ;
140     }
141     else
142     {
143     if (adap == DMIN) tab_crit[i] = dmin ;
144     if (adap == DMOYEN) tab_crit[i] = dmoyen/j ;
145     }
146     }
147     free(tab_voisin) ;
148     gest->tab_voisin = NULL ;
149     free(gest->tab_ele) ;
150     gest->tab_ele = NULL ;
151     return(VRAI) ;
152     }