ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_break.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_break.cpp
File size: 2422 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 #include <stdio.h>
2     #include <math.h>
3     #include "m3d_struct.h"
4     #include "m3d_const.h"
5     #include "m3d_hotes.h"
6     #include "m3d_erreur.h"
7     #include "prototype.h"
8     extern GEST_MEM *gest ;
9     extern int debug ;
10     extern float crit_min ;
11     /* insertion d'un point - casser une arete */
12     int m3d_break(TETRAEDRE *tetra,int *nb_noeud,int *nb_face,float *vcoord,int *tabele,int *neww,int *old,TETRAEDRE **tab,int *nb,FACE **tab_coq,int *tab_connec)
13     {
14     float lg_arete[6], inv_tab[6] ;
15     NOEUD *n1, *n2, *n3, *n4 ;
16     NOEUD *tab2[12] ;
17     int i, iordre[10], level,j ;
18     float critere, vcorg[3], vec[3] ;
19    
20     /* longueur d'arete des tetraedres */
21     n1 = tetra->face1->n1 ;
22     n2 = tetra->face1->n2 ;
23     n3 = tetra->face1->n3 ;
24     NOEUD_TETRA(tetra,n4) ;
25     if (n4 == NULL)
26     {
27     m3d_erreur(ERR_SYST) ;
28     return(FAUX) ;
29     }
30    
31     tab2[0] = n1 ;
32     tab2[1] = n2 ;
33    
34     tab2[2] = n2 ;
35     tab2[3] = n3 ;
36    
37     tab2[4] = n1 ;
38     tab2[5] = n3 ;
39    
40     tab2[6] = n1 ;
41     tab2[7] = n4 ;
42    
43     tab2[8] = n2 ;
44     tab2[9] = n4 ;
45    
46     tab2[10] = n3 ;
47     tab2[11] = n4 ;
48    
49     for (i=0;i<6;i++)
50     {
51     vec[0] = gest->coord[x(tab2[2*i+1]->num)] - gest->coord[x(tab2[2*i]->num)] ;
52     vec[1] = gest->coord[y(tab2[2*i+1]->num)] - gest->coord[y(tab2[2*i]->num)] ;
53     vec[2] = gest->coord[z(tab2[2*i+1]->num)] - gest->coord[z(tab2[2*i]->num)] ;
54     lg_arete[i] = NORME(vec) ;
55     }
56     /* tri par longueur croissante */
57     for (i=0;i<6;i++) iordre[i] = i+1 ;
58     for (i=0;i<6;i++) inv_tab[i] = 1./lg_arete[i] ;
59     i = 6 ;
60     trirea(inv_tab,&i,iordre) ;
61     i = 0 ;
62     while (i<6)
63     {
64     level = iordre[i] - 1 ;
65     /* determination de la coquille autour de l'arete */
66     *nb_noeud = 0 ;
67     *nb_face = 0 ;
68     *nb = 0 ;
69     for (j=0;j<100;j++) old[j] = -1 ;
70     if (!m3d_arete(tetra,iordre[i],nb_noeud,nb_face,vcoord,tabele,neww,old,tab,nb,tab_coq))
71     {
72     return(FAUX) ;
73     }
74     vcorg[0] = 0.5 * (gest->coord[x(tab2[2*level+1]->num)] + gest->coord[x(tab2[2*level]->num)]) ;
75     vcorg[1] = 0.5 * (gest->coord[y(tab2[2*level+1]->num)] + gest->coord[y(tab2[2*level]->num)]);
76     vcorg[2] = 0.5 * (gest->coord[z(tab2[2*level+1]->num)] + gest->coord[z(tab2[2*level]->num)]) ;
77    
78     if (*nb_noeud != 0) /* on peut detruire l'arete */
79     {
80     critere = 0. ;
81     if (!m3d_move2(vcoord,*nb_noeud,*nb_face,tabele,vcorg,&critere,tab_connec))
82     {
83     return(FAUX) ;
84     }
85     if (critere >crit_min)
86     {
87     return(VRAI) ;
88     }
89     }
90     i++ ;
91     }
92     *nb_noeud = 0 ;
93     return(VRAI) ;
94     }