Arc

This example demonstrates Arc.

https://github.com/user-attachments/assets/4f8c6f36-e6b7-429b-8d2a-91c21e17dec2

arc.mp4

1use env_logger::Env;
2use glam::dvec2;
3use itertools::Itertools;
4use ranim::animation::fading::FadingAnimSchedule;
5use ranim::color::HueDirection;
6use ranim::components::Anchor;
7use ranim::items::group::Group;
8use ranim::items::vitem::Arc;
9use ranim::prelude::*;
10use ranim::timeline::TimeMark;
11
12#[scene]
13struct ArcScene;
14
15impl TimelineConstructor for ArcScene {
16 fn construct<'t: 'r, 'r>(
17 self,
18 timeline: &'t RanimTimeline,
19 _camera: &'r mut Rabject<'t, CameraFrame>,
20 ) {
21 // let frame_size = app.camera().size;
22 let frame_size = dvec2(8.0 * 16.0 / 9.0, 8.0);
23 let frame_start = dvec2(frame_size.x / -2.0, frame_size.y / -2.0);
24
25 let start_color = color!("#FF8080FF");
26 let end_color = color!("#58C4DDFF");
27
28 let nrow = 10;
29 let ncol = 10;
30 let step_x = frame_size.x / ncol as f64;
31 let step_y = frame_size.y / nrow as f64;
32
33 let arcs = (0..nrow)
34 .cartesian_product(0..ncol)
35 .map(|(i, j)| {
36 let (i, j) = (i as f64, j as f64);
37
38 let angle = std::f64::consts::PI * (j + 1.0) / ncol as f64 * 360.0 / 180.0;
39 let radius = step_y / 2.0 * 0.8;
40 let color = start_color.lerp(
41 end_color,
42 i as f32 / (nrow - 1) as f32,
43 HueDirection::Increasing,
44 );
45 let offset =
46 frame_start + dvec2(j * step_x + step_x / 2.0, i * step_y + step_y / 2.0);
47 let mut arc = Arc { angle, radius }.build();
48 arc.set_stroke_width(6.0 * (j as f32 + 1.0) / ncol as f32)
49 .set_stroke_color(color)
50 .set_fill_color(color.with_alpha(0.0))
51 .put_anchor_on(Anchor::center(), offset.extend(0.0));
52 arc
53 })
54 .collect::<Group<_>>();
55
56 let mut arcs = timeline.insert(arcs);
57 let arcs_fade_in = arcs.lagged_anim(0.2, |item| item.fade_in());
58 timeline.play(arcs_fade_in.with_total_duration(3.0)).sync();
59
60 timeline.insert_time_mark(
61 timeline.duration_secs(),
62 TimeMark::Capture("preview.png".to_string()),
63 );
64 }
65}
66
67fn main() {
68 #[cfg(debug_assertions)]
69 env_logger::Builder::from_env(Env::default().default_filter_or("arc=trace")).init();
70 #[cfg(not(debug_assertions))]
71 env_logger::Builder::from_env(Env::default().default_filter_or("arc=info")).init();
72
73 #[cfg(feature = "app")]
74 run_scene_app(ArcScene);
75 #[cfg(not(feature = "app"))]
76 render_scene(ArcScene, &AppOptions::default());
77}
78