in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Planes.java [448:481]
static <T extends PlaneSubset> Split<T> subspaceSplit(final Plane splitter, final T subset,
final BiFunction<? super EmbeddingPlane, ? super HyperplaneBoundedRegion<Vector2D>, T> factory) {
final EmbeddingPlane thisPlane = subset.getPlane().getEmbedding();
final Line3D intersection = thisPlane.intersection(splitter);
if (intersection == null) {
return getNonIntersectingSplitResult(splitter, subset);
} else {
final EmbeddingPlane embeddingPlane = subset.getPlane().getEmbedding();
// the lines intersect; split the subregion
final Vector3D intersectionOrigin = intersection.getOrigin();
final Vector2D subspaceP1 = embeddingPlane.toSubspace(intersectionOrigin);
final Vector2D subspaceP2 = embeddingPlane.toSubspace(intersectionOrigin.add(intersection.getDirection()));
final Line subspaceSplitter = Lines.fromPoints(subspaceP1, subspaceP2, thisPlane.getPrecision());
final Split<? extends HyperplaneBoundedRegion<Vector2D>> split =
subset.getEmbedded().getSubspaceRegion().split(subspaceSplitter);
final SplitLocation subspaceSplitLoc = split.getLocation();
if (SplitLocation.MINUS == subspaceSplitLoc) {
return new Split<>(subset, null);
} else if (SplitLocation.PLUS == subspaceSplitLoc) {
return new Split<>(null, subset);
}
final T minus = (split.getMinus() != null) ? factory.apply(thisPlane, split.getMinus()) : null;
final T plus = (split.getPlus() != null) ? factory.apply(thisPlane, split.getPlus()) : null;
return new Split<>(minus, plus);
}
}