in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/ConvexArea.java [148:181]
public Vector2D getCentroid() {
final List<LineConvexSubset> boundaries = getBoundaries();
double quadrilateralAreaSum = 0.0;
double scaledSumX = 0.0;
double scaledSumY = 0.0;
double signedArea;
Vector2D startPoint;
Vector2D endPoint;
for (final LineConvexSubset seg : boundaries) {
if (seg.isInfinite()) {
// infinite => no centroid
return null;
}
startPoint = seg.getStartPoint();
endPoint = seg.getEndPoint();
signedArea = startPoint.signedArea(endPoint);
quadrilateralAreaSum += signedArea;
scaledSumX += signedArea * (startPoint.getX() + endPoint.getX());
scaledSumY += signedArea * (startPoint.getY() + endPoint.getY());
}
if (quadrilateralAreaSum > 0) {
return Vector2D.of(scaledSumX, scaledSumY).multiply(1.0 / (3.0 * quadrilateralAreaSum));
}
return null;
}