ArcBetweenPoints Example⁋
This example demonstrates ArcBetweenPoints
.
https://github.com/user-attachments/assets/9595ce1d-2390-4d4d-958f-9299755460b7
arc_between_points.mp4
1 | use env_logger::Env;
|
2 | use itertools::Itertools;
|
3 | use ranim::animation::fading::FadingAnimSchedule;
|
4 | use ranim::color::HueDirection;
|
5 | use ranim::glam::{DMat2, dvec2};
|
6 | use ranim::items::group::Group;
|
7 | use ranim::items::vitem::ArcBetweenPoints;
|
8 | use ranim::prelude::*;
|
9 | use ranim::timeline::TimeMark;
|
10 |
|
11 | #[scene]
|
12 | struct ArcBetweenPointsScene;
|
13 |
|
14 | impl 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 |
|
66 | fn 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 |
|