45 std::vector<int> bits;
55 if ((nnz==0) && (nny==0) && (nnx==0)) ok=1;
56 bits.insert(bits.end(),bit1);
57 bits.insert(bits.end(),bit2);
58 bits.insert(bits.end(),bit3);
62 unsigned long keycode=0;
63 for (
int i=0;i<bits.size();i++)
64 keycode=keycode+bits[i]*(1<<i);
73 {
true,
true,
true,
true,
false,
false,
false,
false},
74 {
true,
true,
false,
false,
true,
true,
false,
false},
75 {
false,
true,
false,
true,
false,
true,
false,
true},
76 {
false,
false,
true,
true,
false,
false,
true,
true},
77 {
true,
false,
true,
false,
true,
false,
true,
false},
78 {
false,
false,
false,
false,
true,
true,
true,
true},
79 {
true,
true,
false,
false,
false,
false,
false,
false},
80 {
true,
false,
true,
false,
false,
false,
false,
false},
81 {
true,
false,
false,
false,
true,
false,
false,
false},
82 {
false,
true,
false,
true,
false,
false,
false,
false},
83 {
false,
true,
false,
false,
false,
true,
false,
false},
84 {
false,
false,
true,
true,
false,
false,
false,
false},
85 {
false,
false,
false,
true,
false,
false,
false,
true},
86 {
false,
false,
true,
false,
false,
false,
true,
false},
87 {
false,
false,
false,
false,
true,
true,
false,
false},
88 {
false,
false,
false,
false,
true,
false,
true,
false},
89 {
false,
false,
false,
false,
false,
true,
false,
true},
90 {
false,
false,
false,
false,
false,
false,
true,
true},
94 return tabadj[direction][octant];
100 int tabreflect[18][8]=
102 {4, 5, 6, 7, 0, 1, 2, 3},
103 {2, 3, 0, 1, 6, 7, 4, 5},
104 {1, 0, 3, 2, 5, 4, 7, 6},
105 {2, 3, 0, 1, 6, 7, 4, 5},
106 {1, 0, 3, 2, 5, 4, 7, 6},
107 {4, 5, 6, 7, 0, 1, 2, 3},
108 {6, 7, 4, 5, 2, 3, 0, 1},
109 {5, 4, 7, 6, 1, 0, 3, 2},
110 {3, 2, 1, 0, 7, 6, 5, 4},
111 {5, 4, 7, 6, 1, 0, 3, 2},
112 {3, 2, 1, 0, 7, 6, 5, 4},
113 {6, 7, 4, 5, 2, 3, 0, 1},
114 {3, 2, 1, 0, 7, 6, 5, 4},
115 {3, 2, 1, 0, 7, 6, 5, 4},
116 {6, 7, 4, 5, 2, 3, 0, 1},
117 {5, 4, 7, 6, 1, 0, 3, 2},
118 {5, 4, 7, 6, 1, 0, 3, 2},
119 {6, 7, 4, 5, 2, 3, 0, 1}
123 return tabreflect[direction][octant];
130 int tabcommonface[12][8]=
132 {-1, -1, 0, 0, 1, 1, -1, -1},
133 {-1, 0, -1, 0, 4, -1, 4, -1},
134 {-1, 1, 4, -1, -1, 1, 4, -1},
135 {0, -1, 0, -1, -1, 2, -1, 2},
136 {1, -1, -1, 2, 1, -1, -1, 2},
137 {0, 0, -1, -1, -1, -1, 3, 3},
138 {-1, 2, 3, -1, -1, 2, 3, -1},
139 {4, -1, -1, 3, 4, -1, -1, 3},
140 {1, 1, -1, -1, -1, -1, 5, 5},
141 {4, -1, 4, -1, -1, 5, -1, 5},
142 {-1, 2, -1, 2, 5, -1, 5, -1},
143 {-1, -1, 3, 3, 5, 5, -1, -1},
145 return tabcommonface[direction-6][octant];
160 return tab[direction][numvoisin];
174 return tab[numface][numsommet];
194 return tab[numarete-6][numsommet];
212 return tab[numface][numarete];
226 return tab[numface][numarete];
239 static unsigned long idmax=0;
266 template <
class A,
class CONDITION>
270 TPL_CELLULE_OCTREE(
TPL_CELLULE_OCTREE<A,CONDITION> *cell,
double xmin,
double ymin,
double zmin,
double xmax,
double ymax,
double zmax,
int niv,
int st):
CELLULE_OCTREE_BASE(),
boite(xmin,ymin,zmin,xmax,ymax,zmax),
niveau(niv),
pere(cell),
sontype(st)
310 template <
class A,
class CONDITION,
class B>
314 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)
343 template <
class A,
class CONDITION>
368 TPL_CELLULE_OCTREE<A ,CONDITION>* root_cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(NULL,xmin,ymin,zmin,xmax,ymax,zmax,0,-1);
370 for (
int i=0;i<lst_entite->
get_nb();i++)
372 CONDITION cond=lst_entite->
get(i);
373 BOITE_3D boite_cond=cond->get_boite_3D();
382 root_cellule->
fils[0]=
cree_fils(root_cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,0);
383 root_cellule->
fils[1]=
cree_fils(root_cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,1);
384 root_cellule->
fils[2]=
cree_fils(root_cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,2);
385 root_cellule->
fils[3]=
cree_fils(root_cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,3);
386 root_cellule->
fils[4]=
cree_fils(root_cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,4);
387 root_cellule->
fils[5]=
cree_fils(root_cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,5);
388 root_cellule->
fils[6]=
cree_fils(root_cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,6);
389 root_cellule->
fils[7]=
cree_fils(root_cellule,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,7);
401 TPL_CELLULE_OCTREE<A ,CONDITION>* root_cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(NULL,xmin,ymin,zmin,xmax,ymax,zmax,0,-1);
406 BOITE_3D boite_cond=cond->get_boite_3D();
415 root_cellule->
fils[0]=
cree_fils(root_cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,0);
416 root_cellule->
fils[1]=
cree_fils(root_cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,1);
417 root_cellule->
fils[2]=
cree_fils(root_cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,2);
418 root_cellule->
fils[3]=
cree_fils(root_cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,3);
419 root_cellule->
fils[4]=
cree_fils(root_cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,4);
420 root_cellule->
fils[5]=
cree_fils(root_cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,5);
421 root_cellule->
fils[6]=
cree_fils(root_cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,6);
422 root_cellule->
fils[7]=
cree_fils(root_cellule,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,7);
434 TPL_CELLULE_OCTREE<A ,CONDITION>* root_cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(NULL,xmin,ymin,zmin,xmax,ymax,zmax,0,-1);
436 for (
int i=0;i<lst_entite->
get_nb();i++)
438 CONDITION cond=lst_entite->
get(i);
439 BOITE_3D boite_cond=cond->get_boite_3D();
448 if (dimanepasdecouper==3)
450 root_cellule->
fils[0]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz,&(root_cellule->
lst_entite_CONDITION),nombre,1,0);
451 root_cellule->
fils[1]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz,&(root_cellule->
lst_entite_CONDITION),nombre,1,1);
452 root_cellule->
fils[2]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz,&(root_cellule->
lst_entite_CONDITION),nombre,1,2);
453 root_cellule->
fils[3]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz,&(root_cellule->
lst_entite_CONDITION),nombre,1,3);
455 if (dimanepasdecouper==2)
457 root_cellule->
fils[0]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin,zmin,dx/2.,dy,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,0);
458 root_cellule->
fils[1]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,1);
459 root_cellule->
fils[4]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,4);
460 root_cellule->
fils[5]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,5);
462 if (dimanepasdecouper==1)
464 root_cellule->
fils[0]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin,zmin,dx,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,0);
465 root_cellule->
fils[2]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin+dy/2.,zmin,dx,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,2);
466 root_cellule->
fils[4]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin,zmin+dz/2.,dx,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,4);
467 root_cellule->
fils[6]=
cree_fils2D(dimanepasdecouper,root_cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx,dy/2.,dz/2.,&(root_cellule->
lst_entite_CONDITION),nombre,1,6);
487 TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(NULL,xmin,ymin,zmin,xmax,ymax,zmax,0,oc->
get_cellule(0)->
get_sontype());
515 TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(cell,xmin,ymin,zmin,xmax,ymax,zmax,cellule_base->
get_niveau(),st);
537 virtual TPL_CELLULE_OCTREE<A ,CONDITION>*
cree_fils(
TPL_CELLULE_OCTREE<A ,CONDITION>* cell,
double xmin,
double ymin,
double zmin,
double dx,
double dy,
double dz,
TPL_LISTE_ENTITE<CONDITION>* lst_entite,
int nombre,
int niv,
int st)
539 TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(cell,xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz,niv,st);
542 for (
int i=0;i<lst_entite->
get_nb();i++)
544 CONDITION cond=lst_entite->
get(i);
545 BOITE_3D boite_cond=cond->get_boite_3D();
551 cellule->
fils[0]=
cree_fils(cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,0);
552 cellule->
fils[1]=
cree_fils(cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,1);
553 cellule->
fils[2]=
cree_fils(cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,2);
554 cellule->
fils[3]=
cree_fils(cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,3);
555 cellule->
fils[4]=
cree_fils(cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,4);
556 cellule->
fils[5]=
cree_fils(cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,5);
557 cellule->
fils[6]=
cree_fils(cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,6);
558 cellule->
fils[7]=
cree_fils(cellule,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,7);
564 virtual TPL_CELLULE_OCTREE<A ,CONDITION>*
cree_fils2D(
int dimanepasdecouper,
TPL_CELLULE_OCTREE<A ,CONDITION>* cell,
double xmin,
double ymin,
double zmin,
double dx,
double dy,
double dz,
TPL_LISTE_ENTITE<CONDITION>* lst_entite,
int nombre,
int niv,
int st)
566 TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(cell,xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz,niv,st);
570 for (
int i=0;i<lst_entite->
get_nb();i++)
572 CONDITION cond=lst_entite->
get(i);
573 BOITE_3D boite_cond=cond->get_boite_3D();
579 if (dimanepasdecouper==3)
581 cellule->
fils[0]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz,&(cellule->
lst_entite_CONDITION),nombre,niv+1,0);
582 cellule->
fils[1]=
cree_fils2D(dimanepasdecouper,cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz,&(cellule->
lst_entite_CONDITION),nombre,niv+1,1);
583 cellule->
fils[2]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz,&(cellule->
lst_entite_CONDITION),nombre,niv+1,2);
584 cellule->
fils[3]=
cree_fils2D(dimanepasdecouper,cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz,&(cellule->
lst_entite_CONDITION),nombre,niv+1,3);
586 if (dimanepasdecouper==2)
588 cellule->
fils[0]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin,zmin,dx/2.,dy,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,0);
589 cellule->
fils[1]=
cree_fils2D(dimanepasdecouper,cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,1);
590 cellule->
fils[4]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,4);
591 cellule->
fils[5]=
cree_fils2D(dimanepasdecouper,cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,5);
593 if (dimanepasdecouper==1)
595 cellule->
fils[0]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin,zmin,dx,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,0);
596 cellule->
fils[2]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin+dy/2.,zmin,dx,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,2);
597 cellule->
fils[4]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin,zmin+dz/2.,dx,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,4);
598 cellule->
fils[6]=
cree_fils2D(dimanepasdecouper,cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx,dy/2.,dz/2.,&(cellule->
lst_entite_CONDITION),nombre,niv+1,6);
608 if (cellule==NULL)
return;
609 if (boite*cellule->
boite)
632 if (boite*cellule->
boite)
635 liste_entite.ajouter(cellule);
654 if (cellule->
pere==NULL) cellule2=NULL;
657 else cellule2=cellule->
pere;
671 cellule2=cellule->
pere;
686 if (cellule2!=NULL) lst->insert(lst->end(),cellule2);
688 while (i<lst->size())
700 typename std::vector<TPL_CELLULE_OCTREE<A,CONDITION> * >::iterator j=lst->end();
701 while (j!=lst->begin())
717 if (liste_cellule.
get_nb()==1)
return liste_cellule.
get(0);
744 double somx=x,somy=y,somz=z;
745 if (numsommet==1) somx=xx;
746 if (numsommet==2) {somx=xx;somy=yy;}
747 if (numsommet==3) somy=yy;
748 if (numsommet==4) somz=zz;
749 if (numsommet==5) {somx=xx;somz=zz;}
750 if (numsommet==6) {somx=xx;somy=yy;somz=zz;}
751 if (numsommet==7) {somy=yy;somz=zz;}
780 if (numsommet==1) x=xx;
781 if (numsommet==2) {x=xx;y=yy;}
782 if (numsommet==3) y=yy;
783 if (numsommet==4) z=zz;
784 if (numsommet==5) {x=xx;z=zz;}
785 if (numsommet==6) {x=xx;y=yy;z=zz;}
786 if (numsommet==7) {y=yy;z=zz;}
798 if (numsommet==1) x=xx;
799 if (numsommet==2) {x=xx;y=yy;}
800 if (numsommet==3) y=yy;
801 if (numsommet==4) z=zz;
802 if (numsommet==5) {x=xx;z=zz;}
803 if (numsommet==6) {x=xx;y=yy;z=zz;}
804 if (numsommet==7) {y=yy;z=zz;}
815 std::vector< TPL_CELLULE_OCTREE<A,CONDITION> *> lstraf;
819 int niveaumaxvoisin=0;
820 for (
int j=0;j<6;j++)
822 std::vector< TPL_CELLULE_OCTREE<A,CONDITION> *> lstvoi;
824 int nb_feuille=lstvoi.size();
825 for (
int k=0;k<nb_feuille;k++)
827 int niveau=lstvoi[k]->get_niveau();
828 if (niveau>niveaumaxvoisin) niveaumaxvoisin=niveau;
832 if (niveaumaxvoisin-feuille->
get_niveau()>niveauequilibre) {lstraf.insert(lstraf.end(),feuille);feuille->
feuille=niveaumaxvoisin-niveauequilibre;}
834 int nbcelluleraffiner=lstraf.size();
835 for (
int i=0;i<nbcelluleraffiner;i++)
839 int niveauatteindre=cell->
feuille;
849 cell->
fils[0]=
cree_fils(cell,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,0);
850 cell->
fils[1]=
cree_fils(cell,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,1);
851 cell->
fils[2]=
cree_fils(cell,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,2);
852 cell->
fils[3]=
cree_fils(cell,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,3);
853 cell->
fils[4]=
cree_fils(cell,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,4);
854 cell->
fils[5]=
cree_fils(cell,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,5);
855 cell->
fils[6]=
cree_fils(cell,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,6);
856 cell->
fils[7]=
cree_fils(cell,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niveau+1,niveauatteindre,7);
859 if (nbfeuilleapres==nbfeuilleavant) ok=1;
866 virtual TPL_CELLULE_OCTREE<A ,CONDITION>*
cree_fils(
TPL_CELLULE_OCTREE<A ,CONDITION>* cell,
double xmin,
double ymin,
double zmin,
double dx,
double dy,
double dz,
int niv,
int niveauatteindre,
int st)
868 TPL_CELLULE_OCTREE<A ,CONDITION>* cellule=
new TPL_CELLULE_OCTREE<A ,CONDITION>(cell,xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz,niv,st);
874 cellule->
fils[0]=
cree_fils(cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,0);
875 cellule->
fils[1]=
cree_fils(cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,1);
876 cellule->
fils[2]=
cree_fils(cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,2);
877 cellule->
fils[3]=
cree_fils(cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,3);
878 cellule->
fils[4]=
cree_fils(cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,4);
879 cellule->
fils[5]=
cree_fils(cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,5);
880 cellule->
fils[6]=
cree_fils(cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,6);
881 cellule->
fils[7]=
cree_fils(cellule,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,niv+1,niveauatteindre,7);
890 BOITE_3D boite(xcentre-rayon_recherche,ycentre-rayon_recherche,zcentre-rayon_recherche,xcentre+rayon_recherche,ycentre+rayon_recherche,zcentre+rayon_recherche);
892 rechercher(boite,liste_entite_trouve,cellule);
899 if (cellule==NULL)
return;
900 if (boite*cellule->
boite)
920 if (cellule==NULL)
return;
921 if (boite*cellule->
boite)
1001 return sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y)+(zz-z)*(zz-z)) ;
1014 template <
class A,
class B>
1027 virtual void initialiser(B &fonction,
double xmin,
double ymin,
double zmin,
double xmax,
double ymax,
double zmax)
1029 TPL_CELLULE_OCTREE<A ,A>* root_cellule=
new TPL_CELLULE_OCTREE<A ,A>(NULL,xmin,ymin,zmin,xmax,ymax,zmax,0,-1);
1040 fonction.evaluer(xyz,ecart);
1045 root_cellule->
fils[0]=
cree_fils(root_cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,fonction,1,0);
1046 root_cellule->
fils[1]=
cree_fils(root_cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,fonction,1,1);
1047 root_cellule->
fils[2]=
cree_fils(root_cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,fonction,1,2);
1048 root_cellule->
fils[3]=
cree_fils(root_cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,fonction,1,3);
1049 root_cellule->
fils[4]=
cree_fils(root_cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,1,4);
1050 root_cellule->
fils[5]=
cree_fils(root_cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,1,5);
1051 root_cellule->
fils[6]=
cree_fils(root_cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,1,6);
1052 root_cellule->
fils[7]=
cree_fils(root_cellule,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,1,7);
1057 virtual TPL_CELLULE_OCTREE<A ,A>*
cree_fils(
TPL_CELLULE_OCTREE<A ,A>* cell,
double xmin,
double ymin,
double zmin,
double dx,
double dy,
double dz,B &fonction,
int niv,
int st)
1059 TPL_CELLULE_OCTREE<A ,A>* cellule=
new TPL_CELLULE_OCTREE<A ,A>(cell,xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz,niv,st);
1071 fonction.evaluer(xyz,ecart);
1076 cellule->
fils[0]=
cree_fils(cellule,xmin,ymin,zmin,dx/2.,dy/2.,dz/2.,fonction,niv+1,0);
1077 cellule->
fils[1]=
cree_fils(cellule,xmin+dx/2.,ymin,zmin,dx/2.,dy/2.,dz/2.,fonction,niv+1,1);
1078 cellule->
fils[2]=
cree_fils(cellule,xmin,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,fonction,niv+1,2);
1079 cellule->
fils[3]=
cree_fils(cellule,xmin+dx/2.,ymin+dy/2.,zmin,dx/2.,dy/2.,dz/2.,fonction,niv+1,3);
1080 cellule->
fils[4]=
cree_fils(cellule,xmin,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,niv+1,4);
1081 cellule->
fils[5]=
cree_fils(cellule,xmin+dx/2.,ymin,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,niv+1,5);
1082 cellule->
fils[6]=
cree_fils(cellule,xmin,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,niv+1,6);
1083 cellule->
fils[7]=
cree_fils(cellule,xmin+dx/2.,ymin+dy/2.,zmin+dz/2.,dx/2.,dy/2.,dz/2.,fonction,niv+1,7);
1091 template <
class A,
class B>
1104 virtual void initialiser(B &fonction,
double xmin,
double ymin,
double zmin,
double xmax,
double ymax,
double zmax)
1106 TPL_CELLULE_OCTREE<A ,A>* root_cellule=
new TPL_CELLULE_OCTREE<A ,A>(NULL,xmin,ymin,zmin,xmax,ymax,zmax,0,-1);
1114 fonction.evaluer(xyz,ecart);
1116 int ndivx=2,ndivy=2,ndivz=2;
1117 if (dcible>dx) ndivx=1;
1118 if (dcible>dy) ndivy=1;
1119 if (dcible>dz) ndivz=1;
1120 if (ndivx*ndivy*ndivz!=1)
1123 for (
int i=0;i<ndivx;i++)
1124 for (
int j=0;j<ndivy;j++)
1125 for (
int k=0;k<ndivz;k++)
1126 root_cellule->
fils[((i*ndivx)+j)*ndivy+k]=
cree_fils(root_cellule,xmin+i*1.0/ndivx*dx,ymin+j*1.0/ndivy*dy,zmin+k*1.0/ndivz*dz,dx*1./ndivx,dy*1./ndivy,dz*1./ndivz,fonction,1,0);
1131 virtual TPL_CELLULE_OCTREE<A ,A>*
cree_fils(
TPL_CELLULE_OCTREE<A ,A>* cell,
double xmin,
double ymin,
double zmin,
double dx,
double dy,
double dz,B &fonction,
int niv,
int st)
1133 TPL_CELLULE_OCTREE<A ,A>* cellule=
new TPL_CELLULE_OCTREE<A ,A>(cell,xmin,ymin,zmin,xmin+dx,ymin+dy,zmin+dz,niv,st);
1142 fonction.evaluer(xyz,ecart);
1144 int ndivx=2,ndivy=2,ndivz=2;
1145 if (dcible>dx) ndivx=1;
1146 if (dcible>dy) ndivy=1;
1147 if (dcible>dz) ndivz=1;
1148 if (ndivx*ndivy*ndivz!=1)
1151 for (
int i=0;i<ndivx;i++)
1152 for (
int j=0;j<ndivy;j++)
1153 for (
int k=0;k<ndivz;k++)
1154 cellule->
fils[((i*ndivx)+j)*ndivy+k]=
cree_fils(cellule,xmin+i*1.0/ndivx*dx,ymin+j*1.0/ndivy*dy,zmin+k*1.0/ndivz*dz,dx*1./ndivx,dy*1./ndivy,dz*1./ndivz,fonction,1,0);
1169 template <
class A,
class CONDITION,
class B>
1194 for (
int i=0;i<lst_entite->
get_nb();i++)
1196 CONDITION cond=lst_entite->
get(i);
1197 BOITE_3D boite_cond=cond->get_boite_3D();
1203 double dx=xmax-xmin;
1204 double dy=ymax-ymin;
1205 double dz=zmax-zmin;
1227 for (
int i=0;i<lst_entite->
get_nb();i++)
1229 CONDITION cond=lst_entite->
get(i);
1230 BOITE_3D boite_cond=cond->get_boite_3D();
1236 double dx=xmax-xmin;
1237 double dy=ymax-ymin;
1238 double dz=zmax-zmin;
1316 for (
int i=0;i<lst_entite->
get_nb();i++)
1318 CONDITION cond=lst_entite->
get(i);
1319 BOITE_3D boite_cond=cond->get_boite_3D();
1341 if (boite*cellule->
boite)
1364 if (boite*cellule->
boite)
1367 liste_entite.ajouter(cellule);
1388 if (liste_cellule.
get_nb()==1)
return liste_cellule.
get(0);
1395 BOITE_3D boite(xcentre-rayon_recherche,ycentre-rayon_recherche,zcentre-rayon_recherche,xcentre+rayon_recherche,ycentre+rayon_recherche,zcentre+rayon_recherche);
1397 rechercher(boite,liste_entite_trouve,cellule);
1404 if (boite*cellule->
boite)
1424 if (boite*cellule->
boite)