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

# Content
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 }