in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Interval.java [297:330]
public Split<Interval> split(final Hyperplane<Vector1D> splitter) {
final OrientedPoint splitOrientedPoint = (OrientedPoint) splitter;
final Vector1D splitPoint = splitOrientedPoint.getPoint();
final HyperplaneLocation splitterMinLoc = (minBoundary != null) ? minBoundary.classify(splitPoint) : null;
final HyperplaneLocation splitterMaxLoc = (maxBoundary != null) ? maxBoundary.classify(splitPoint) : null;
Interval low = null;
Interval high = null;
if (splitterMinLoc != HyperplaneLocation.ON || splitterMaxLoc != HyperplaneLocation.ON) {
if (splitterMinLoc != null && splitterMinLoc != HyperplaneLocation.MINUS) {
// splitter is on or below min boundary
high = this;
} else if (splitterMaxLoc != null && splitterMaxLoc != HyperplaneLocation.MINUS) {
// splitter is on or above max boundary
low = this;
} else {
// the interval is split in two
low = new Interval(minBoundary, OrientedPoints.createPositiveFacing(
splitPoint, splitOrientedPoint.getPrecision()));
high = new Interval(OrientedPoints.createNegativeFacing(
splitPoint, splitOrientedPoint.getPrecision()), maxBoundary);
}
}
// assign minus/plus based on the orientation of the splitter
final boolean lowIsMinus = splitOrientedPoint.isPositiveFacing();
final Interval minus = lowIsMinus ? low : high;
final Interval plus = lowIsMinus ? high : low;
return new Split<>(minus, plus);
}