ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/outil/src/tpl_grille.h
Revision: 1024
Committed: Tue Jun 18 22:11:03 2019 UTC (6 years ago) by francois
Content type: text/plain
File size: 18932 byte(s)
Log Message:
bug dans les cartes de tailles echantillonnées . vitesse lente en 2D

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 106 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 5 //------------------------------------------------------------
7 francois 106 // 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 5 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // tpl_grille.h
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 106 // Version du 02/03/2006 � 11H24
21 5 //------------------------------------------------------------
22     //------------------------------------------------------------
23     #ifndef _TPLGRILLE_
24     #define _TPLGRILLE_
25    
26    
27 francois 481 #include "ot_boite_3d.h"
28 5 #include "tpl_liste_entite.h"
29     #include "tpl_map_entite.h"
30    
31     class CELLULE_GRILLE_BASE
32     {
33     public:
34     CELLULE_GRILLE_BASE()
35     {
36     static unsigned long idmax=0;
37     id=idmax;
38     idmax++;
39 francois 106 tag=0;
40 5 };
41    
42     virtual ~CELLULE_GRILLE_BASE() {};
43     virtual BOITE_3D get_boite(void)=0;
44     virtual unsigned long get_id() {return id;};
45 francois 106 virtual int get_tag(void)
46     {
47     return tag;
48     };
49     virtual void change_tag(int val)
50     {
51     tag=val;
52     };
53    
54     private :
55 5 unsigned long id;
56 francois 106 int tag;
57 5 };
58    
59    
60     class GRILLE_BASE
61     {
62     public:
63     GRILLE_BASE() {};
64     virtual ~GRILLE_BASE() {};
65     virtual int get_nb_cellule(void)=0;
66     virtual CELLULE_GRILLE_BASE* get_cellule(int num)=0;
67     };
68    
69    
70     template <class A>
71     class TPL_CELLULE_GRILLE:public CELLULE_GRILLE_BASE
72     {
73     public:
74     TPL_CELLULE_GRILLE(double xmin,double ymin,double zmin,double xmax,double ymax,double zmax):CELLULE_GRILLE_BASE(),boite(xmin,ymin,zmin,xmax,ymax,zmax)
75     {
76     };
77     virtual ~TPL_CELLULE_GRILLE() {};
78     BOITE_3D get_boite(void) {return boite;};
79     BOITE_3D boite;
80     TPL_LISTE_ENTITE<A> lst_entite_A;
81     int get_nb_entite(void)
82     {
83     return lst_entite_A.get_nb();
84     };
85     A get_entite(int num)
86     {
87     return lst_entite_A.get(num);
88     };
89 francois 106
90    
91 5 };
92    
93     template <class A,class B>
94     class TPL_CELLULE_GRILLE_INFO:public CELLULE_GRILLE_BASE
95     {
96     public:
97     TPL_CELLULE_GRILLE_INFO(double xmin,double ymin,double zmin,double xmax,double ymax,double zmax):CELLULE_GRILLE_BASE(),boite(xmin,ymin,zmin,xmax,ymax,zmax)
98     {
99     };
100     virtual ~TPL_CELLULE_GRILLE_INFO() {};
101     BOITE_3D get_boite(void) {return boite;};
102     BOITE_3D boite;
103     TPL_LISTE_ENTITE<A> lst_entite_A;
104     B tab[8];
105     int get_nb_entite(void)
106     {
107     return lst_entite_A.get_nb();
108     };
109     A get_entite(int num)
110     {
111     return lst_entite_A.get(num);
112     };
113    
114     B get_info(int num) {return tab[num];};
115     void change_info(int num,B val) {tab[num]=val;};
116    
117     };
118    
119    
120    
121     template <class A>
122     class TPL_GRILLE:public GRILLE_BASE
123     {
124     public:
125     TPL_GRILLE() {};
126     ~TPL_GRILLE()
127     {
128     for (int i=0;i<lst_entite_cellule.get_nb();i++)
129     {
130     TPL_CELLULE_GRILLE<A>* cellule=lst_entite_cellule.get(i);
131     delete cellule;
132     }
133 francois 106
134    
135    
136 5 };
137    
138     virtual int get_nb_cellule(void) {return lst_entite_cellule.get_nb();};
139    
140     virtual TPL_CELLULE_GRILLE<A>* get_cellule(int num) {return lst_entite_cellule.get(num); };
141    
142    
143     virtual void initialiser(double xmin,double ymin,double zmin,double xmax,double ymax,double zmax,int nb_pasx,int nb_pasy,int nb_pasz)
144     {
145     nbpasx=nb_pasx;
146     nbpasy=nb_pasy;
147     nbpasz=nb_pasz;
148     pasx=(xmax-xmin)/nb_pasx;
149     pasy=(ymax-ymin)/nb_pasy;
150     pasz=(zmax-zmin)/nb_pasz;
151     boite.reinit(xmin,ymin,zmin,xmax,ymax,zmax);
152     for (int k=0;k<nb_pasz;k++)
153     for (int j=0;j<nb_pasy;j++)
154     for (int i=0;i<nb_pasx;i++)
155     {
156     double x1=xmin+i*pasx;
157     double x2=xmin+(i+1)*pasx;
158     double y1=ymin+j*pasy;
159     double y2=ymin+(j+1)*pasy;
160     double z1=zmin+k*pasz;
161     double z2=zmin+(k+1)*pasz;
162     TPL_CELLULE_GRILLE<A>* cellule=new TPL_CELLULE_GRILLE<A>(x1,y1,z1,x2,y2,z2);
163     lst_entite_cellule.ajouter(cellule);
164     }
165    
166     }
167    
168     virtual TPL_CELLULE_GRILLE<A> *get_cellule(double x,double y, double z)
169     {
170     int nx=(int)((x-boite.get_xmin())/pasx);
171     int ny=(int)((y-boite.get_ymin())/pasy);
172     int nz=(int)((z-boite.get_zmin())/pasz);
173     int num=nx+ny*nbpasx+nz*nbpasy*nbpasx;
174     if ((num<0) || (num>=lst_entite_cellule.get_nb()) ) return NULL;
175     return lst_entite_cellule.get(num);
176     };
177    
178     virtual void get_coord_cellule(TPL_CELLULE_GRILLE<A>* cell,int& nx,int& ny,int& nz)
179     {
180     BOITE_3D boitecell=cell->get_boite();
181     double xyz[3];
182     boitecell.get_centre(xyz);
183     nx=(int)((xyz[0]-boite.get_xmin())/pasx);
184     ny=(int)((xyz[1]-boite.get_ymin())/pasy);
185     nz=(int)((xyz[2]-boite.get_zmin())/pasz);
186     };
187    
188    
189     virtual TPL_CELLULE_GRILLE<A> *get_cellule(int nx,int ny,int nz)
190     {
191     if (nx>=nbpasx) return NULL;
192     if (ny>=nbpasy) return NULL;
193     if (nz>=nbpasz) return NULL;
194     if (nx<0) return NULL;
195     if (ny<0) return NULL;
196     if (nz<0) return NULL;
197     int num=nx+ny*nbpasx+nz*nbpasy*nbpasx;
198     if ((num<0) || (num>=lst_entite_cellule.get_nb()) ) return NULL;
199     return lst_entite_cellule.get(num);
200     };
201    
202    
203 francois 674 virtual void rechercher(BOITE_3D bt,TPL_MAP_ENTITE<A>& liste_entite_trouve)
204     {
205     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
206     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
207     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
208     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
209     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
210     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
211 francois 1024 if (nxmin<0) nxmin=0;
212     if (nymin<0) nymin=0;
213     if (nzmin<0) nzmin=0;
214     if (nxmin>nbpasx-1) nxmin=0;
215     if (nymin>nbpasy-1) nymin=0;
216     if (nzmin>nbpasz-1) nzmin=0;
217     if (nxmax<0) nxmax=nbpasx-1;
218     if (nymax<0) nymax=nbpasy-1;
219     if (nzmax<0) nzmax=nbpasz-1;
220     if (nxmax>nbpasx-1) nxmax=nbpasx-1;
221     if (nymax>nbpasy-1) nymax=nbpasy-1;
222     if (nzmax>nbpasz-1) nzmax=nbpasz-1;
223 francois 674 for (int i=nxmin;i<nxmax+1;i++)
224     for (int j=nymin;j<nymax+1;j++)
225     for (int k=nzmin;k<nzmax+1;k++)
226     {
227     /*int num=i+j*nbpasx+k*nbpasy*nbpasx;
228     if ((num<0) || (num>=lst_entite_cellule.get_nb())) continue;
229     TPL_CELLULE_GRILLE<A>* cellule=lst_entite_cellule.get(num);*/
230     TPL_CELLULE_GRILLE<A>* cellule=get_cellule(i,j,k);
231     if (cellule==NULL) continue;
232     for (int ii=0;ii<cellule->lst_entite_A.get_nb();ii++)
233 francois 945 if (bt*cellule->lst_entite_A.get(ii)->get_boite_3D())
234 francois 674 liste_entite_trouve.ajouter(cellule->lst_entite_A.get(ii));
235     }
236     };
237 5
238     virtual void rechercher(double xcentre,double ycentre,double zcentre,double rayon_recherche,TPL_MAP_ENTITE<A>& liste_entite_trouve)
239     {
240     BOITE_3D bt(xcentre-rayon_recherche,ycentre-rayon_recherche,zcentre-rayon_recherche,xcentre+rayon_recherche,ycentre+rayon_recherche,zcentre+rayon_recherche);
241     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
242     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
243     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
244     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
245     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
246     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
247 francois 1024 if (nxmin<0) nxmin=0;
248     if (nymin<0) nymin=0;
249     if (nzmin<0) nzmin=0;
250     if (nxmin>nbpasx-1) nxmin=0;
251     if (nymin>nbpasy-1) nymin=0;
252     if (nzmin>nbpasz-1) nzmin=0;
253     if (nxmax<0) nxmax=nbpasx-1;
254     if (nymax<0) nymax=nbpasy-1;
255     if (nzmax<0) nzmax=nbpasz-1;
256     if (nxmax>nbpasx-1) nxmax=nbpasx-1;
257     if (nymax>nbpasy-1) nymax=nbpasy-1;
258     if (nzmax>nbpasz-1) nzmax=nbpasz-1;
259 5 for (int i=nxmin;i<nxmax+1;i++)
260     for (int j=nymin;j<nymax+1;j++)
261     for (int k=nzmin;k<nzmax+1;k++)
262     {
263     /*int num=i+j*nbpasx+k*nbpasy*nbpasx;
264     if ((num<0) || (num>=lst_entite_cellule.get_nb())) continue;
265     TPL_CELLULE_GRILLE<A>* cellule=lst_entite_cellule.get(num);*/
266     TPL_CELLULE_GRILLE<A>* cellule=get_cellule(i,j,k);
267     if (cellule==NULL) continue;
268     for (int ii=0;ii<cellule->lst_entite_A.get_nb();ii++)
269 francois 945 if (bt*cellule->lst_entite_A.get(ii)->get_boite_3D())
270     liste_entite_trouve.ajouter(cellule->lst_entite_A.get(ii));
271 5 }
272     };
273    
274    
275     virtual void inserer(A a)
276     {
277     BOITE_3D bt=a->get_boite_3D();
278     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
279     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
280     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
281     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
282     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
283     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
284 francois 1024 if (nxmin<0) nxmin=0;
285     if (nymin<0) nymin=0;
286     if (nzmin<0) nzmin=0;
287     if (nxmin>nbpasx-1) nxmin=0;
288     if (nymin>nbpasy-1) nymin=0;
289     if (nzmin>nbpasz-1) nzmin=0;
290     if (nxmax<0) nxmax=nbpasx-1;
291     if (nymax<0) nymax=nbpasy-1;
292     if (nzmax<0) nzmax=nbpasz-1;
293     if (nxmax>nbpasx-1) nxmax=nbpasx-1;
294     if (nymax>nbpasy-1) nymax=nbpasy-1;
295     if (nzmax>nbpasz-1) nzmax=nbpasz-1;
296    
297 5 for (int i=nxmin;i<nxmax+1;i++)
298     for (int j=nymin;j<nymax+1;j++)
299     for (int k=nzmin;k<nzmax+1;k++)
300     {
301     //int num=i+j*nbpasx+k*nbpasy*nbpasx;
302     TPL_CELLULE_GRILLE<A>* cellule=get_cellule(i,j,k);
303     if (cellule==NULL) continue;
304     cellule->lst_entite_A.ajouter(a);
305     }
306     }
307    
308     virtual void supprimer(A a)
309     {
310     BOITE_3D bt=a->get_boite_3D();
311     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
312     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
313     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
314     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
315     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
316     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
317 francois 1024 nxmin=std::max(nxmin,0);
318     nymin=std::max(nymin,0);
319     nzmin=std::max(nzmin,0);
320     nxmax=std::min(nxmax,nbpasx-1);
321     nymax=std::min(nymax,nbpasy-1);
322     nzmax=std::min(nzmax,nbpasz-1);
323 5 for (int i=nxmin;i<nxmax+1;i++)
324     for (int j=nymin;j<nymax+1;j++)
325     for (int k=nzmin;k<nzmax+1;k++)
326     {
327     //int num=i+j*nbpasx+k*nbpasy*nbpasx;
328     TPL_CELLULE_GRILLE<A>* cellule=get_cellule(i,j,k);
329     if (cellule==NULL) continue;
330     cellule->lst_entite_A.supprimer(a);
331     }
332     }
333    
334     virtual BOITE_3D get_boite(void)
335     {
336     return boite;
337     }
338    
339     virtual int get_pasx(void)
340     {
341     return nbpasx;
342     }
343    
344     virtual int get_pasy(void)
345     {
346     return nbpasy;
347     }
348    
349     virtual int get_pasz(void)
350     {
351     return nbpasz;
352     }
353    
354 francois 106
355 5 private:
356     TPL_LISTE_ENTITE<TPL_CELLULE_GRILLE<A>* > lst_entite_cellule;
357     double pasx;
358     double pasy;
359     double pasz;
360     int nbpasx;
361     int nbpasy;
362     int nbpasz;
363     BOITE_3D boite;
364     };
365    
366    
367    
368     template <class A,class B>
369     class TPL_GRILLE_INFO:public GRILLE_BASE
370     {
371     public:
372     TPL_GRILLE_INFO() {};
373     ~TPL_GRILLE_INFO()
374     {
375     for (int i=0;i<lst_entite_cellule.get_nb();i++)
376     {
377     TPL_CELLULE_GRILLE_INFO<A,B>* cellule=lst_entite_cellule.get(i);
378     delete cellule;
379     }
380     };
381    
382     virtual int get_nb_cellule(void) {return lst_entite_cellule.get_nb();};
383    
384    
385    
386     virtual TPL_CELLULE_GRILLE_INFO<A,B>* get_cellule(int num) {return lst_entite_cellule.get(num); };
387    
388    
389     virtual void initialiser(double xmin,double ymin,double zmin,double xmax,double ymax,double zmax,int nb_pasx,int nb_pasy,int nb_pasz)
390     {
391     nbpasx=nb_pasx;
392     nbpasy=nb_pasy;
393     nbpasz=nb_pasz;
394     pasx=(xmax-xmin)/nb_pasx;
395     pasy=(ymax-ymin)/nb_pasy;
396     pasz=(zmax-zmin)/nb_pasz;
397     boite.reinit(xmin,ymin,zmin,xmax,ymax,zmax);
398     for (int k=0;k<nb_pasz;k++)
399     for (int j=0;j<nb_pasy;j++)
400     for (int i=0;i<nb_pasx;i++)
401     {
402     double x1=xmin+i*pasx;
403     double x2=xmin+(i+1)*pasx;
404     double y1=ymin+j*pasy;
405     double y2=ymin+(j+1)*pasy;
406     double z1=zmin+k*pasz;
407     double z2=zmin+(k+1)*pasz;
408     TPL_CELLULE_GRILLE_INFO<A,B>* cellule=new TPL_CELLULE_GRILLE_INFO<A,B>(x1,y1,z1,x2,y2,z2);
409     lst_entite_cellule.ajouter(cellule);
410     }
411    
412     }
413    
414     virtual TPL_CELLULE_GRILLE_INFO<A,B> *get_cellule(double x,double y, double z)
415     {
416     int nx=(int)((x-boite.get_xmin())/pasx);
417     int ny=(int)((y-boite.get_ymin())/pasy);
418     int nz=(int)((z-boite.get_zmin())/pasz);
419     int num=nx+ny*nbpasx+nz*nbpasy*nbpasx;
420     if ((num<0) || (num>=lst_entite_cellule.get_nb()) ) return NULL;
421     return lst_entite_cellule.get(num);
422     };
423    
424     virtual void get_coord_cellule(TPL_CELLULE_GRILLE_INFO<A,B>* cell,int& nx,int& ny,int& nz)
425     {
426     BOITE_3D boitecell=cell->get_boite();
427     double xyz[3];
428     boitecell.get_centre(xyz);
429     nx=(int)((xyz[0]-boite.get_xmin())/pasx);
430     ny=(int)((xyz[1]-boite.get_ymin())/pasy);
431     nz=(int)((xyz[2]-boite.get_zmin())/pasz);
432     };
433    
434    
435     virtual TPL_CELLULE_GRILLE_INFO<A,B> *get_cellule(int nx,int ny,int nz)
436     {
437     if (nx>=nbpasx) return NULL;
438     if (ny>=nbpasy) return NULL;
439     if (nz>=nbpasz) return NULL;
440     if (nx<0) return NULL;
441     if (ny<0) return NULL;
442     if (nz<0) return NULL;
443     int num=nx+ny*nbpasx+nz*nbpasy*nbpasx;
444     if ((num<0) || (num>=lst_entite_cellule.get_nb()) ) return NULL;
445     return lst_entite_cellule.get(num);
446     };
447    
448    
449     virtual void rechercher(double xcentre,double ycentre,double zcentre,double rayon_recherche,TPL_MAP_ENTITE<A>& liste_entite_trouve)
450     {
451     BOITE_3D bt(xcentre-rayon_recherche,ycentre-rayon_recherche,zcentre-rayon_recherche,xcentre+rayon_recherche,ycentre+rayon_recherche,zcentre+rayon_recherche);
452     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
453     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
454     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
455     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
456     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
457     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
458 francois 1024 nxmin=std::max(nxmin,0);
459     nymin=std::max(nymin,0);
460     nzmin=std::max(nzmin,0);
461     nxmax=std::min(nxmax,nbpasx-1);
462     nymax=std::min(nymax,nbpasy-1);
463     nzmax=std::min(nzmax,nbpasz-1);
464 5 for (int i=nxmin;i<nxmax+1;i++)
465     for (int j=nymin;j<nymax+1;j++)
466     for (int k=nzmin;k<nzmax+1;k++)
467     {
468     //int num=i+j*nbpasx+k*nbpasy*nbpasx;
469     //if ((num<0) || (num>=lst_entite_cellule.get_nb())) continue;
470     //TPL_CELLULE_GRILLE_INFO<A,B>* cellule=lst_entite_cellule.get(num);
471     TPL_CELLULE_GRILLE_INFO<A,B>* cellule=get_cellule(i,j,k);
472     if (cellule==NULL) continue;
473     for (int ii=0;ii<cellule->lst_entite_A.get_nb();ii++)
474 francois 945 if (bt*cellule->lst_entite_A.get(ii)->get_boite_3D())
475     liste_entite_trouve.ajouter(cellule->lst_entite_A.get(ii));
476 5 }
477    
478     };
479    
480    
481     virtual void inserer(A a)
482     {
483     BOITE_3D bt=a->get_boite_3D();
484     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
485     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
486     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
487     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
488     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
489     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
490 francois 1024 if (nxmin<0) nxmin=0;
491     if (nymin<0) nymin=0;
492     if (nzmin<0) nzmin=0;
493     if (nxmin>nbpasx-1) nxmin=0;
494     if (nymin>nbpasy-1) nymin=0;
495     if (nzmin>nbpasz-1) nzmin=0;
496     if (nxmax<0) nxmax=nbpasx-1;
497     if (nymax<0) nymax=nbpasy-1;
498     if (nzmax<0) nzmax=nbpasz-1;
499     if (nxmax>nbpasx-1) nxmax=nbpasx-1;
500     if (nymax>nbpasy-1) nymax=nbpasy-1;
501     if (nzmax>nbpasz-1) nzmax=nbpasz-1;
502 5 for (int i=nxmin;i<nxmax+1;i++)
503     for (int j=nymin;j<nymax+1;j++)
504     for (int k=nzmin;k<nzmax+1;k++)
505     {
506     //int num=i+j*nbpasx+k*nbpasy*nbpasx;
507     TPL_CELLULE_GRILLE_INFO<A,B>* cellule=get_cellule(i,j,k);
508     if (cellule==NULL) continue;
509     cellule->lst_entite_A.ajouter(a);
510     }
511     }
512    
513     virtual void supprimer(A a)
514     {
515     BOITE_3D bt=a->get_boite_3D();
516     int nxmin=(int)((bt.get_xmin()-boite.get_xmin())/pasx);
517     int nymin=(int)((bt.get_ymin()-boite.get_ymin())/pasy);
518     int nzmin=(int)((bt.get_zmin()-boite.get_zmin())/pasz);
519     int nxmax=(int)((bt.get_xmax()-boite.get_xmin())/pasx);
520     int nymax=(int)((bt.get_ymax()-boite.get_ymin())/pasy);
521     int nzmax=(int)((bt.get_zmax()-boite.get_zmin())/pasz);
522 francois 1024 if (nxmin<0) nxmin=0;
523     if (nymin<0) nymin=0;
524     if (nzmin<0) nzmin=0;
525     if (nxmin>nbpasx-1) nxmin=0;
526     if (nymin>nbpasy-1) nymin=0;
527     if (nzmin>nbpasz-1) nzmin=0;
528     if (nxmax<0) nxmax=nbpasx-1;
529     if (nymax<0) nymax=nbpasy-1;
530     if (nzmax<0) nzmax=nbpasz-1;
531     if (nxmax>nbpasx-1) nxmax=nbpasx-1;
532     if (nymax>nbpasy-1) nymax=nbpasy-1;
533     if (nzmax>nbpasz-1) nzmax=nbpasz-1;
534 5 for (int i=nxmin;i<nxmax+1;i++)
535     for (int j=nymin;j<nymax+1;j++)
536     for (int k=nzmin;k<nzmax+1;k++)
537     {
538     //int num=i+j*nbpasx+k*nbpasy*nbpasx;
539     TPL_CELLULE_GRILLE_INFO<A,B>* cellule=get_cellule(i,j,k);
540     if (cellule==NULL) continue;
541     cellule->lst_entite_A.supprimer(a);
542     }
543     }
544    
545     virtual BOITE_3D get_boite(void)
546     {
547     return boite;
548     }
549    
550     virtual int get_pasx(void)
551     {
552     return nbpasx;
553     }
554    
555     virtual int get_pasy(void)
556     {
557     return nbpasy;
558     }
559    
560     virtual int get_pasz(void)
561     {
562     return nbpasz;
563     }
564    
565 francois 106
566     virtual unsigned long determine_keycode(int nx,int ny,int nz)
567     {
568 francois 295 std::vector<int> bits;
569 francois 106 int ok=0,i=0;
570     do
571     {
572     int nnz=nz>>i;
573     int nny=ny>>i;
574     int nnx=nx>>i;
575     int bit1= nnz & 1;
576     int bit2= nny & 1;
577     int bit3= nnx & 1;
578     if ((nnz==0) && (nny==0) && (nnx==0)) ok=1;
579     bits.insert(bits.end(),bit1);
580     bits.insert(bits.end(),bit2);
581     bits.insert(bits.end(),bit3);
582     i++;
583     }
584     while (ok==0);
585     unsigned long keycode=0;
586     for (int i=0;i<bits.size();i++)
587     keycode=keycode+bits[i]*(1<<i);
588     return keycode;
589     }
590    
591 5 private:
592     TPL_LISTE_ENTITE<TPL_CELLULE_GRILLE_INFO<A,B>* > lst_entite_cellule;
593     double pasx;
594     double pasy;
595     double pasz;
596     int nbpasx;
597     int nbpasy;
598     int nbpasz;
599     BOITE_3D boite;
600     };
601    
602    
603    
604    
605    
606    
607     #endif