143template <
typename T,
unsigned D>
146 auto loc0 =
maxv(_origin-overlap*_delta, min);
147 auto loc1 =
minv(_origin+(_extent+overlap-1)*_delta, max);
152template <
typename T,
unsigned D>
160template <
typename T,
unsigned D>
163 T globPosX_child, globPosY_child;
167 globPosX_child = _origin[0];
168 globPosY_child = _origin[1];
170 for (
int iX=0; iX < division[0]; iX++) {
171 for (
int iY=0; iY < division[1]; iY++) {
172 xN_child = (_extent[0]+division[0]-iX-1)/division[0];
173 yN_child = (_extent[1]+division[1]-iY-1)/division[1];
174 Cuboid2D<T> child({globPosX_child, globPosY_child}, _delta, {xN_child, yN_child});
175 childrenC.push_back(child);
176 globPosY_child += yN_child*_delta;
178 globPosY_child = _origin[1];
179 globPosX_child += xN_child*_delta;
183template <
typename T,
unsigned D>
190 T globPosX_child = _origin[0];
191 T globPosY_child = _origin[1];
192 T globPosZ_child = _origin[2];
194 for (
int iX=0; iX < division[0]; iX++) {
195 for (
int iY=0; iY < division[1]; iY++) {
196 for (
int iZ=0; iZ < division[2]; iZ++) {
197 xN_child = (_extent[0]+division[0]-iX-1)/division[0];
198 yN_child = (_extent[1]+division[1]-iY-1)/division[1];
199 zN_child = (_extent[2]+division[2]-iZ-1)/division[2];
200 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
201 _delta, {xN_child, yN_child, zN_child});
202 childrenC.push_back(child);
203 globPosZ_child += zN_child*_delta;
205 globPosZ_child = _origin[2];
206 globPosY_child += yN_child*_delta;
208 globPosY_child = _origin[1];
209 globPosX_child += xN_child*_delta;
213template <
typename T,
unsigned D>
219 T bestRatio = (T)_extent[0]/(T)_extent[1];
221 for (
int i=1; i<= p; i++) {
224 if (
util::fabs(bestRatio - (T)i/(T)j) <= difRatio) {
233 int rest = p - nX*nY;
236 divide({nX,nY},childrenC);
240 if (ratio < bestRatio && (nY-rest) >= 0) {
241 int n_QNoInsertions = nX*(nY-rest);
242 T bestVolume_QNoInsertions = (T)_extent[0]*_extent[1] * n_QNoInsertions/(T)p;
243 int yN_QNoInsertions = (int)(bestVolume_QNoInsertions / (T)_extent[0]);
244 int xN_QNoInsertions = _extent[0];
245 int yN_QInsertions = _extent[1]-yN_QNoInsertions;
246 int xN_QInsertions = _extent[0];
247 Cuboid2D<T> firstChildQ({_origin[0], _origin[1]}, _delta, {xN_QNoInsertions, yN_QNoInsertions});
248 Cuboid2D<T> secondChildQ({_origin[0], _origin[1]+yN_QNoInsertions*_delta}, _delta, {xN_QInsertions, yN_QInsertions});
249 firstChildQ.
divide({nX, nY-rest}, childrenC);
250 secondChildQ.divide({nX+1,rest}, childrenC);
253 int n_QNoInsertions = nY*(nX-rest);
254 T bestVolume_QNoInsertions = (T)_extent[0]*_extent[1] * n_QNoInsertions/(T)p;
255 int xN_QNoInsertions = (int)(bestVolume_QNoInsertions / (T)_extent[1] + 0.9999);
256 int yN_QNoInsertions = _extent[1];
257 int xN_QInsertions = _extent[0]-xN_QNoInsertions;
258 int yN_QInsertions = _extent[1];
259 Cuboid2D<T> firstChildQ({_origin[0], _origin[1]}, _delta, {xN_QNoInsertions, yN_QNoInsertions});
260 Cuboid2D<T> secondChildQ({_origin[0]+xN_QNoInsertions*_delta, _origin[1]}, _delta, {xN_QInsertions, yN_QInsertions});
261 firstChildQ.
divide({nX-rest, nY}, childrenC);
262 secondChildQ.divide({rest,nY+1}, childrenC);
266template <
typename T,
unsigned D>
272 int nX = _extent[0]/iXX;
274 int nY = _extent[1]/iYY;
276 int nZ = _extent[2]/iZZ;
278 T bestRatio = ((T)(_extent[0]/iXX)/(T)(_extent[1]/iYY)-1)*((T)(_extent[0]/iXX)/(T)(_extent[1]/iYY)-1)
279 + ((T)(_extent[1]/iYY)/(T)(_extent[2]/iZZ)-1)*((T)(_extent[1]/iYY)/(T)(_extent[2]/iZZ)-1)
280 + ((T)(_extent[2]/iZZ)/(T)(_extent[0]/iXX)-1)*((T)(_extent[2]/iZZ)/(T)(_extent[0]/iXX)-1);
282 for (
int iX=1; iX<=p; iX++) {
283 for (
int iY=1; iY*iX<=p; iY++) {
284 for (
int iZ=p/(iX*iY); iZ*iY*iX<=p; iZ++) {
285 if ((iX+1)*iY*iZ>p && iX*(iY+1)*iZ>p ) {
286 T ratio = ((T)(_extent[0]/iX)/(T)(_extent[1]/iY)-1)*((T)(_extent[0]/iX)/(T)(_extent[1]/iY)-1)
287 + ((T)(_extent[1]/iY)/(T)(_extent[2]/iZ)-1)*((T)(_extent[1]/iY)/(T)(_extent[2]/iZ)-1)
288 + ((T)(_extent[2]/iZ)/(T)(_extent[0]/iX)-1)*((T)(_extent[2]/iZ)/(T)(_extent[0]/iX)-1);
289 if (ratio<bestRatio) {
303 int rest = p - bestIx*bestIy*bestIz;
307 divide({bestIx, bestIy, bestIz}, childrenC);
313 if (nZ>nY && nZ>nX) {
315 int restY = rest%bestIy;
318 int restX = rest/bestIy;
319 CuboidDecomposition<T,2> helpG({_origin[0], _origin[2]}, _delta, {_extent[0], _extent[2]}, bestIx*bestIz+restX);
322 T globPosY_child = _origin[1];
324 for (
int iY=0; iY<bestIy; iY++) {
325 yN_child = (_extent[1]+bestIy-iY-1)/bestIy;
326 for (
int iC=0; iC<helpG.size(); iC++) {
327 int xN_child = helpG.get(iC).getNx();
328 int zN_child = helpG.get(iC).getNy();
329 T globPosX_child = helpG.get(iC).getOrigin()[0];
330 T globPosZ_child = helpG.get(iC).getOrigin()[1];
332 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
333 _delta, {xN_child, yN_child, zN_child});
334 childrenC.push_back(child);
337 globPosY_child += yN_child*_delta;
344 int restX = rest/bestIy+1;
346 T globPosY_child = _origin[1];
347 int splited_nY = (int) (_extent[1] * (T)((bestIx*bestIz+restX)*restY)/(T)p);
348 CuboidDecomposition<T,2> helpG0({_origin[0], _origin[2]}, _delta, {_extent[0], _extent[2]}, bestIx*bestIz+restX);
350 for (
int iY=0; iY<restY; iY++) {
351 yN_child = (splited_nY+restY-iY-1)/restY;
352 for (
int iC=0; iC<helpG0.size(); iC++) {
353 int xN_child = helpG0.get(iC).getNx();
354 int zN_child = helpG0.get(iC).getNy();
355 T globPosX_child = helpG0.get(iC).getOrigin()[0];
356 T globPosZ_child = helpG0.get(iC).getOrigin()[1];
358 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
359 _delta, {xN_child, yN_child, zN_child});
360 childrenC.push_back(child);
362 globPosY_child += yN_child*_delta;
365 splited_nY = _extent[1] - splited_nY;
367 CuboidDecomposition<T,2> helpG1({_origin[0], _origin[2]}, _delta, {_extent[0], _extent[2]}, bestIx*bestIz+restX);
370 for (
int iY=0; iY<bestIy-restY; iY++) {
371 yN_child = (splited_nY+bestIy-restY-iY-1)/(bestIy-restY);
372 for (
int iC=0; iC<helpG1.size(); iC++) {
373 int xN_child = helpG1.get(iC).getNx();
374 int zN_child = helpG1.get(iC).getNy();
375 T globPosX_child = helpG1.get(iC).getOrigin()[0];
376 T globPosZ_child = helpG1.get(iC).getOrigin()[1];
378 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
379 _delta, {xN_child, yN_child, zN_child});
380 childrenC.push_back(child);
382 globPosY_child += yN_child*_delta;
388 else if (nX>nY && nX>nZ) {
389 int restY = rest%bestIy;
392 int restZ = rest/bestIy;
393 CuboidDecomposition<T,2> helpG({_origin[0], _origin[2]}, _delta, {_extent[0], _extent[2]}, bestIx*bestIz+restZ);
396 T globPosY_child = _origin[1];
398 for (
int iY=0; iY<bestIy; iY++) {
399 yN_child = (_extent[1]+bestIy-iY-1)/bestIy;
400 for (
int iC=0; iC<helpG.size(); iC++) {
401 int xN_child = helpG.get(iC).getNx();
402 int zN_child = helpG.get(iC).getNy();
403 T globPosX_child = helpG.get(iC).getOrigin()[0];
404 T globPosZ_child = helpG.get(iC).getOrigin()[1];
406 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
407 _delta, {xN_child, yN_child, zN_child});
408 childrenC.push_back(child);
411 globPosY_child += yN_child*_delta;
418 int restZ = rest/bestIy+1;
421 T globPosY_child = _origin[1];
422 int splited_nY = (int) (_extent[1] * (T)((bestIx*bestIz+restZ)*restY)/(T)p);
423 CuboidDecomposition<T,2> helpG0({_origin[0], _origin[2]}, _delta, {_extent[0], _extent[2]}, bestIx*bestIz+restZ);
425 for (
int iY=0; iY<restY; iY++) {
426 yN_child = (splited_nY+restY-iY-1)/restY;
427 for (
int iC=0; iC<helpG0.size(); iC++) {
428 int xN_child = helpG0.get(iC).getNx();
429 int zN_child = helpG0.get(iC).getNy();
430 T globPosX_child = helpG0.get(iC).getOrigin()[0];
431 T globPosZ_child = helpG0.get(iC).getOrigin()[1];
433 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
434 _delta, {xN_child, yN_child, zN_child});
435 childrenC.push_back(child);
437 globPosY_child += yN_child*_delta;
440 splited_nY = _extent[1] - splited_nY;
443 CuboidDecomposition<T,2> helpG1({_origin[0], _origin[2]}, _delta, {_extent[0], _extent[2]}, bestIx*bestIz+restZ);
446 for (
int iY=0; iY<bestIy-restY; iY++) {
447 yN_child = (splited_nY+bestIy-restY-iY-1)/(bestIy-restY);
448 for (
int iC=0; iC<helpG1.size(); iC++) {
449 int xN_child = helpG1.get(iC).getNx();
450 int zN_child = helpG1.get(iC).getNy();
451 T globPosX_child = helpG1.get(iC).getOrigin()[0];
452 T globPosZ_child = helpG1.get(iC).getOrigin()[1];
454 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
455 _delta, {xN_child, yN_child, zN_child});
456 childrenC.push_back(child);
458 globPosY_child += yN_child*_delta;
465 int restX = rest%bestIx;
468 int restZ = rest/bestIx;
469 CuboidDecomposition<T,2> helpG({_origin[2], _origin[1]}, _delta, {_extent[2], _extent[1]}, bestIz*bestIy+restZ);
473 T globPosX_child = _origin[0];
475 for (
int iX=0; iX<bestIx; iX++) {
476 xN_child = (_extent[0]+bestIx-iX-1)/bestIx;
477 for (
int iC=0; iC<helpG.size(); iC++) {
478 int zN_child = helpG.get(iC).getNx();
479 int yN_child = helpG.get(iC).getNy();
480 T globPosZ_child = helpG.get(iC).getOrigin()[0];
481 T globPosY_child = helpG.get(iC).getOrigin()[1];
483 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
484 _delta, {xN_child, yN_child, zN_child});
485 childrenC.push_back(child);
487 globPosX_child += xN_child*_delta;
494 int restZ = rest/bestIx+1;
496 T globPosX_child = _origin[0];
497 int splited_nX = (int) (_extent[0] * (T)((bestIz*bestIy+restZ)*restX)/(T)p);
498 CuboidDecomposition<T,2> helpG0({_origin[2], _origin[1]}, _delta, {_extent[2], _extent[1]}, bestIz*bestIy+restZ);
500 for (
int iX=0; iX<restX; iX++) {
501 xN_child = (splited_nX+restX-iX-1)/restX;
502 for (
int iC=0; iC<helpG0.size(); iC++) {
503 int zN_child = helpG0.get(iC).getNx();
504 int yN_child = helpG0.get(iC).getNy();
505 T globPosZ_child = helpG0.get(iC).getOrigin()[0];
506 T globPosY_child = helpG0.get(iC).getOrigin()[1];
508 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
509 _delta, {xN_child, yN_child, zN_child});
510 childrenC.push_back(child);
512 globPosX_child += xN_child*_delta;
515 splited_nX = _extent[0] - splited_nX;
517 CuboidDecomposition<T,2> helpG1({_origin[2], _origin[1]}, _delta, {_extent[2], _extent[1]}, bestIz*bestIy+restZ);
520 for (
int iX=0; iX<bestIx-restX; iX++) {
521 xN_child = (splited_nX+bestIx-restX-iX-1)/(bestIx-restX);
522 for (
int iC=0; iC<helpG1.size(); iC++) {
523 int zN_child = helpG1.get(iC).getNx();
524 int yN_child = helpG1.get(iC).getNy();
525 T globPosZ_child = helpG1.get(iC).getOrigin()[0];
526 T globPosY_child = helpG1.get(iC).getOrigin()[1];
528 Cuboid3D<T> child({globPosX_child, globPosY_child, globPosZ_child},
529 _delta, {xN_child, yN_child, zN_child});
530 childrenC.push_back(child);
532 globPosX_child += xN_child*_delta;
539template <
typename T,
unsigned D>
541 _origin += offset*_delta;
545template <
typename T,
unsigned D>
549 return i == iD ? _delta : 0;
552 return i == iD ? 1 : 0;
555 std::vector<int> fractionWidths;
557 for (T f : fractions) {
558 fractionWidths.emplace_back(f * (getExtent()*base));
559 totalWidth += fractionWidths.back();
561 fractionWidths.back() += getExtent()*base - totalWidth;
563 auto origin = getOrigin();
565 return i == iD ? 0 : getExtent()[i];
568 for (
int width : fractionWidths) {
569 Cuboid<T,D> child(origin, _delta, extent + (width)*base);
571 origin += width*delta;
572 childrenC.push_back(child);
576template <
typename T,
unsigned D>
579 for (
int i = 0; i<3; i++) {
580 ss << getExtent()[i] <<
" ";
583 ss <<
"\" origin=\"";
584 for (
int i = 0; i<3; i++) {
585 ss << getOrigin()[i] <<
" ";
588 ss <<
"\" deltaR=\"" << getDeltaR();
589 ss <<
"\" weight=\"" << getWeight();