in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Ray.java [187:210]
Split<LineConvexSubset> splitOnIntersection(final Line splitter, final Vector2D intersection) {
final Line line = getLine();
final Precision.DoubleEquivalence splitterPrecision = splitter.getPrecision();
final int startCmp = splitterPrecision.compare(splitter.offset(startPoint), 0.0);
final boolean pointsTowardPlus = splitter.getOffsetDirection().dot(line.getDirection()) >= 0.0;
if (pointsTowardPlus && startCmp > -1) {
// entirely on plus side
return new Split<>(null, this);
} else if (!pointsTowardPlus && startCmp < 1) {
// entirely on minus side
return new Split<>(this, null);
}
// we're going to be split
final Segment splitSeg = new Segment(line, startPoint, intersection);
final Ray splitRay = new Ray(line, intersection);
final LineConvexSubset minus = (startCmp > 0) ? splitRay : splitSeg;
final LineConvexSubset plus = (startCmp > 0) ? splitSeg : splitRay;
return new Split<>(minus, plus);
}