in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/path/LinePath.java [221:268]
public LinePath simplify() {
final List<LineConvexSubset> simplified = new ArrayList<>();
final int size = elements.size();
LineConvexSubset current;
Line currentLine;
double end;
int idx = 0;
int testIdx;
while (idx < size) {
current = elements.get(idx);
currentLine = current.getLine();
end = current.getSubspaceEnd();
// try to combine with forward neighbors
testIdx = idx + 1;
while (testIdx < size && currentLine.equals(elements.get(testIdx).getLine())) {
end = Math.max(end, elements.get(testIdx).getSubspaceEnd());
++testIdx;
}
if (testIdx > idx + 1) {
// we found something to merge
simplified.add(Lines.subsetFromInterval(currentLine, current.getSubspaceStart(), end));
} else {
simplified.add(current);
}
idx = testIdx;
}
// combine the first and last items if needed
if (isClosed() && simplified.size() > 2 && simplified.get(0).getLine().equals(
simplified.get(simplified.size() - 1).getLine())) {
final LineConvexSubset startElement = simplified.get(0);
final LineConvexSubset endElement = simplified.remove(simplified.size() - 1);
final LineConvexSubset combined = Lines.subsetFromInterval(
endElement.getLine(), endElement.getSubspaceStart(), startElement.getSubspaceEnd());
simplified.set(0, combined);
}
return new SimplifiedLinePath(simplified);
}