575 T bestRatio = ((T)(_nX/iXX)/(T)(_nY/iYY)-1)*((T)(_nX/iXX)/(T)(_nY/iYY)-1)
576 + ((T)(_nY/iYY)/(T)(_nZ/iZZ)-1)*((T)(_nY/iYY)/(T)(_nZ/iZZ)-1)
577 + ((T)(_nZ/iZZ)/(T)(_nX/iXX)-1)*((T)(_nZ/iZZ)/(T)(_nX/iXX)-1);
579 for (
int iX=1; iX<=p; iX++) {
580 for (
int iY=1; iY*iX<=p; iY++) {
581 for (
int iZ=p/(iX*iY); iZ*iY*iX<=p; iZ++) {
582 if ((iX+1)*iY*iZ>p && iX*(iY+1)*iZ>p ) {
583 T ratio = ((T)(_nX/iX)/(T)(_nY/iY)-1)*((T)(_nX/iX)/(T)(_nY/iY)-1)
584 + ((T)(_nY/iY)/(T)(_nZ/iZ)-1)*((T)(_nY/iY)/(T)(_nZ/iZ)-1)
585 + ((T)(_nZ/iZ)/(T)(_nX/iX)-1)*((T)(_nZ/iZ)/(T)(_nX/iX)-1);
586 if (ratio<bestRatio) {
600 int rest = p - bestIx*bestIy*bestIz;
604 divide(bestIx, bestIy, bestIz, childrenC);
610 if (nZ>nY && nZ>nX) {
612 int restY = rest%bestIy;
615 int restX = rest/bestIy;
619 T globPosY_child = _globPosY;
621 for (
int iY=0; iY<bestIy; iY++) {
622 yN_child = (_nY+bestIy-iY-1)/bestIy;
623 for (
int iC=0; iC<helpG.
getNc(); iC++) {
624 int xN_child = helpG.
get(iC).getNx();
625 int zN_child = helpG.
get(iC).getNy();
626 T globPosX_child = helpG.
get(iC).get_globPosX();
627 T globPosZ_child = helpG.
get(iC).get_globPosY();
629 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
630 _delta, xN_child, yN_child, zN_child);
631 childrenC.push_back(child);
634 globPosY_child += yN_child*_delta;
641 int restX = rest/bestIy+1;
643 T globPosY_child = _globPosY;
644 int splited_nY = (int) (_nY * (T)((bestIx*bestIz+restX)*restY)/(T)p);
647 for (
int iY=0; iY<restY; iY++) {
648 yN_child = (splited_nY+restY-iY-1)/restY;
649 for (
int iC=0; iC<helpG0.
getNc(); iC++) {
650 int xN_child = helpG0.
get(iC).getNx();
651 int zN_child = helpG0.
get(iC).getNy();
652 T globPosX_child = helpG0.
get(iC).get_globPosX();
653 T globPosZ_child = helpG0.
get(iC).get_globPosY();
655 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
656 _delta, xN_child, yN_child, zN_child);
657 childrenC.push_back(child);
659 globPosY_child += yN_child*_delta;
662 splited_nY = _nY - splited_nY;
667 for (
int iY=0; iY<bestIy-restY; iY++) {
668 yN_child = (splited_nY+bestIy-restY-iY-1)/(bestIy-restY);
669 for (
int iC=0; iC<helpG1.
getNc(); iC++) {
670 int xN_child = helpG1.
get(iC).getNx();
671 int zN_child = helpG1.
get(iC).getNy();
672 T globPosX_child = helpG1.
get(iC).get_globPosX();
673 T globPosZ_child = helpG1.
get(iC).get_globPosY();
675 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
676 _delta, xN_child, yN_child, zN_child);
677 childrenC.push_back(child);
679 globPosY_child += yN_child*_delta;
685 else if (nX>nY && nX>nZ) {
686 int restY = rest%bestIy;
689 int restZ = rest/bestIy;
693 T globPosY_child = _globPosY;
695 for (
int iY=0; iY<bestIy; iY++) {
696 yN_child = (_nY+bestIy-iY-1)/bestIy;
697 for (
int iC=0; iC<helpG.
getNc(); iC++) {
698 int xN_child = helpG.
get(iC).getNx();
699 int zN_child = helpG.
get(iC).getNy();
700 T globPosX_child = helpG.
get(iC).get_globPosX();
701 T globPosZ_child = helpG.
get(iC).get_globPosY();
703 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
704 _delta, xN_child, yN_child, zN_child);
705 childrenC.push_back(child);
708 globPosY_child += yN_child*_delta;
715 int restZ = rest/bestIy+1;
718 T globPosY_child = _globPosY;
719 int splited_nY = (int) (_nY * (T)((bestIx*bestIz+restZ)*restY)/(T)p);
722 for (
int iY=0; iY<restY; iY++) {
723 yN_child = (splited_nY+restY-iY-1)/restY;
724 for (
int iC=0; iC<helpG0.
getNc(); iC++) {
725 int xN_child = helpG0.
get(iC).getNx();
726 int zN_child = helpG0.
get(iC).getNy();
727 T globPosX_child = helpG0.
get(iC).get_globPosX();
728 T globPosZ_child = helpG0.
get(iC).get_globPosY();
730 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
731 _delta, xN_child, yN_child, zN_child);
732 childrenC.push_back(child);
734 globPosY_child += yN_child*_delta;
737 splited_nY = _nY - splited_nY;
743 for (
int iY=0; iY<bestIy-restY; iY++) {
744 yN_child = (splited_nY+bestIy-restY-iY-1)/(bestIy-restY);
745 for (
int iC=0; iC<helpG1.
getNc(); iC++) {
746 int xN_child = helpG1.
get(iC).getNx();
747 int zN_child = helpG1.
get(iC).getNy();
748 T globPosX_child = helpG1.
get(iC).get_globPosX();
749 T globPosZ_child = helpG1.
get(iC).get_globPosY();
751 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
752 _delta, xN_child, yN_child, zN_child);
753 childrenC.push_back(child);
755 globPosY_child += yN_child*_delta;
762 int restX = rest%bestIx;
765 int restZ = rest/bestIx;
770 T globPosX_child = _globPosX;
772 for (
int iX=0; iX<bestIx; iX++) {
773 xN_child = (_nX+bestIx-iX-1)/bestIx;
774 for (
int iC=0; iC<helpG.
getNc(); iC++) {
775 int zN_child = helpG.
get(iC).getNx();
776 int yN_child = helpG.
get(iC).getNy();
777 T globPosZ_child = helpG.
get(iC).get_globPosX();
778 T globPosY_child = helpG.
get(iC).get_globPosY();
780 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
781 _delta, xN_child, yN_child, zN_child);
782 childrenC.push_back(child);
784 globPosX_child += xN_child*_delta;
791 int restZ = rest/bestIx+1;
793 T globPosX_child = _globPosX;
794 int splited_nX = (int) (_nX * (T)((bestIz*bestIy+restZ)*restX)/(T)p);
797 for (
int iX=0; iX<restX; iX++) {
798 xN_child = (splited_nX+restX-iX-1)/restX;
799 for (
int iC=0; iC<helpG0.
getNc(); iC++) {
800 int zN_child = helpG0.
get(iC).getNx();
801 int yN_child = helpG0.
get(iC).getNy();
802 T globPosZ_child = helpG0.
get(iC).get_globPosX();
803 T globPosY_child = helpG0.
get(iC).get_globPosY();
805 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
806 _delta, xN_child, yN_child, zN_child);
807 childrenC.push_back(child);
809 globPosX_child += xN_child*_delta;
812 splited_nX = _nX - splited_nX;
817 for (
int iX=0; iX<bestIx-restX; iX++) {
818 xN_child = (splited_nX+bestIx-restX-iX-1)/(bestIx-restX);
819 for (
int iC=0; iC<helpG1.
getNc(); iC++) {
820 int zN_child = helpG1.
get(iC).getNx();
821 int yN_child = helpG1.
get(iC).getNy();
822 T globPosZ_child = helpG1.
get(iC).get_globPosX();
823 T globPosY_child = helpG1.
get(iC).get_globPosY();
825 Cuboid3D<T> child(globPosX_child, globPosY_child, globPosZ_child,
826 _delta, xN_child, yN_child, zN_child);
827 childrenC.push_back(child);
829 globPosX_child += xN_child*_delta;