in commons-geometry-core/src/main/java/org/apache/commons/geometry/core/partitioning/bsp/AbstractPartitionedRegionBuilder.java [191:232]
private void insertBoundaryRecursiveInternalNode(final N node, final HyperplaneConvexSubset<P> insert,
final HyperplaneConvexSubset<P> trimmed, final BiConsumer<N, HyperplaneConvexSubset<P>> leafFn) {
final Split<? extends HyperplaneConvexSubset<P>> insertSplit =
insert.split(node.getCutHyperplane());
final HyperplaneConvexSubset<P> minus = insertSplit.getMinus();
final HyperplaneConvexSubset<P> plus = insertSplit.getPlus();
if (minus == null && plus == null && isPartitionNode(node)) {
// the inserted boundary lies directly on a partition; proceed down the tree with the
// rest of the insertion algorithm but instead of cutting the final leaf nodes, just
// set the location
// remove this node from the set of partition nodes since this is now a boundary cut
partitionNodes.remove(node);
final boolean sameOrientation = node.getCutHyperplane().similarOrientation(insert.getHyperplane());
final N insertMinus = sameOrientation ? node.getMinus() : node.getPlus();
final N insertPlus = sameOrientation ? node.getPlus() : node.getMinus();
insertBoundaryRecursive(insertMinus, insert, trimmed,
(leaf, cut) -> leaf.setLocation(RegionLocation.INSIDE));
insertBoundaryRecursive(insertPlus, insert, trimmed,
(leaf, cut) -> leaf.setLocation(RegionLocation.OUTSIDE));
} else if (minus != null || plus != null) {
final Split<? extends HyperplaneConvexSubset<P>> trimmedSplit =
trimmed.split(node.getCutHyperplane());
final HyperplaneConvexSubset<P> trimmedMinus = trimmedSplit.getMinus();
final HyperplaneConvexSubset<P> trimmedPlus = trimmedSplit.getPlus();
if (minus != null) {
insertBoundaryRecursive(node.getMinus(), minus, trimmedMinus, leafFn);
}
if (plus != null) {
insertBoundaryRecursive(node.getPlus(), plus, trimmedPlus, leafFn);
}
}
}