circle_packing 1.0.1 copy "circle_packing: ^1.0.1" to clipboard
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 sizes
  • targetRadius: 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.

1
likes
160
points
172
downloads
screenshot

Publisher

unverified uploader

Weekly Downloads

Circle packing algorithm for Flutter - pack circles of varying sizes into a target circular boundary.

Repository (GitHub)
View/report issues

Topics

#visualization #algorithm #circle-packing #data-visualization

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on circle_packing