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)
void get_centre(double *coo)
virtual unsigned long get_id()
virtual CELLULE_OCTREE_BASE * get_fils(int num)=0
virtual int get_niveau(void)=0
virtual int get_feuille(void)=0
virtual int get_sontype(void)=0
virtual ~CELLULE_OCTREE_BASE()
virtual BOITE_3D get_boite(void)=0
virtual int get_nb_cellule(void)=0
virtual CELLULE_OCTREE_BASE * get_cellule(int num)=0
virtual int get_niveau_max(void)=0
unsigned long determine_keycode(int nx, int ny, int nz)
int sommetarete(int numarete, int numsommet)
int commonface(int direction, int octant)
int areteface(int numface, int numarete)
bool adjacent(int direction, int octant)
int reflect(int direction, int octant)
int filsvoisin(int direction, int numvoisin)
int faceadjacente(int numface, int numarete)
int sommetface(int numface, int numsommet)
void change_info(int num, B val)
virtual ~TPL_CELLULE_INFO()
TPL_CELLULE_INFO(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual TPL_CELLULE_INFO< A, CONDITION, B > * get_fils(int num)
TPL_CELLULE_INFO< A,CONDITION, B > * fils[8]
TPL_LISTE_ENTITE< A > lst_entite_A
TPL_LISTE_ENTITE< CONDITION > lst_entite_CONDITION
virtual int get_feuille(void)
virtual ~TPL_CELLULE_OCTREE()
TPL_LISTE_ENTITE< CONDITION > lst_entite_CONDITION
TPL_CELLULE_OCTREE< A,CONDITION > * fils[8]
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_fils(int num)
TPL_LISTE_ENTITE< A > lst_entite_A
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)
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_pere(void)
TPL_CELLULE_OCTREE< A,CONDITION > * pere
virtual int get_feuille(void)
virtual void supprimer(X x)
virtual void ajouter(X x)
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
virtual void ajouter(X x)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
virtual void initialiser(B &fonction, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual void change_coefficent_multiplicateur(double val)
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)
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)
virtual ~TPL_OCTREE_FCT()
virtual void initialiser(B &fonction, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual void change_coefficent_multiplicateur(double val)
virtual void supprimer(BOITE_3D &boite, A a, TPL_CELLULE_INFO< A, CONDITION, B > *cellule)
virtual BOITE_3D get_boite_de_base(void)
TPL_CELLULE_INFO< A, CONDITION, B > * cree_fils(CELLULE_OCTREE_BASE *cellule_base)
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)
virtual TPL_CELLULE_INFO< A, CONDITION, B > * get_cellule(int num)
TPL_LISTE_ENTITE< TPL_CELLULE_INFO< A,CONDITION, B > * > lst_entite_cellule
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_INFO< A, CONDITION, B > *cellule)
virtual void rechercher(double xcentre, double ycentre, double zcentre, double rayon_recherche, TPL_MAP_ENTITE< A > &liste_entite_trouve)
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)
virtual void supprimer(A a)
virtual int get_nb_cellule(void)
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_INFO< A, CONDITION, B > *cellule)
virtual void initialiser(TPL_MAP_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual TPL_CELLULE_INFO< A, CONDITION, B > * get_cellule(double x, double y, double z)
virtual void inserer(A a)
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual ~TPL_OCTREE_INFO()
virtual void initialiser(OCTREE_BASE *oc)
virtual int get_nb_feuille(void)
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
virtual BOITE_3D get_boite_de_base(void)
virtual unsigned long get_keycode(TPL_CELLULE_OCTREE< A, CONDITION > *cellule, int numsommet)
virtual void get_cellule(BOITE_3D &boite, TPL_CELLULE_OCTREE< A, CONDITION > *cellule, TPL_MAP_ENTITE< TPL_CELLULE_OCTREE< A, CONDITION > * > &liste_entite)
virtual void get_xyzsommet_feuille(int numcellule, int numsommet, double &x, double &y, double &z)
virtual double get_dimension_caracteristique()
virtual void supprimer(A a)
virtual int get_nb_cellule(void)
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_cellule_adjacent(TPL_CELLULE_OCTREE< A, CONDITION > *cellule, int direction)
virtual int get_niveau_max(void)
virtual int get_tout_entite(TPL_MAP_ENTITE< A > &lst)
TPL_CELLULE_OCTREE< A, CONDITION > * cree_fils(TPL_CELLULE_OCTREE< A, CONDITION > *cell, CELLULE_OCTREE_BASE *cellule_base, int st)
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_feuille(int num)
virtual void get_xyzsommet_cellule(int numcellule, int numsommet, double &x, double &y, double &z)
virtual unsigned long get_cellule_keycode(int numcellule, int numsommet)
virtual void get_feuille_voisins(TPL_CELLULE_OCTREE< A, CONDITION > *cellule, int direction, std::vector< TPL_CELLULE_OCTREE< A, CONDITION > * > *lst)
virtual void equilibre(int niveauequilibre=1)
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)
virtual void supprimer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_cellule(double x, double y, double z)
TPL_LISTE_ENTITE< TPL_CELLULE_OCTREE< A,CONDITION > * > lst_entite_cellule
virtual int get_niveau_max_lim(void)
virtual void initialiser(TPL_MAP_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_cellule_voisin(TPL_CELLULE_OCTREE< A, CONDITION > *cellule, int direction)
virtual unsigned long get_keycode(double x, double y, double z)
virtual TPL_CELLULE_OCTREE< A, CONDITION > * get_cellule(int num)
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)
TPL_LISTE_ENTITE< TPL_CELLULE_OCTREE< A,CONDITION > * > lst_entite_feuille
virtual void inserer(A a)
virtual unsigned long get_feuille_keycode(int numcellule, int numsommet)
void change_niveau_max_lim(int num)
virtual void initialiser(OCTREE_BASE *oc)
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
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)
virtual void rechercher(double xcentre, double ycentre, double zcentre, double rayon_recherche, TPL_MAP_ENTITE< A > &liste_entite_trouve)
virtual void initialiser2D(int dimanepasdecouper, TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
double2 sqrt(double2 &val)