use ruviz::animation::{RecordConfig, easing};
use ruviz::prelude::*;
use ruviz::record;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
std::fs::create_dir_all("export_output/gif").ok();
println!("Recording Example 1: Bouncing ball with ease_over...");
let config = RecordConfig::new().max_resolution(800, 600).framerate(30);
record!(
"export_output/gif/simple_bounce.gif",
60, config: config.clone(),
|t| {
let y = t.ease_over(easing::ease_out_bounce, 100.0, 0.0, 2.0);
Plot::new()
.scatter(&[50.0], &[y])
.marker_size(15.0)
.title(format!("Bounce (t={:.2}s)", t.time))
.xlim(0.0, 100.0)
.ylim(-10.0, 110.0)
}
)?;
println!(" Saved: export_output/gif/simple_bounce.gif");
println!("\nRecording Example 2: Wave with duration syntax...");
let x: Vec<f64> = (0..100).map(|i| i as f64 * 0.1).collect();
record!(
"export_output/gif/simple_wave.gif",
60, config: config.clone(),
|t| {
let phase = t.lerp_over(0.0, 2.0 * std::f64::consts::PI, 2.0);
let y: Vec<f64> = x.iter().map(|&xi| (xi + phase).sin()).collect();
Plot::new()
.line(&x, &y)
.title(format!("Wave (t={:.2}s)", t.time))
.xlim(0.0, 10.0)
.ylim(-1.5, 1.5)
}
)?;
println!(" Saved: export_output/gif/simple_wave.gif");
println!("\nRecording Example 3: Easing comparison...");
let wide_config = RecordConfig::new().max_resolution(1000, 400).framerate(30);
record!(
"export_output/gif/simple_easing.gif",
90, config: wide_config,
|t| {
let duration = 3.0;
let linear = t.lerp_over(0.0, 100.0, duration);
let ease_in = t.ease_over(easing::ease_in_quad, 0.0, 100.0, duration);
let ease_out = t.ease_over(easing::ease_out_quad, 0.0, 100.0, duration);
let elastic = t.ease_over(easing::ease_out_elastic, 0.0, 100.0, duration);
let bounce = t.ease_over(easing::ease_out_bounce, 0.0, 100.0, duration);
Plot::new()
.scatter(&[linear], &[5.0])
.marker_size(12.0)
.label("Linear")
.scatter(&[ease_in], &[4.0])
.marker_size(12.0)
.label("Ease In")
.scatter(&[ease_out], &[3.0])
.marker_size(12.0)
.label("Ease Out")
.scatter(&[elastic], &[2.0])
.marker_size(12.0)
.label("Elastic")
.scatter(&[bounce], &[1.0])
.marker_size(12.0)
.label("Bounce")
.title(format!("Easing Functions (t={:.2}s)", t.time))
.xlabel("Position")
.xlim(-10.0, 120.0)
.ylim(0.0, 6.0)
.legend_position(LegendPosition::UpperRight)
}
)?;
println!(" Saved: export_output/gif/simple_easing.gif");
println!("\nAll examples complete!");
Ok(())
}