in commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1S.java [201:252]
public List<AngularInterval> toIntervals() {
if (isFull()) {
return Collections.singletonList(AngularInterval.full());
}
final List<BoundaryPair> insideBoundaryPairs = new ArrayList<>();
for (final RegionNode1S node : nodes()) {
if (node.isInside()) {
insideBoundaryPairs.add(getNodeBoundaryPair(node));
}
}
insideBoundaryPairs.sort(BOUNDARY_PAIR_COMPARATOR);
final int boundaryPairCount = insideBoundaryPairs.size();
// Get the start point for merging intervals together.
final int startOffset = getIntervalStartIndex(insideBoundaryPairs);
// Go through the pairs starting at the start offset and create intervals
// for each set of adjacent pairs.
final List<AngularInterval> intervals = new ArrayList<>();
BoundaryPair start = null;
BoundaryPair end = null;
BoundaryPair current;
for (int i = 0; i < boundaryPairCount; ++i) {
current = insideBoundaryPairs.get((i + startOffset) % boundaryPairCount);
if (start == null) {
start = current;
end = current;
} else if (Objects.equals(end.getMax(), current.getMin())) {
// these intervals should be merged
end = current;
} else {
// these intervals should be separate
intervals.add(createInterval(start, end));
// queue up the next pair
start = current;
end = current;
}
}
if (start != null) {
intervals.add(createInterval(start, end));
}
return intervals;
}