in commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1S.java [149:193]
public Split<RegionBSPTree1S> splitDiameter(final CutAngle splitter) {
final CutAngle opposite = CutAngles.fromPointAndDirection(
splitter.getPoint().antipodal(),
!splitter.isPositiveFacing(),
splitter.getPrecision());
final double plusPoleOffset = splitter.isPositiveFacing() ?
+Angle.PI_OVER_TWO :
-Angle.PI_OVER_TWO;
final Point1S plusPole = Point1S.of(splitter.getAzimuth() + plusPoleOffset);
final boolean zeroOnPlusSide = splitter.getPrecision()
.lte(plusPole.distance(Point1S.ZERO), Angle.PI_OVER_TWO);
final Split<RegionBSPTree1S> firstSplit = split(splitter);
final Split<RegionBSPTree1S> secondSplit = split(opposite);
RegionBSPTree1S minus = RegionBSPTree1S.empty();
RegionBSPTree1S plus = RegionBSPTree1S.empty();
if (zeroOnPlusSide) {
// zero wrap-around needs to be handled on the plus side of the split
safeUnion(plus, firstSplit.getPlus());
safeUnion(plus, secondSplit.getPlus());
minus = firstSplit.getMinus();
if (minus != null) {
minus = minus.split(opposite).getMinus();
}
} else {
// zero wrap-around needs to be handled on the minus side of the split
safeUnion(minus, firstSplit.getMinus());
safeUnion(minus, secondSplit.getMinus());
plus = firstSplit.getPlus();
if (plus != null) {
plus = plus.split(opposite).getPlus();
}
}
return new Split<>(
(minus != null && !minus.isEmpty()) ? minus : null,
(plus != null && !plus.isEmpty()) ? plus : null);
}