private void insertBoundaryRecursiveInternalNode()

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);
            }
        }
    }