580 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(getLowerBound<X>(), getLowerBound<Y>()), Point<X, Y>(X(
startX), Y(
startY)), 0b00, 0b00, 0b00)), callback);
581 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(X(
startX), getLowerBound<Y>()), Point<X, Y>(X(
endX), Y(
startY)), 0b10, 0b00, 0b00)), callback);
582 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(X(
endX), getLowerBound<Y>()), Point<X, Y>(getUpperBound<X>(), Y(
startY)), 0b10, 0b00, 0b00)), callback);
584 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(getLowerBound<X>(), Y(
startY)), Point<X, Y>(X(
startX), Y(
endY)), 0b01, 0b00, 0b00)), callback);
585 const auto& i1 = i.getIntersected(Interval<X, Y>(Point<X, Y>(X(
startX), Y(
startY)), Point<X, Y>(X(
endX), Y(
endY)), 0b11, 0b00, 0b00));
591 int countX = endIndexX - startIndexX;
592 int countY = endIndexY - startIndexY;
593 R *means =
new R[countX * countY];
594 for (
int indexX = 0; indexX < countX; indexX++)
595 for (
int indexY = 0; indexY < countY; indexY++)
596 means[indexY * countX + indexX] =
R(0);
599 Interval<X, Y> interval(lower, upper, 0b11, 0b00, 0b00);
600 function->partition(interval, [&] (
const Interval<X, Y>& i2,
const IFunction<
R, Domain<X, Y>> *f2) {
601 if (f2->isNonZero(i2)) {
602 int partitionStartIndexX = std::max(0, (int)std::floor(toDouble(std::get<0>(i2.getLower()) - startX) / toDouble(stepX)));
603 int partitionEndIndexX = std::min(sizeX - 1, (int)std::ceil(toDouble(std::get<0>(i2.getUpper()) - startX) / toDouble(stepX)));
604 int partitionStartIndexY = std::max(0, (int)std::floor(toDouble(std::get<1>(i2.getLower()) - startY) / toDouble(stepY)));
605 int partitionEndIndexY = std::min(sizeY - 1, (int)std::ceil(toDouble(std::get<1>(i2.getUpper()) - startY) / toDouble(stepY)));
606 for (int indexX = partitionStartIndexX; indexX < partitionEndIndexX; indexX++) {
607 for (int indexY = partitionStartIndexY; indexY < partitionEndIndexY; indexY++) {
608 Point<X, Y> lowerCell(startX + stepX * indexX, startY + stepY * indexY);
609 Point<X, Y> upperCell(startX + stepX * (indexX + 1), startY + stepY * (indexY + 1));
610 Interval<X, Y> cellInterval(lowerCell, upperCell, 0b11, 0b00, 0b00);
611 const auto& i3 = i2.getIntersected(cellInterval);
613 R mean = f2->getMean(i3);
614 means[indexY * countX + indexX] += mean * i3.getVolume();
620 for (
int indexX = startIndexX; indexX < endIndexX; indexX++) {
621 for (
int indexY = startIndexY; indexY < endIndexY; indexY++) {
624 Interval<X, Y> cellInterval(lowerCell, upperCell, 0b11, 0b00, 0b00);
625 const auto& i2 = i1.getIntersected(cellInterval);
634 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(X(
endX), Y(
startY)), Point<X, Y>(getUpperBound<X>(), Y(
endY)), 0b11, 0b00, 0b00)), callback);
636 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(getLowerBound<X>(), Y(
endY)), Point<X, Y>(X(
startX), getUpperBound<Y>()), 0b01, 0b00, 0b00)), callback);
637 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(X(
startX), Y(
endY)), Point<X, Y>(X(
endX), getUpperBound<Y>()), 0b11, 0b00, 0b00)), callback);
638 call(i.getIntersected(Interval<X, Y>(Point<X, Y>(X(
endX), Y(
endY)), Point<X, Y>(getUpperBound<X>(), getUpperBound<Y>()), 0b11, 0b00, 0b00)), callback);