computeCentroid method

void computeCentroid(
  1. List<Vector2> vs,
  2. int count
)

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);
}