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