ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/o3d_update_coq.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 7070 byte(s)
Log Message:

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     o3d_update_coq.cpp Type:func
4    
5     Mise a jour des struct apres le remaillage d une coquille
6    
7     Date de creation : 11-3-1999 15 :24 :8
8     Derniere version : 11-3-1999 15 :24 :8
9    
10     Vincent FRANCOIS
11    
12     *****************************************************************/
13    
14    
15    
16    
17    
18     /**************************/
19     /* include */
20     #include <stdio.h>
21     #include <string.h>
22     #include <stdlib.h>
23     #include <math.h>
24     #include "const.h"
25     #include "memoire.h"
26     #include "struct.h"
27     #include "struct3d.h"
28     #include "prototype.h"
29    
30    
31     /**************************/
32     /* variables globales */
33     extern struct environnment env;
34     extern struct s_mesh *mesh;
35    
36    
37    
38     /**************************/
39     /* programme principal */
40    
41     void o3d_update_coq(struct coquille *coque)
42     {
43     struct s_noeud *no,*no1,*no2,*no3,*no4;
44     struct s_tetra *tet,**l_tetra,*tmp,*tmp2,*tettmp;
45     struct s_triangle *tri1,*tri2,*tri3,*tri4;
46     float crit;
47     int i,j,k,num,cas;
48     int n1,n2,n3,n4,nummin;
49    
50    
51     /* remplacement des anciens tetra */
52     l_tetra=(struct s_tetra **)calloc(mesh->nb_tetra+1,sizeof(struct s_tetra *));
53     ERREUR_ALLOC(l_tetra);
54    
55     for (i=0;i<coque->n;i++)
56     {
57     tet=coque->tet[i];
58     for (k=0;k<4;k++)
59     {
60     if (k==0) no=ADRESSE(tet->n1,noeud,mesh->);
61     if (k==1) no=ADRESSE(tet->n2,noeud,mesh->);
62     if (k==2) no=ADRESSE(tet->n3,noeud,mesh->);
63     if (k==3) no=ADRESSE(tet->n4,noeud,mesh->);
64     j=0;
65     while ( (j<no->nb_tetra) )
66     {
67     if (no->tetra[j]==tet)
68     {
69     if (j!=(no->nb_tetra-1))
70     {
71     memcpy(l_tetra,&(no->tetra[j+1]),(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
72     memcpy(&(no->tetra[j]),l_tetra,(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
73     }
74     no->tetra[no->nb_tetra-1]=NULL;
75     no->nb_tetra--;
76     }
77     else j++;
78     }
79     }
80     MINI(nummin,tet->n1,tet->n2);
81     MINI(nummin,nummin,tet->n3);
82     MINI(nummin,nummin,tet->n4);
83     no=ADRESSE(nummin,noeud,mesh->);
84     tettmp=no->tete_tet_petit;
85     if (tettmp==tet)
86     {
87     no->tete_tet_petit=no->tete_tet_petit->suiv;
88     if (no->tete_tet_petit==NULL) no->queue_tet_petit=NULL;
89     }
90     else
91     {
92     while (tettmp->suiv!=tet) tettmp=tettmp->suiv;
93     tettmp->suiv=tettmp->suiv->suiv;
94     if (tettmp->suiv==NULL) no->queue_tet_petit=tettmp;
95     }
96     tet->suiv=NULL;
97     cas=(int)(tet->crit*10.);
98     tmp=tet->suivant;
99     tmp2=tet->precedent;
100     if (tet->precedent!=NULL) tet->precedent->suivant=tmp;
101     else mesh->tete_tetra[cas]=tmp;
102     if (tet->suivant!=NULL) tet->suivant->precedent=tmp2;
103     else mesh->queue_tetra[cas]=tmp2;
104     tet->precedent=NULL;
105     tet->suivant=NULL;
106     tet->n1=(-1);
107     tet->n2=(-1);
108     tet->n3=(-1);
109     tet->n4=(-1);
110     tet->crit=0.;
111     tet->opt=0;
112     if (tet->triangle[0]->type==FACE) {tet->triangle[0]->tetra[0]=NULL;tet->triangle[0]->tetra[1]=NULL;}
113     else if (tet->triangle[0]->tetra[0]==tet) {tet->triangle[0]->tetra[0]=tet->triangle[0]->tetra[1];tet->triangle[0]->tetra[1]=NULL;}
114     if (tet->triangle[1]->type==FACE) {tet->triangle[1]->tetra[0]=NULL;tet->triangle[1]->tetra[1]=NULL;}
115     else if (tet->triangle[1]->tetra[0]==tet) {tet->triangle[1]->tetra[0]=tet->triangle[1]->tetra[1];tet->triangle[1]->tetra[1]=NULL;}
116     if (tet->triangle[2]->type==FACE) {tet->triangle[2]->tetra[0]=NULL;tet->triangle[2]->tetra[1]=NULL;}
117     else if (tet->triangle[2]->tetra[0]==tet) {tet->triangle[2]->tetra[0]=tet->triangle[2]->tetra[1];tet->triangle[2]->tetra[1]=NULL;}
118     if (tet->triangle[3]->type==FACE) {tet->triangle[3]->tetra[0]=NULL;tet->triangle[3]->tetra[1]=NULL;}
119     else if (tet->triangle[3]->tetra[0]==tet) {tet->triangle[3]->tetra[0]=tet->triangle[3]->tetra[1];tet->triangle[3]->tetra[1]=NULL;}
120     tet->triangle[0]=NULL;
121     tet->triangle[1]=NULL;
122     tet->triangle[2]=NULL;
123     tet->triangle[3]=NULL;
124     }
125    
126     for (i=0;i<2*coque->n-4;i++)
127     {
128     if (i<coque->n)
129     tet=coque->tet[i];
130     else
131     {
132     NEW_ENTITE(tet,tetra,mesh->);
133     tet->num=mesh->nb_tetra-1;
134     }
135     n1=coque->new_tetra[4*i];
136     n2=coque->new_tetra[4*i+1];
137     n3=coque->new_tetra[4*i+2];
138     n4=coque->new_tetra[4*i+3];
139     crit=m3d_cal_qual(n1,n2,n3,n4);
140     if (crit==0.)
141     {
142     n3=coque->new_tetra[4*i+3];
143     n4=coque->new_tetra[4*i+2];
144     }
145     m3d_i_triangle(&tri1,n1,n3,n2,TOTAL);
146     m3d_i_triangle(&tri2,n1,n2,n4,TOTAL);
147     m3d_i_triangle(&tri3,n2,n3,n4,TOTAL);
148     m3d_i_triangle(&tri4,n1,n4,n3,TOTAL);
149     tri1->front=2;
150     tri2->front=2;
151     tri3->front=2;
152     tri4->front=2;
153     if (tri1->tetra[0]==NULL) tri1->tetra[0]=tet; else tri1->tetra[1]=tet;
154     if (tri2->tetra[0]==NULL) tri2->tetra[0]=tet; else tri2->tetra[1]=tet;
155     if (tri3->tetra[0]==NULL) tri3->tetra[0]=tet; else tri3->tetra[1]=tet;
156     if (tri4->tetra[0]==NULL) tri4->tetra[0]=tet; else tri4->tetra[1]=tet;
157     tet->n1=n1;
158     tet->n2=n2;
159     tet->n3=n3;
160     tet->n4=n4;
161     tet->type=BODY;
162     tet->num_ent=0;
163     tet->crit=m3d_cal_qual(tet->n1,tet->n2,tet->n3,tet->n4);
164     tet->triangle[0]=tri1;
165     tet->triangle[1]=tri2;
166     tet->triangle[2]=tri3;
167     tet->triangle[3]=tri4;
168     tet->etat=ACTIF;
169     strcpy(tet->front,"Optimi");
170     no1=ADRESSE(tet->n1,noeud,mesh->);
171     no2=ADRESSE(tet->n2,noeud,mesh->);
172     no3=ADRESSE(tet->n3,noeud,mesh->);
173     no4=ADRESSE(tet->n4,noeud,mesh->);
174     NEW_POINTEUR(num,tetra,no1->);
175     no1->tetra[num]=tet;
176     NEW_POINTEUR(num,tetra,no2->);
177     no2->tetra[num]=tet;
178     NEW_POINTEUR(num,tetra,no3->);
179     no3->tetra[num]=tet;
180     NEW_POINTEUR(num,tetra,no4->);
181     no4->tetra[num]=tet;
182     MINI(nummin,tet->n1,tet->n2);
183     MINI(nummin,nummin,tet->n3);
184     MINI(nummin,nummin,tet->n4);
185     no=ADRESSE(nummin,noeud,mesh->);
186     if (no->tete_tet_petit==NULL)
187     {
188     no->tete_tet_petit=tet;
189     no->queue_tet_petit=tet;
190     }
191     else
192     {
193     no->queue_tet_petit->suiv=tet;
194     no->queue_tet_petit=tet;
195     }
196     m3d_ord_tet(tet);
197     }
198     free(l_tetra);
199     }