computeCentroid method
Implementation
void computeCentroid(List<Vector2> vs, int count) {
assert(count >= 3);
centroid.setZero();
var area = 0.0;
// pRef is the reference point for forming triangles.
// It's location doesn't change the result (except for rounding error).
final pRef = Vector2.zero();
final e1 = Vector2.zero();
final e2 = Vector2.zero();
const inv3 = 1.0 / 3.0;
for (var i = 0; i < count; ++i) {
// Triangle vertices.
final p1 = pRef;
final p2 = vs[i];
final p3 = i + 1 < count ? vs[i + 1] : vs[0];
e1
..setFrom(p2)
..sub(p1);
e2
..setFrom(p3)
..sub(p1);
final D = e1.cross(e2);
final triangleArea = 0.5 * D;
area += triangleArea.abs();
// Area weighted centroid
e1
..setFrom(p1)
..add(p2)
..add(p3)
..scale(triangleArea * inv3);
centroid.add(e1);
}
// Centroid
assert(area > settings.epsilon);
centroid.scale(1.0 / area);
}