in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/hull/ConvexHull3D.java [268:298]
public ConvexHull3D build() {
if (simplex == null) {
return new ConvexHull3D(candidates, true);
}
// The simplex is degenerate.
if (simplex.isDegenerate()) {
return new ConvexHull3D(candidates, true);
}
simplex.getFacets().forEach(this::addFacet);
distributePoints(simplex.getFacets());
Facet conflictFacet = getConflictFacet();
while (conflictFacet != null) {
Vector3D conflictPoint = conflictFacet.getOutsidePoint();
Set<Facet> visibleFacets = new HashSet<>();
visibleFacets.add(conflictFacet);
Set<Edge> horizon = new HashSet<>();
getVisibleFacets(conflictFacet, conflictPoint, visibleFacets, horizon);
Vector3D referencePoint = conflictFacet.getPolygon().getCentroid();
Set<Facet> cone = constructCone(conflictPoint, horizon, referencePoint);
removeFacets(visibleFacets);
cone.forEach(this::addFacet);
distributePoints(cone);
conflictFacet = getConflictFacet();
}
Collection<ConvexPolygon3D> hull = edgeMap.values().stream()
.map(Facet::getPolygon).collect(Collectors.toSet());
return new ConvexHull3D(hull);
}