boundingBox property

Rectangle get boundingBox

Get the bounding rectangle of this capsule

Implementation

Rectangle get boundingBox {
  final dx = medialAxis.b.x - medialAxis.a.x;
  final dy = medialAxis.b.y - medialAxis.a.y;
  final len = axisLength;

  if (len == 0) {
    return Rectangle(
      x: center.x - radius,
      y: center.y - radius,
      width: 2 * radius,
      height: 2 * radius,
    );
  }

  // Unit direction and perpendicular
  final ux = dx / len, uy = dy / len;
  final px = -uy, py = ux;

  // All four extreme points of the capsule outline
  final points = [
    Point(medialAxis.a.x + px * radius, medialAxis.a.y + py * radius),
    Point(medialAxis.a.x - px * radius, medialAxis.a.y - py * radius),
    Point(medialAxis.b.x + px * radius, medialAxis.b.y + py * radius),
    Point(medialAxis.b.x - px * radius, medialAxis.b.y - py * radius),
    // Semicircle extremes
    Point(medialAxis.a.x - ux * radius, medialAxis.a.y - uy * radius),
    Point(medialAxis.b.x + ux * radius, medialAxis.b.y + uy * radius),
  ];

  final minX = points.map((p) => p.x).reduce(min);
  final minY = points.map((p) => p.y).reduce(min);
  final maxX = points.map((p) => p.x).reduce(max);
  final maxY = points.map((p) => p.y).reduce(max);

  return Rectangle(x: minX, y: minY, width: maxX - minX, height: maxY - minY);
}