use dotmax::primitives::{draw_circle, draw_circle_filled, draw_circle_thick};
use dotmax::{BrailleGrid, TerminalRenderer};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut grid = BrailleGrid::new(80, 24)?;
println!("Circle Drawing Demo");
println!("===================\n");
println!("1. Small circles (radius 5, 10)");
draw_circle(&mut grid, 10, 10, 5)?;
draw_circle(&mut grid, 30, 10, 10)?;
println!("2. Medium circles (radius 20, 30, 40)");
draw_circle(&mut grid, 70, 20, 20)?;
draw_circle(&mut grid, 120, 40, 30)?;
println!("3. Large circle (radius 45)");
draw_circle(&mut grid, 80, 70, 45)?;
let mut renderer = TerminalRenderer::new()?;
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("4. Concentric circles pattern (radii 10, 20, 30, 40)");
let center_x = 80;
let center_y = 48;
for radius in [10, 20, 30, 40] {
draw_circle(&mut grid, center_x, center_y, radius)?;
}
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("5. Filled circles (radius 15, 20, 25)");
draw_circle_filled(&mut grid, 30, 24, 15)?;
draw_circle_filled(&mut grid, 80, 48, 20)?;
draw_circle_filled(&mut grid, 130, 72, 25)?;
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("6. Filled vs outline comparison");
draw_circle(&mut grid, 40, 48, 30)?; draw_circle_filled(&mut grid, 120, 48, 30)?; renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("7. Thick circles (thickness 3, 5)");
draw_circle_thick(&mut grid, 40, 40, 25, 3)?;
draw_circle_thick(&mut grid, 120, 56, 30, 5)?;
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("8. Varying thickness (1, 2, 3, 4, 5)");
let base_x = 30;
for (i, thickness) in [1, 2, 3, 4, 5].iter().enumerate() {
let x = base_x + (i as i32 * 28);
draw_circle_thick(&mut grid, x, 48, 20, *thickness)?;
}
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("9. Boundary clipping (circles partially off-grid)");
draw_circle(&mut grid, -10, 10, 25)?; draw_circle(&mut grid, 170, 10, 25)?; draw_circle(&mut grid, -10, 86, 25)?; draw_circle(&mut grid, 170, 86, 25)?; draw_circle(&mut grid, 80, -15, 30)?; draw_circle(&mut grid, 80, 110, 30)?; renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("10. Artistic pattern - circular arrangement");
let center_x = 80;
let center_y = 48;
let orbit_radius = 35;
for angle in 0..12 {
let theta = (angle as f32) * (2.0 * std::f32::consts::PI / 12.0);
let x = center_x + (orbit_radius as f32 * theta.cos()) as i32;
let y = center_y + (orbit_radius as f32 * theta.sin()) as i32;
draw_circle(&mut grid, x, y, 8)?;
}
draw_circle_filled(&mut grid, center_x, center_y, 12)?;
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("11. Overlapping circles (Venn diagram style)");
draw_circle(&mut grid, 60, 48, 30)?;
draw_circle(&mut grid, 100, 48, 30)?;
draw_circle(&mut grid, 80, 68, 30)?;
renderer.render(&grid)?;
println!("\n---\n");
grid = BrailleGrid::new(80, 24)?;
println!("12. Mixed patterns - outline and filled");
for radius in [40, 42, 44] {
draw_circle(&mut grid, 80, 48, radius)?;
}
draw_circle_filled(&mut grid, 60, 48, 15)?;
draw_circle_filled(&mut grid, 100, 48, 15)?;
draw_circle_filled(&mut grid, 80, 28, 15)?;
draw_circle_filled(&mut grid, 80, 68, 15)?;
renderer.render(&grid)?;
println!("\nAll circle demos complete!");
Ok(())
}