Skip to main content

polar/
polar.rs

1use bland::{Figure, PolarGridOpts, Stroke};
2
3fn main() {
4    // Cardioid: r = 1 + cos(θ).
5    let n = 200;
6    let thetas: Vec<f64> = (0..=n)
7        .map(|i| i as f64 / n as f64 * std::f64::consts::TAU)
8        .collect();
9    let rs: Vec<f64> = thetas.iter().map(|t| 1.0 + t.cos()).collect();
10
11    // |cos 3θ| rose for comparison.
12    let rose: Vec<f64> = thetas.iter().map(|t| (3.0 * t).cos().abs() * 1.5).collect();
13
14    let fig = Figure::polar(2.1)
15        .title("Polar plots")
16        .polar_grid(PolarGridOpts::default())
17        .line(&thetas, &rs, |s| s.label("r = 1 + cos θ").stroke(Stroke::Solid))
18        .line(&thetas, &rose, |s| {
19            s.label("r = |cos 3θ|").stroke(Stroke::Dashed)
20        })
21        .legend_bottom_left();
22
23    std::fs::create_dir_all("out").expect("create out/");
24    std::fs::write("out/polar.svg", fig.to_svg()).expect("write svg");
25    println!("wrote out/polar.svg");
26}