use ruviz::animation::RecordConfig;
use ruviz::prelude::*;
use ruviz::record;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
std::fs::create_dir_all("generated/examples/export/gif").ok();
let x: Vec<f64> = (0..100).map(|i| i as f64 * 0.1).collect();
println!("Recording animation with record! macro...");
let config = RecordConfig::new().max_resolution(800, 600).framerate(30);
record!(
"generated/examples/export/gif/animation_basic.gif",
60, config: config,
|t| {
let phase = t.time * 2.0 * std::f64::consts::PI;
let y: Vec<f64> = x.iter().map(|&xi| (xi + phase).sin()).collect();
Plot::new()
.line(&x, &y)
.title(format!("Sine Wave Animation (t={:.2}s)", t.time))
.xlabel("x")
.ylabel("sin(x + phase)")
.xlim(0.0, 10.0)
.ylim(-1.5, 1.5)
}
)?;
println!(" Saved: generated/examples/export/gif/animation_basic.gif");
println!("\nRecording duration-based animation...");
let config2 = RecordConfig::new().max_resolution(800, 600).framerate(30);
record!(
"generated/examples/export/gif/animation_basic_duration.gif",
2 secs,
config: config2,
|t| {
let phase = t.time * 2.0 * std::f64::consts::PI;
let y: Vec<f64> = x.iter().map(|&xi| (xi + phase).sin()).collect();
Plot::new()
.line(&x, &y)
.title(format!("Duration-Based (t={:.2}s)", t.time))
.xlabel("x")
.ylabel("sin(x + phase)")
.xlim(0.0, 10.0)
.ylim(-1.5, 1.5)
}
)?;
println!(" Saved: generated/examples/export/gif/animation_basic_duration.gif");
println!("\n=== Recommended Animation API ===");
println!("record!(path, frames, config: cfg, |t| plot) - Frame-based");
println!("record!(path, 2.0 secs, config: cfg, |t| plot) - Duration-based");
println!("\nUse max_resolution() for consistent matplotlib-style rendering.");
Ok(())
}