circle_packing 1.0.1
circle_packing: ^1.0.1 copied to clipboard
Circle packing algorithm for Flutter - pack circles of varying sizes into a target circular boundary.
circle_packing #
A circle packing algorithm for Flutter that packs circles of varying sizes into a target circular boundary.
This package implements an A1.0 algorithm to efficiently arrange circles within a bounding circle.
Features #
- Pack any number of circles with different sizes into a target circle
- Circles are sized proportionally to input values
- No overlapping circles
- Optimized placement algorithm minimizes empty space
- Simple API with just one function
Getting Started #
Add circle_packing to your pubspec.yaml:
dependencies:
circle_packing: ^1.0.0
Then run:
flutter pub get
Usage #
Basic Example #
import 'package:circle_packing/circle_packing.dart';
// Define values (any positive numbers - they represent relative sizes)
final values = [50.0, 30.0, 20.0, 15.0, 10.0, 5.0];
// Pack circles into a target circle with radius 100
final circles = circlePack(
values: values,
targetRadius: 100.0,
);
// Each circle has x, y coordinates and radius r
for (final circle in circles) {
print('Circle at (${circle.x}, ${circle.y}) with radius ${circle.r}');
}
Flutter Widget Example #
import 'package:flutter/material.dart';
import 'package:circle_packing/circle_packing.dart';
class CirclePackingWidget extends StatelessWidget {
final List<double> values;
final double size;
const CirclePackingWidget({
super.key,
required this.values,
this.size = 200,
});
@override
Widget build(BuildContext context) {
final circles = circlePack(
values: values,
targetRadius: size / 2,
);
return CustomPaint(
size: Size(size, size),
painter: _CirclePainter(circles: circles, targetRadius: size / 2),
);
}
}
class _CirclePainter extends CustomPainter {
final List<Circle> circles;
final double targetRadius;
_CirclePainter({required this.circles, required this.targetRadius});
@override
void paint(Canvas canvas, Size size) {
final center = Offset(size.width / 2, size.height / 2);
canvas.translate(center.dx, center.dy);
// Draw bounding circle
canvas.drawCircle(
Offset.zero,
targetRadius,
Paint()..style = PaintingStyle.stroke,
);
// Draw packed circles
for (final c in circles) {
canvas.drawCircle(
Offset(c.x, c.y),
c.r,
Paint()..color = Colors.blue.withOpacity(0.3),
);
}
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}
API Reference #
circlePack #
List<Circle> circlePack({
required List<double> values,
required double targetRadius,
})
Packs circles into a target circle centered at (0, 0).
Parameters:
values: List of positive numbers representing relative circle sizestargetRadius: Radius of the bounding circle
Returns: List of Circle objects with x, y, r properties
Circle #
class Circle {
final double x; // X coordinate (center)
final double y; // Y coordinate (center)
final double r; // Radius
}
Example App #
Check out the example folder for a complete Flutter app demonstrating the circle packing visualization with interactive controls.
License #
MIT License - see LICENSE for details.
