ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/template/src/tpl_octree.h
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Content type: text/plain
Original Path: magic/lib/template/template/src/tpl_octree.h
File size: 27751 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuillière et Vincent FRANCOIS
5     // Département de Génie Mécanique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du département
8     // de génie mécanique de l'Université du Québec à
9     // Trois Rivières
10     // Les librairies ne peuvent être utilisées sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // tpl_octree.h
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H24
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23     #ifndef _TPLOCTREE_
24     #define _TPLOCTREE_
25    
26    
27     #include "ot_boite_3D.h"
28     #include "tpl_liste_entite.h"
29     #include "tpl_map_entite.h"
30    
31     class CELLULE_OCTREE_BASE
32     {
33     public:
34     CELLULE_OCTREE_BASE()
35     {
36     static unsigned long idmax=0;
37     id=idmax;
38     idmax++;
39     };
40    
41     virtual ~CELLULE_OCTREE_BASE() {};
42     virtual BOITE_3D get_boite(void)=0;
43     virtual CELLULE_OCTREE_BASE* get_fils(int num)=0;
44     virtual int get_feuille(void)=0;
45     virtual unsigned long get_id() {return id;};
46     unsigned long id;
47     };
48    
49    
50     class OCTREE_BASE
51     {
52     public:
53     OCTREE_BASE() {};
54     virtual ~OCTREE_BASE() {};
55     virtual int get_nb_cellule(void)=0;
56     virtual CELLULE_OCTREE_BASE* get_cellule(int num)=0;
57     };
58    
59    
60     template <class A,class CONDITION>
61     class TPL_CELLULE_OCTREE:public CELLULE_OCTREE_BASE
62     {
63     public:
64     TPL_CELLULE_OCTREE(double xmin,double ymin,double zmin,double xmax,double ymax,double zmax):CELLULE_OCTREE_BASE(),boite(xmin,ymin,zmin,xmax,ymax,zmax)
65     {
66     };
67     virtual ~TPL_CELLULE_OCTREE() {};
68     BOITE_3D get_boite(void) {return boite;};
69     BOITE_3D boite;
70     int feuille;
71     TPL_CELLULE_OCTREE< A ,CONDITION> *fils[8];
72     TPL_LISTE_ENTITE<CONDITION> lst_entite_CONDITION;
73     TPL_LISTE_ENTITE<A> lst_entite_A;
74     virtual TPL_CELLULE_OCTREE<A,CONDITION>* get_fils(int num) {return fils[num];};
75     virtual int get_feuille(void) {return feuille;};
76     int get_nb_entite(void)
77     {
78     return lst_entite_A.get_nb();
79     };
80     A get_entite(int num)
81     {
82     return lst_entite_A.get(num);
83     };
84    
85     };
86    
87     template <class A,class CONDITION,class B>
88     class TPL_CELLULE_INFO:public CELLULE_OCTREE_BASE
89     {
90     public:
91     TPL_CELLULE_INFO(double xmin,double ymin,double zmin,double xmax,double ymax,double zmax):CELLULE_OCTREE_BASE(),boite(xmin,ymin,zmin,xmax,ymax,zmax)
92     {
93     };
94     virtual ~TPL_CELLULE_INFO() {};
95     BOITE_3D get_boite(void) {return boite;};
96     BOITE_3D boite;
97     int feuille;
98     TPL_CELLULE_INFO< A ,CONDITION,B> *fils[8];
99     TPL_LISTE_ENTITE<CONDITION> lst_entite_CONDITION;
100     TPL_LISTE_ENTITE<A> lst_entite_A;
101     B tab[8];
102     virtual TPL_CELLULE_INFO<A,CONDITION,B>* get_fils(int num) {return fils[num];};
103     virtual int get_feuille(void) {return feuille;};
104     int get_nb_entite(void)
105     {
106     return lst_entite_A.get_nb();
107     };
108     A get_entite(int num)
109     {
110     return lst_entite_A.get(num);
111     };
112    
113     B get_info(int num) {return tab[num];};
114     void change_info(int num,B val) {tab[num]=val;};
115    
116     };
117    
118    
119    
120     template <class A,class CONDITION>
121     class TPL_OCTREE:public OCTREE_BASE
122     {
123     public:
124     TPL_OCTREE() {};
125     ~TPL_OCTREE()
126     {
127     for (int i1=0;i1<lst_entite_cellule.get_nb();i1++)
128     {
129     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(i1);
130     delete cellule;
131     }
132     };
133    
134     virtual int get_nb_cellule(void) {return lst_entite_cellule.get_nb();};
135    
136     virtual BOITE_3D get_boite_de_base(void) {return lst_entite_cellule.get(0)->get_boite();};
137    
138     virtual TPL_CELLULE_OCTREE<A,CONDITION>* get_cellule(int num) {return lst_entite_cellule.get(num); };
139    
140    
141     virtual void initialiser(TPL_LISTE_ENTITE<CONDITION>* lst_entite,int nombre,double xmin,double ymin,double zmin,double xmax,double ymax,double zmax)
142     {
143     TPL_CELLULE_OCTREE<A ,CONDITION>* root_cellule=new TPL_CELLULE_OCTREE<A ,CONDITION>(xmin,ymin,zmin,xmax,ymax,zmax);
144     lst_entite_cellule.ajouter(root_cellule);
145     for (int i=0;i<lst_entite->get_nb();i++)
146     {
147     CONDITION cond=lst_entite->get(i);
148     BOITE_3D boite_cond=cond->get_boite_3D();
149     if (boite_cond*root_cellule->boite) root_cellule->lst_entite_CONDITION.ajouter(cond);
150     }
151     if (root_cellule->lst_entite_CONDITION.get_nb()>nombre)
152     {
153     root_cellule->feuille=0;
154     double dx=xmax-xmin;
155     double dy=ymax-ymin;
156     double dz=zmax-zmin;
157     root_cellule->fils[0]=cree_fils(xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
158     root_cellule->fils[1]=cree_fils(xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
159     root_cellule->fils[2]=cree_fils(xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
160     root_cellule->fils[3]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
161     root_cellule->fils[4]=cree_fils(xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
162     root_cellule->fils[5]=cree_fils(xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
163     root_cellule->fils[6]=cree_fils(xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
164     root_cellule->fils[7]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
165     }
166     else root_cellule->feuille=1;
167     for (int j=0;j<lst_entite_cellule.get_nb();j++)
168     {
169     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(j);
170     cellule->lst_entite_CONDITION.vide();
171     }
172     }
173    
174     virtual void initialiser(TPL_MAP_ENTITE<CONDITION>* lst_entite,int nombre,double xmin,double ymin,double zmin,double xmax,double ymax,double zmax)
175     {
176     TPL_CELLULE_OCTREE<A ,CONDITION>* root_cellule=new TPL_CELLULE_OCTREE<A ,CONDITION>(xmin,ymin,zmin,xmax,ymax,zmax);
177     lst_entite_cellule.ajouter(root_cellule);
178     for (int i=0;i<lst_entite->get_nb();i++)
179     {
180     CONDITION cond=lst_entite->get(i);
181     BOITE_3D boite_cond=cond->get_boite_3D();
182     if (boite_cond*root_cellule->boite) root_cellule->lst_entite_CONDITION.ajouter(cond);
183     }
184     if (root_cellule->lst_entite_CONDITION.get_nb()>nombre)
185     {
186     root_cellule->feuille=0;
187     double dx=xmax-xmin;
188     double dy=ymax-ymin;
189     double dz=zmax-zmin;
190     root_cellule->fils[0]=cree_fils(xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
191     root_cellule->fils[1]=cree_fils(xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
192     root_cellule->fils[2]=cree_fils(xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
193     root_cellule->fils[3]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
194     root_cellule->fils[4]=cree_fils(xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
195     root_cellule->fils[5]=cree_fils(xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
196     root_cellule->fils[6]=cree_fils(xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
197     root_cellule->fils[7]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
198     }
199     else root_cellule->feuille=1;
200     for (int j=0;j<lst_entite_cellule.get_nb();j++)
201     {
202     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(j);
203     cellule->lst_entite_CONDITION.vide();
204     }
205     }
206    
207     virtual void initialiser(OCTREE_BASE* oc)
208     {
209     BOITE_3D boite=oc->get_cellule(0)->get_boite();
210     double xmin=boite.get_xmin();
211     double xmax=boite.get_xmax();
212     double ymin=boite.get_ymin();
213     double ymax=boite.get_ymax();
214     double zmin=boite.get_zmin();
215     double zmax=boite.get_zmax();
216     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=new TPL_CELLULE_OCTREE<A ,CONDITION>(xmin,ymin,zmin,xmax,ymax,zmax);
217     lst_entite_cellule.ajouter(cellule);
218     if (oc->get_cellule(0)->get_feuille()==0)
219     {
220     cellule->fils[0]=cree_fils(oc->get_cellule(0)->get_fils(0));
221     cellule->fils[1]=cree_fils(oc->get_cellule(0)->get_fils(1));
222     cellule->fils[2]=cree_fils(oc->get_cellule(0)->get_fils(2));
223     cellule->fils[3]=cree_fils(oc->get_cellule(0)->get_fils(3));
224     cellule->fils[4]=cree_fils(oc->get_cellule(0)->get_fils(4));
225     cellule->fils[5]=cree_fils(oc->get_cellule(0)->get_fils(5));
226     cellule->fils[6]=cree_fils(oc->get_cellule(0)->get_fils(6));
227     cellule->fils[7]=cree_fils(oc->get_cellule(0)->get_fils(7));
228     }
229     cellule->feuille=oc->get_cellule(0)->get_feuille();
230     };
231    
232    
233     TPL_CELLULE_OCTREE<A,CONDITION>* cree_fils(CELLULE_OCTREE_BASE *cellule_base)
234     {
235     BOITE_3D boite=cellule_base->get_boite();
236     double xmin=boite.get_xmin();
237     double xmax=boite.get_xmax();
238     double ymin=boite.get_ymin();
239     double ymax=boite.get_ymax();
240     double zmin=boite.get_zmin();
241     double zmax=boite.get_zmax();
242     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=new TPL_CELLULE_OCTREE<A ,CONDITION>(xmin,ymin,zmin,xmax,ymax,zmax);
243     lst_entite_cellule.ajouter(cellule);
244     if (cellule_base->get_feuille()==1)
245     {
246     cellule->feuille=1;
247     }
248     else
249     {
250     cellule->fils[0]=cree_fils(cellule_base->get_fils(0));
251     cellule->fils[1]=cree_fils(cellule_base->get_fils(1));
252     cellule->fils[2]=cree_fils(cellule_base->get_fils(2));
253     cellule->fils[3]=cree_fils(cellule_base->get_fils(3));
254     cellule->fils[4]=cree_fils(cellule_base->get_fils(4));
255     cellule->fils[5]=cree_fils(cellule_base->get_fils(5));
256     cellule->fils[6]=cree_fils(cellule_base->get_fils(6));
257     cellule->fils[7]=cree_fils(cellule_base->get_fils(7));
258     cellule->feuille=0;
259     }
260     return cellule;
261     };
262    
263     virtual TPL_CELLULE_OCTREE<A ,CONDITION>* cree_fils(double xmin,double ymin,double zmin,double dx,double dy,double dz,TPL_LISTE_ENTITE<CONDITION>* lst_entite,int nombre)
264     {
265     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=new TPL_CELLULE_OCTREE<A ,CONDITION>(xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz);
266     lst_entite_cellule.ajouter(cellule);
267     for (int i=0;i<lst_entite->get_nb();i++)
268     {
269     CONDITION cond=lst_entite->get(i);
270     BOITE_3D boite_cond=cond->get_boite_3D();
271     if (boite_cond*cellule->boite) cellule->lst_entite_CONDITION.ajouter(cond);
272     }
273     if (cellule->lst_entite_CONDITION.get_nb()>nombre)
274     {
275     cellule->feuille=0;
276     cellule->fils[0]=cree_fils(xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
277     cellule->fils[1]=cree_fils(xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
278     cellule->fils[2]=cree_fils(xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
279     cellule->fils[3]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
280     cellule->fils[4]=cree_fils(xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
281     cellule->fils[5]=cree_fils(xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
282     cellule->fils[6]=cree_fils(xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
283     cellule->fils[7]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
284     }
285     else cellule->feuille=1;
286     return cellule;
287     }
288    
289    
290     virtual void rechercher(BOITE_3D& boite,TPL_MAP_ENTITE<A>& liste_entite_trouve,TPL_CELLULE_OCTREE<A ,CONDITION>* cellule)
291     {
292     if (boite*cellule->boite)
293     if (cellule->feuille==1)
294     {
295     for (int i=0;i<cellule->lst_entite_A.get_nb();i++)
296     liste_entite_trouve.ajouter(cellule->lst_entite_A.get(i));
297     }
298     else
299     {
300     rechercher(boite,liste_entite_trouve,cellule->fils[0]);
301     rechercher(boite,liste_entite_trouve,cellule->fils[1]);
302     rechercher(boite,liste_entite_trouve,cellule->fils[2]);
303     rechercher(boite,liste_entite_trouve,cellule->fils[3]);
304     rechercher(boite,liste_entite_trouve,cellule->fils[4]);
305     rechercher(boite,liste_entite_trouve,cellule->fils[5]);
306     rechercher(boite,liste_entite_trouve,cellule->fils[6]);
307     rechercher(boite,liste_entite_trouve,cellule->fils[7]);
308     }
309     };
310    
311    
312     virtual void get_cellule(BOITE_3D& boite,TPL_CELLULE_OCTREE<A ,CONDITION>* cellule,TPL_MAP_ENTITE<TPL_CELLULE_OCTREE<A ,CONDITION> * > &liste_entite)
313     {
314     if (boite*cellule->boite)
315     if (cellule->feuille==1)
316     {
317     liste_entite.ajouter(cellule);
318     }
319     else
320     {
321     get_cellule(boite,cellule->fils[0],liste_entite);
322     get_cellule(boite,cellule->fils[1],liste_entite);
323     get_cellule(boite,cellule->fils[2],liste_entite);
324     get_cellule(boite,cellule->fils[3],liste_entite);
325     get_cellule(boite,cellule->fils[4],liste_entite);
326     get_cellule(boite,cellule->fils[5],liste_entite);
327     get_cellule(boite,cellule->fils[6],liste_entite);
328     get_cellule(boite,cellule->fils[7],liste_entite);
329     }
330     };
331    
332     virtual TPL_CELLULE_OCTREE<A,CONDITION> *get_cellule(double x,double y, double z)
333     {
334     BOITE_3D boite(x,y,z,x,y,z);
335     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(0);
336     TPL_MAP_ENTITE<TPL_CELLULE_OCTREE<A ,CONDITION> * > liste_cellule;
337     get_cellule(boite,cellule,liste_cellule);
338     if (liste_cellule.get_nb()==1) return liste_cellule.get(0);
339     return NULL;
340     };
341    
342    
343     virtual void rechercher(double xcentre,double ycentre,double zcentre,double rayon_recherche,TPL_MAP_ENTITE<A>& liste_entite_trouve)
344     {
345     BOITE_3D boite(xcentre-rayon_recherche,ycentre-rayon_recherche,zcentre-rayon_recherche,xcentre+rayon_recherche,ycentre+rayon_recherche,zcentre+rayon_recherche);
346     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(0);
347     rechercher(boite,liste_entite_trouve,cellule);
348     };
349    
350    
351    
352     virtual void inserer(BOITE_3D& boite,A a,TPL_CELLULE_OCTREE<A ,CONDITION>* cellule)
353     {
354     if (boite*cellule->boite)
355     if (cellule->feuille==1)
356     {
357     cellule->lst_entite_A.ajouter(a);
358     }
359     else
360     {
361     inserer(boite,a,cellule->fils[0]);
362     inserer(boite,a,cellule->fils[1]);
363     inserer(boite,a,cellule->fils[2]);
364     inserer(boite,a,cellule->fils[3]);
365     inserer(boite,a,cellule->fils[4]);
366     inserer(boite,a,cellule->fils[5]);
367     inserer(boite,a,cellule->fils[6]);
368     inserer(boite,a,cellule->fils[7]);
369     }
370     };
371    
372     virtual void supprimer(BOITE_3D& boite,A a,TPL_CELLULE_OCTREE<A ,CONDITION>* cellule)
373     {
374     if (boite*cellule->boite)
375     if (cellule->feuille==1)
376     {
377     cellule->lst_entite_A.supprimer(a);
378     }
379     else
380     {
381     supprimer(boite,a,cellule->fils[0]);
382     supprimer(boite,a,cellule->fils[1]);
383     supprimer(boite,a,cellule->fils[2]);
384     supprimer(boite,a,cellule->fils[3]);
385     supprimer(boite,a,cellule->fils[4]);
386     supprimer(boite,a,cellule->fils[5]);
387     supprimer(boite,a,cellule->fils[6]);
388     supprimer(boite,a,cellule->fils[7]);
389     }
390     };
391    
392     virtual void inserer(A a)
393     {
394     BOITE_3D boite=a->get_boite_3D();
395     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(0);
396     inserer(boite,a,cellule);
397     }
398    
399     virtual void supprimer(A a)
400     {
401     BOITE_3D boite=a->get_boite_3D();
402     TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=lst_entite_cellule.get(0);
403     supprimer(boite,a,cellule);
404     }
405    
406    
407     private:
408     TPL_LISTE_ENTITE<TPL_CELLULE_OCTREE<A ,CONDITION>* > lst_entite_cellule;
409    
410     };
411    
412    
413    
414     template <class A,class CONDITION,class B>
415     class TPL_OCTREE_INFO:public OCTREE_BASE
416     {
417     public:
418     TPL_OCTREE_INFO() {};
419     ~TPL_OCTREE_INFO()
420     {
421     for (int i1=0;i1<lst_entite_cellule.get_nb();i1++)
422     {
423     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(i1);
424     delete cellule;
425     }
426     };
427    
428     virtual int get_nb_cellule(void) {return lst_entite_cellule.get_nb();};
429    
430     virtual BOITE_3D get_boite_de_base(void) {return lst_entite_cellule.get(0)->get_boite();};
431    
432     virtual TPL_CELLULE_INFO<A,CONDITION,B>* get_cellule(int num) {return lst_entite_cellule.get(num); };
433    
434    
435     virtual void initialiser(TPL_LISTE_ENTITE<CONDITION>* lst_entite,int nombre,double xmin,double ymin,double zmin,double xmax,double ymax,double zmax)
436     {
437     TPL_CELLULE_INFO<A ,CONDITION,B>* root_cellule=new TPL_CELLULE_INFO<A ,CONDITION,B>(xmin,ymin,zmin,xmax,ymax,zmax);
438     lst_entite_cellule.ajouter(root_cellule);
439     for (int i=0;i<lst_entite->get_nb();i++)
440     {
441     CONDITION cond=lst_entite->get(i);
442     BOITE_3D boite_cond=cond->get_boite_3D();
443     if (boite_cond*root_cellule->boite) root_cellule->lst_entite_CONDITION.ajouter(cond);
444     }
445     if (root_cellule->lst_entite_CONDITION.get_nb()>nombre)
446     {
447     root_cellule->feuille=0;
448     double dx=xmax-xmin;
449     double dy=ymax-ymin;
450     double dz=zmax-zmin;
451     root_cellule->fils[0]=cree_fils(xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
452     root_cellule->fils[1]=cree_fils(xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
453     root_cellule->fils[2]=cree_fils(xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
454     root_cellule->fils[3]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
455     root_cellule->fils[4]=cree_fils(xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
456     root_cellule->fils[5]=cree_fils(xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
457     root_cellule->fils[6]=cree_fils(xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
458     root_cellule->fils[7]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
459     }
460     else root_cellule->feuille=1;
461     for (int j=0;j<lst_entite_cellule.get_nb();j++)
462     {
463     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(j);
464     cellule->lst_entite_CONDITION.vide();
465     }
466     }
467    
468     virtual void initialiser(TPL_MAP_ENTITE<CONDITION>* lst_entite,int nombre,double xmin,double ymin,double zmin,double xmax,double ymax,double zmax)
469     {
470     TPL_CELLULE_INFO<A ,CONDITION,B>* root_cellule=new TPL_CELLULE_INFO<A ,CONDITION,B>(xmin,ymin,zmin,xmax,ymax,zmax);
471     lst_entite_cellule.ajouter(root_cellule);
472     for (int i=0;i<lst_entite->get_nb();i++)
473     {
474     CONDITION cond=lst_entite->get(i);
475     BOITE_3D boite_cond=cond->get_boite_3D();
476     if (boite_cond*root_cellule->boite) root_cellule->lst_entite_CONDITION.ajouter(cond);
477     }
478     if (root_cellule->lst_entite_CONDITION.get_nb()>nombre)
479     {
480     root_cellule->feuille=0;
481     double dx=xmax-xmin;
482     double dy=ymax-ymin;
483     double dz=zmax-zmin;
484     root_cellule->fils[0]=cree_fils(xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
485     root_cellule->fils[1]=cree_fils(xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
486     root_cellule->fils[2]=cree_fils(xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
487     root_cellule->fils[3]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
488     root_cellule->fils[4]=cree_fils(xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
489     root_cellule->fils[5]=cree_fils(xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
490     root_cellule->fils[6]=cree_fils(xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
491     root_cellule->fils[7]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->lst_entite_CONDITION),nombre);
492     }
493     else root_cellule->feuille=1;
494     for (int j=0;j<lst_entite_cellule.get_nb();j++)
495     {
496     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(j);
497     cellule->lst_entite_CONDITION.vide();
498     }
499     }
500    
501     virtual void initialiser(OCTREE_BASE* oc)
502     {
503     BOITE_3D boite=oc->get_cellule(0)->get_boite();
504     double xmin=boite.get_xmin();
505     double xmax=boite.get_xmax();
506     double ymin=boite.get_ymin();
507     double ymax=boite.get_ymax();
508     double zmin=boite.get_zmin();
509     double zmax=boite.get_zmax();
510     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=new TPL_CELLULE_INFO<A ,CONDITION,B>(xmin,ymin,zmin,xmax,ymax,zmax);
511     lst_entite_cellule.ajouter(cellule);
512     if (oc->get_cellule(0)->get_feuille()==0)
513     {
514     cellule->fils[0]=cree_fils(oc->get_cellule(0)->get_fils(0));
515     cellule->fils[1]=cree_fils(oc->get_cellule(0)->get_fils(1));
516     cellule->fils[2]=cree_fils(oc->get_cellule(0)->get_fils(2));
517     cellule->fils[3]=cree_fils(oc->get_cellule(0)->get_fils(3));
518     cellule->fils[4]=cree_fils(oc->get_cellule(0)->get_fils(4));
519     cellule->fils[5]=cree_fils(oc->get_cellule(0)->get_fils(5));
520     cellule->fils[6]=cree_fils(oc->get_cellule(0)->get_fils(6));
521     cellule->fils[7]=cree_fils(oc->get_cellule(0)->get_fils(7));
522     }
523     cellule->feuille=oc->get_cellule(0)->get_feuille();
524     };
525    
526    
527     TPL_CELLULE_INFO<A,CONDITION,B>* cree_fils(CELLULE_OCTREE_BASE *cellule_base)
528     {
529     BOITE_3D boite=cellule_base->get_boite();
530     double xmin=boite.get_xmin();
531     double xmax=boite.get_xmax();
532     double ymin=boite.get_ymin();
533     double ymax=boite.get_ymax();
534     double zmin=boite.get_zmin();
535     double zmax=boite.get_zmax();
536     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=new TPL_CELLULE_INFO<A ,CONDITION,B>(xmin,ymin,zmin,xmax,ymax,zmax);
537     lst_entite_cellule.ajouter(cellule);
538     if (cellule_base->get_feuille()==1)
539     {
540     cellule->feuille=1;
541     }
542     else
543     {
544     cellule->fils[0]=cree_fils(cellule_base->get_fils(0));
545     cellule->fils[1]=cree_fils(cellule_base->get_fils(1));
546     cellule->fils[2]=cree_fils(cellule_base->get_fils(2));
547     cellule->fils[3]=cree_fils(cellule_base->get_fils(3));
548     cellule->fils[4]=cree_fils(cellule_base->get_fils(4));
549     cellule->fils[5]=cree_fils(cellule_base->get_fils(5));
550     cellule->fils[6]=cree_fils(cellule_base->get_fils(6));
551     cellule->fils[7]=cree_fils(cellule_base->get_fils(7));
552     cellule->feuille=0;
553     }
554     return cellule;
555     };
556    
557     virtual TPL_CELLULE_INFO<A ,CONDITION,B>* cree_fils(double xmin,double ymin,double zmin,double dx,double dy,double dz,TPL_LISTE_ENTITE<CONDITION>* lst_entite,int nombre)
558     {
559     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=new TPL_CELLULE_INFO<A ,CONDITION,B>(xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz);
560     lst_entite_cellule.ajouter(cellule);
561     for (int i=0;i<lst_entite->get_nb();i++)
562     {
563     CONDITION cond=lst_entite->get(i);
564     BOITE_3D boite_cond=cond->get_boite_3D();
565     if (boite_cond*cellule->boite) cellule->lst_entite_CONDITION.ajouter(cond);
566     }
567     if (cellule->lst_entite_CONDITION.get_nb()>nombre)
568     {
569     cellule->feuille=0;
570     cellule->fils[0]=cree_fils(xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
571     cellule->fils[1]=cree_fils(xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
572     cellule->fils[2]=cree_fils(xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
573     cellule->fils[3]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
574     cellule->fils[4]=cree_fils(xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
575     cellule->fils[5]=cree_fils(xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
576     cellule->fils[6]=cree_fils(xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
577     cellule->fils[7]=cree_fils(xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->lst_entite_CONDITION),nombre);
578     }
579     else cellule->feuille=1;
580     return cellule;
581     }
582    
583    
584     virtual void rechercher(BOITE_3D& boite,TPL_MAP_ENTITE<A>& liste_entite_trouve,TPL_CELLULE_INFO<A ,CONDITION,B>* cellule)
585     {
586     if (boite*cellule->boite)
587     if (cellule->feuille==1)
588     {
589     for (int i=0;i<cellule->lst_entite_A.get_nb();i++)
590     liste_entite_trouve.ajouter(cellule->lst_entite_A.get(i));
591     }
592     else
593     {
594     rechercher(boite,liste_entite_trouve,cellule->fils[0]);
595     rechercher(boite,liste_entite_trouve,cellule->fils[1]);
596     rechercher(boite,liste_entite_trouve,cellule->fils[2]);
597     rechercher(boite,liste_entite_trouve,cellule->fils[3]);
598     rechercher(boite,liste_entite_trouve,cellule->fils[4]);
599     rechercher(boite,liste_entite_trouve,cellule->fils[5]);
600     rechercher(boite,liste_entite_trouve,cellule->fils[6]);
601     rechercher(boite,liste_entite_trouve,cellule->fils[7]);
602     }
603     };
604    
605    
606     virtual void get_cellule(BOITE_3D& boite,TPL_CELLULE_INFO<A ,CONDITION,B>* cellule,TPL_MAP_ENTITE<TPL_CELLULE_INFO<A ,CONDITION,B> * > &liste_entite)
607     {
608     if (boite*cellule->boite)
609     if (cellule->feuille==1)
610     {
611     liste_entite.ajouter(cellule);
612     }
613     else
614     {
615     get_cellule(boite,cellule->fils[0],liste_entite);
616     get_cellule(boite,cellule->fils[1],liste_entite);
617     get_cellule(boite,cellule->fils[2],liste_entite);
618     get_cellule(boite,cellule->fils[3],liste_entite);
619     get_cellule(boite,cellule->fils[4],liste_entite);
620     get_cellule(boite,cellule->fils[5],liste_entite);
621     get_cellule(boite,cellule->fils[6],liste_entite);
622     get_cellule(boite,cellule->fils[7],liste_entite);
623     }
624     };
625    
626     virtual TPL_CELLULE_INFO<A,CONDITION,B> *get_cellule(double x,double y, double z)
627     {
628     BOITE_3D boite(x,y,z,x,y,z);
629     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(0);
630     TPL_MAP_ENTITE<TPL_CELLULE_INFO<A ,CONDITION,B> * > liste_cellule;
631     get_cellule(boite,cellule,liste_cellule);
632     if (liste_cellule.get_nb()==1) return liste_cellule.get(0);
633     return NULL;
634     };
635    
636    
637     virtual void rechercher(double xcentre,double ycentre,double zcentre,double rayon_recherche,TPL_MAP_ENTITE<A>& liste_entite_trouve)
638     {
639     BOITE_3D boite(xcentre-rayon_recherche,ycentre-rayon_recherche,zcentre-rayon_recherche,xcentre+rayon_recherche,ycentre+rayon_recherche,zcentre+rayon_recherche);
640     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(0);
641     rechercher(boite,liste_entite_trouve,cellule);
642     };
643    
644    
645    
646     virtual void inserer(BOITE_3D& boite,A a,TPL_CELLULE_INFO<A ,CONDITION,B>* cellule)
647     {
648     if (boite*cellule->boite)
649     if (cellule->feuille==1)
650     {
651     cellule->lst_entite_A.ajouter(a);
652     }
653     else
654     {
655     inserer(boite,a,cellule->fils[0]);
656     inserer(boite,a,cellule->fils[1]);
657     inserer(boite,a,cellule->fils[2]);
658     inserer(boite,a,cellule->fils[3]);
659     inserer(boite,a,cellule->fils[4]);
660     inserer(boite,a,cellule->fils[5]);
661     inserer(boite,a,cellule->fils[6]);
662     inserer(boite,a,cellule->fils[7]);
663     }
664     };
665    
666     virtual void supprimer(BOITE_3D& boite,A a,TPL_CELLULE_INFO<A ,CONDITION,B>* cellule)
667     {
668     if (boite*cellule->boite)
669     if (cellule->feuille==1)
670     {
671     cellule->lst_entite_A.supprimer(a);
672     }
673     else
674     {
675     supprimer(boite,a,cellule->fils[0]);
676     supprimer(boite,a,cellule->fils[1]);
677     supprimer(boite,a,cellule->fils[2]);
678     supprimer(boite,a,cellule->fils[3]);
679     supprimer(boite,a,cellule->fils[4]);
680     supprimer(boite,a,cellule->fils[5]);
681     supprimer(boite,a,cellule->fils[6]);
682     supprimer(boite,a,cellule->fils[7]);
683     }
684     };
685    
686     virtual void inserer(A a)
687     {
688     BOITE_3D boite=a->get_boite_3D();
689     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(0);
690     inserer(boite,a,cellule);
691     }
692    
693     virtual void supprimer(A a)
694     {
695     BOITE_3D boite=a->get_boite_3D();
696     TPL_CELLULE_INFO<A ,CONDITION,B>* cellule=lst_entite_cellule.get(0);
697     supprimer(boite,a,cellule);
698     }
699    
700    
701     private:
702     TPL_LISTE_ENTITE<TPL_CELLULE_INFO<A ,CONDITION,B>* > lst_entite_cellule;
703    
704     };
705    
706    
707    
708    
709     #endif