ArcBetweenPoints Example

This example demonstrates ArcBetweenPoints.

https://github.com/user-attachments/assets/9595ce1d-2390-4d4d-958f-9299755460b7

arc_between_points.mp4

1use env_logger::Env;
2use itertools::Itertools;
3use ranim::animation::fading::FadingAnimSchedule;
4use ranim::color::HueDirection;
5use ranim::glam::{DMat2, dvec2};
6use ranim::items::group::Group;
7use ranim::items::vitem::ArcBetweenPoints;
8use ranim::prelude::*;
9use ranim::timeline::TimeMark;
10
11#[scene]
12struct ArcBetweenPointsScene;
13
14impl TimelineConstructor for ArcBetweenPointsScene {
15 fn construct<'t: 'r, 'r>(
16 self,
17 timeline: &'t RanimTimeline,
18 _camera: &'r mut Rabject<'t, CameraFrame>,
19 ) {
20 let center = dvec2(0.0, 0.0);
21
22 let start_color = color!("#FF8080FF");
23 let end_color = color!("#58C4DDFF");
24 let ntan = 16;
25 let nrad = 5;
26
27 let arcs = (0..nrad)
28 .map(|i| {
29 let radius = 6.0 * (i + 1) as f64 / nrad as f64;
30 let width = 6.0 * ((nrad - i) as f64 / nrad as f64).powi(2);
31 let angle = std::f64::consts::PI * 7.0 / 4.0 * (i + 1) as f64 / nrad as f64;
32 (radius, width, angle)
33 })
34 .cartesian_product(0..ntan)
35 .map(|((rad, width, angle), j)| {
36 let color = start_color.lerp(
37 end_color,
38 j as f32 / (ntan - 1) as f32,
39 HueDirection::Increasing,
40 );
41 let vec = DMat2::from_angle(std::f64::consts::PI * 2.0 / ntan as f64 * j as f64)
42 * dvec2(rad, 0.0);
43 let mut arc = ArcBetweenPoints {
44 start: center.extend(0.0),
45 end: (center + vec).extend(0.0),
46 angle,
47 }
48 .build();
49 arc.set_color(color)
50 .set_fill_opacity(0.0)
51 .set_stroke_width(width as f32);
52 arc
53 })
54 .collect::<Group<_>>();
55 let mut arcs = timeline.insert(arcs);
56
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 timeline.insert_time_mark(
60 timeline.duration_secs(),
61 TimeMark::Capture("preview.png".to_string()),
62 );
63 }
64}
65
66fn main() {
67 #[cfg(debug_assertions)]
68 env_logger::Builder::from_env(Env::default().default_filter_or("arc_between_points=trace"))
69 .init();
70 #[cfg(not(debug_assertions))]
71 env_logger::Builder::from_env(Env::default().default_filter_or("arc_between_points=info"))
72 .init();
73
74 render_scene(ArcBetweenPointsScene, &AppOptions::default());
75}
76