diff --git a/packages/geometry/lib/src/geometry.dart b/packages/geometry/lib/src/geometry.dart index dceb4e9e..75bd575b 100644 --- a/packages/geometry/lib/src/geometry.dart +++ b/packages/geometry/lib/src/geometry.dart @@ -105,3 +105,20 @@ num factorial(num n) { return n * factorial(n - 1); } } + +/// Arithmetic mean position of all the [Vector2]s in a figure. +/// +/// For more information read: https://en.wikipedia.org/wiki/Centroid +Vector2 centroid(List vertices) { + assert( + vertices.isNotEmpty, + 'At least one vertex needed to calculate the centroid', + ); + + final centroid = Vector2.zero(); + for (final vertex in vertices) { + centroid.add(vertex); + } + + return centroid / vertices.length.toDouble(); +} diff --git a/packages/geometry/test/src/geometry_test.dart b/packages/geometry/test/src/geometry_test.dart index a3040a9c..b479990c 100644 --- a/packages/geometry/test/src/geometry_test.dart +++ b/packages/geometry/test/src/geometry_test.dart @@ -156,4 +156,41 @@ void main() { }); }); }); + + group('centroid', () { + test( + 'throws AssertionError when vertices are empty', + () { + expect(() => centroid([]), throwsAssertionError); + }, + ); + + test( + 'is correct when one vertex is given', + () { + expect(centroid([Vector2.zero()]), Vector2.zero()); + }, + ); + + test( + 'is correct when two vertex are given', + () { + expect(centroid([Vector2.zero(), Vector2(1, 1)]), Vector2(0.5, 0.5)); + }, + ); + + test( + 'is correct when three vertex are given', + () { + expect( + centroid([ + Vector2.zero(), + Vector2(1, 1), + Vector2(2, 2), + ]), + Vector2(1, 1), + ); + }, + ); + }); }