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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m2d_ac_front.c Type:Func
4    
5     Actualisation du front
6    
7     Date de creation : Fri Feb 14 11:00:54 1997
8    
9     Derniere version : Wed May 28 11:48:59 1997
10    
11    
12    
13    
14    
15    
16    
17    
18    
19    
20    
21    
22    
23    
24     Vincent FRANCOIS
25    
26     *****************************************************************/
27    
28    
29    
30    
31    
32     /**************************/
33     /* include */
34     #include <stdio.h>
35     #include <string.h>
36     #include <stdlib.h>
37     #include "memoire.h"
38     #include "struct.h"
39     #include "const.h"
40     #include "prototype.h"
41    
42     /**************************/
43     /* variables globales */
44     extern struct s_mesh *mesh;
45     extern struct environnement env;
46    
47     /**************************/
48     /* programme principal */
49    
50     void m2d_ac_front(struct s_front **ele,int operation)
51     {
52     struct s_front *tmp,*tmp2,**l_front;
53     struct s_noeud *no1,*no2;
54     float umin,vmin,umax,vmax,u,v,rayon;
55     int nb_liste,i,j;
56     struct s_quadtree **liste,*quad;
57    
58    
59    
60     switch (operation)
61     {
62     case 1: /* suppression du lien avec l arbre */
63     liste=(struct s_quadtree **)calloc(mesh->nb_quadtree+1,sizeof(struct s_quadtree *));
64     ERREUR_ALLOC(liste);
65     l_front=(struct s_front **)calloc(mesh->nb_front_tot+1,sizeof(struct s_front *));
66     ERREUR_ALLOC(l_front);
67     no1=ADRESSE((*ele)->n1,noeud,mesh->);
68     no2=ADRESSE((*ele)->n2,noeud,mesh->);
69     MINI(umin,no1->u,no2->u);
70     MINI(vmin,no1->v,no2->v);
71     MAXI(umax,no1->u,no2->u);
72     MAXI(vmax,no1->v,no2->v);
73     u=(umin+umax)/2.;
74     v=(vmin+vmax)/2.;
75     MAXI(rayon,(umax-u),(vmax-v));
76     nb_liste=0;
77     qu_rechercher(u,v,rayon,mesh->root,liste,&nb_liste);
78     for (i=0;i<nb_liste;i++)
79     {
80     quad=liste[i];
81     j=0;
82     while ( (j<quad->nb_front) )
83     {
84     if (quad->front[j]==(*ele))
85     {
86     if (j!=(quad->nb_front-1))
87     {
88     memcpy(l_front,&(quad->front[j+1]),(quad->nb_front-1-j)*sizeof(struct s_front *));
89     memcpy(&(quad->front[j]),l_front,(quad->nb_front-1-j)*sizeof(struct s_front *));
90     }
91     quad->front[quad->nb_front-1]=NULL;
92     quad->nb_front--;
93     /*j=quad->nb_front+5;*/
94     }
95     else j++;
96     }
97     }
98     free(liste);
99     free(l_front);
100     /* suppression de l element dans le front */
101     (*ele)->seg->front=(*ele)->seg->front-1;
102     (*ele)->n1=0;
103     (*ele)->n2=0;
104     (*ele)->seg=NULL;
105     (*ele)->etat=(-1);
106     (*ele)->suiv=NULL;
107     (*ele)->prec=NULL;
108     tmp=(*ele)->suivant;
109     tmp2=(*ele)->precedent;
110     if ((*ele)->precedent!=NULL) (*ele)->precedent->suivant=tmp;
111     else mesh->tete_front=tmp;
112     if ((*ele)->suivant!=NULL) (*ele)->suivant->precedent=tmp2;
113     (*ele)->precedent=NULL;
114     (*ele)->suivant=mesh->vide_front;
115     mesh->vide_front=(*ele);
116     mesh->nb_front--;
117     break;
118     case 2: if (mesh->vide_front!=NULL)
119     {
120     (*ele)=mesh->vide_front;
121     mesh->vide_front=mesh->vide_front->suivant;
122     (*ele)->suivant=NULL;
123     mesh->nb_front++;
124     }
125     else
126     {
127     NEW_ENTITE(tmp,front,mesh->);
128     (*ele)=tmp;
129     (*ele)->num=mesh->nb_front-1;
130     mesh->nb_front_tot=mesh->nb_front_tot+1;
131     }
132     (*ele)->etat=1;
133     break;
134     }
135    
136     }