From ab4794fb59d94fae0229e43e542b184a2d91284a Mon Sep 17 00:00:00 2001 From: numzero Date: Wed, 23 Sep 2026 19:53:40 +0300 Subject: [PATCH] add animation --- src/main.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9c2adba..78117c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -92,38 +92,54 @@ fn main() { const OFF_SAT: f32 = R_SUN + R_SAT; const R_SKY: f32 = R_SCALE * N_TEETH_SKY as f32; + const FPS: f32 = 60.0; + const V_SUN: f32 = 2.0; + const V_SKY: f32 = -1.0; + + const V_SAT: f32 = (V_SKY - V_SUN) / 2.0; + const V_ORBIT: f32 = (V_SUN + V_SKY) / 2.0; + + const W_SUN: f32 = V_SUN / N_TEETH_SUN as f32; + const W_SKY: f32 = V_SKY / N_TEETH_SKY as f32; + const W_SAT: f32 = V_SAT / N_TEETH_SAT as f32; + const W_ORBIT: f32 = V_ORBIT / (N_TEETH_SUN + N_TEETH_SAT) as f32; + with_2d_graphics(|| { let sun = gear_shape(N_TEETH_SUN); let sat = gear_shape(N_TEETH_SAT); let crown = gear_shape_outer(N_TEETH_SKY); let (canvas, mut events) = create_drawing_window_with_events("Canvas window"); + let mut frame = 0; 'main: loop { while let Poll::Ready(event) = events.poll_next_unpin(&mut Context::from_waker(Waker::noop())) { let Some(_event) = event else { break 'main }; } + let t = frame as f32 / FPS; canvas.draw(|gc| { gc.clear_canvas(Rgba(0.1, 0.1, 0.1, 1.0)); gc.canvas_height(100.0); gc.line_width(0.25); + let m = Mat2::from_angle(t * W_SUN + 1.0 / N_TEETH_SUN as f32 * PI); gc.new_path(); for pt in &sun { - let pt = R_SUN * pt; + let pt = R_SUN * m * pt; gc.line_to(pt.x, pt.y); } gc.close_path(); gc.stroke_color(Rgba(0.8, 0.7, 0.1, 1.0)); gc.stroke(); + let mr = Mat2::from_angle(t * W_SAT); for k in 0..N_SAT { - let m = Mat2::from_angle(k as f32 / N_SAT as f32 * 2. * PI); + let mo = Mat2::from_angle(t * W_ORBIT + k as f32 / N_SAT as f32 * 2. * PI); gc.new_path(); for pt in &sat { - let pt = m * vec2(OFF_SAT, 0.) + R_SAT * pt; + let pt = mo * vec2(OFF_SAT, 0.) + R_SAT * mr * pt; gc.line_to(pt.x, pt.y); } gc.close_path(); @@ -131,15 +147,17 @@ fn main() { gc.stroke(); } + let m = Mat2::from_angle(t * W_SKY); gc.new_path(); for pt in &crown { - let pt = R_SKY * pt; + let pt = R_SKY * m * pt; gc.line_to(pt.x, pt.y); } gc.close_path(); gc.stroke_color(Rgba(0.1, 0.4, 0.8, 1.0)); gc.stroke(); }); + frame += 1; } }); }