#circle #bresenham #graphics #geometry

no-std concentric_circles

Efficient generation and iteration of concentric circle perimeters using Bresenham's algorithm

1 unstable release

0.1.0 Jun 1, 2025

#2419 in Algorithms

MIT/Apache

72KB
1K SLoC

concentric_circles

A Rust crate for generating points on concentric circles.

Overview

concentric_circles provides iterators and adapters for generating coordinates of points distributed along multiple concentric circles. It is designed to be lightweight, efficient, and compatible with no_std environments.

Visual Examples

Below are images demonstrating how ConcentricCircles renders. These were generated by example programs in the examples folder.

Run them with cargo run --example example_name.

Features

  • Generate points on multiple circles with customizable radii and point counts
  • Iterator-based API for ergonomic and efficient usage
  • no_std support (no dependency on the Rust standard library)
  • Flexible adapters for various point generation strategies

Usage

Add this to your Cargo.toml:

[dependencies]
concentric_circles = "0.1"

Basic usage:

use concentric_circles::{ConcentricCirclesAdapters, ConcentricCircles,  ScalingU32};
use concentric_circles::sum_circles_points;

let inner_radius = 100;
let outer_radius = 500;
let x_offset = outer_radius as i32;
let y_offset = outer_radius as i32;
let circles_points = sum_circles_points(inner_radius, outer_radius).unwrap();
let mut scaling_iter = ScalingU32::new(circles_points as u32);
let mut value = 0;

let iterator = ConcentricCircles::new(inner_radius, outer_radius)
     .to_image_coordinates(x_offset, y_offset)
     .map(|(x, y)| {
         value = scaling_iter.next().unwrap();
         (x, y, [255 - value, 255 - value, 255 - value, 255])
     });

License

  • MIT license

Dependencies

~1MB
~24K SLoC