add variable speed
This commit is contained in:
parent
cc11715d78
commit
96e7725857
38
src/main.rs
38
src/main.rs
|
|
@ -93,16 +93,6 @@ fn main() {
|
||||||
const R_SKY: f32 = R_SCALE * N_TEETH_SKY as f32;
|
const R_SKY: f32 = R_SCALE * N_TEETH_SKY as f32;
|
||||||
|
|
||||||
const FPS: f32 = 60.0;
|
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(|| {
|
with_2d_graphics(|| {
|
||||||
let sun = gear_shape(N_TEETH_SUN);
|
let sun = gear_shape(N_TEETH_SUN);
|
||||||
|
|
@ -110,21 +100,24 @@ fn main() {
|
||||||
let crown = gear_shape_outer(N_TEETH_SKY);
|
let crown = gear_shape_outer(N_TEETH_SKY);
|
||||||
|
|
||||||
let (canvas, mut events) = create_drawing_window_with_events("Canvas window");
|
let (canvas, mut events) = create_drawing_window_with_events("Canvas window");
|
||||||
let mut frame = 0;
|
let mut t = 0.0f32;
|
||||||
|
let mut angle_sun = 1.0 / N_TEETH_SUN as f32 * PI;
|
||||||
|
let mut angle_sky = 0.0;
|
||||||
|
let mut angle_sat = 0.0;
|
||||||
|
let mut angle_orbit = 0.0;
|
||||||
'main: loop {
|
'main: loop {
|
||||||
while let Poll::Ready(event) =
|
while let Poll::Ready(event) =
|
||||||
events.poll_next_unpin(&mut Context::from_waker(Waker::noop()))
|
events.poll_next_unpin(&mut Context::from_waker(Waker::noop()))
|
||||||
{
|
{
|
||||||
let Some(_event) = event else { break 'main };
|
let Some(_event) = event else { break 'main };
|
||||||
}
|
}
|
||||||
let t = frame as f32 / FPS;
|
|
||||||
canvas.draw(|gc| {
|
canvas.draw(|gc| {
|
||||||
gc.clear_canvas(Rgba(0.1, 0.1, 0.1, 1.0));
|
gc.clear_canvas(Rgba(0.1, 0.1, 0.1, 1.0));
|
||||||
|
|
||||||
gc.canvas_height(100.0);
|
gc.canvas_height(100.0);
|
||||||
gc.line_width(0.25);
|
gc.line_width(0.25);
|
||||||
|
|
||||||
let m = Mat2::from_angle(t * W_SUN + 1.0 / N_TEETH_SUN as f32 * PI);
|
let m = Mat2::from_angle(angle_sun);
|
||||||
gc.new_path();
|
gc.new_path();
|
||||||
for pt in &sun {
|
for pt in &sun {
|
||||||
let pt = R_SUN * m * pt;
|
let pt = R_SUN * m * pt;
|
||||||
|
|
@ -134,9 +127,9 @@ fn main() {
|
||||||
gc.stroke_color(Rgba(0.8, 0.7, 0.1, 1.0));
|
gc.stroke_color(Rgba(0.8, 0.7, 0.1, 1.0));
|
||||||
gc.stroke();
|
gc.stroke();
|
||||||
|
|
||||||
let mr = Mat2::from_angle(t * W_SAT);
|
let mr = Mat2::from_angle(angle_sat);
|
||||||
for k in 0..N_SAT {
|
for k in 0..N_SAT {
|
||||||
let mo = Mat2::from_angle(t * W_ORBIT + k as f32 / N_SAT as f32 * 2. * PI);
|
let mo = Mat2::from_angle(angle_orbit + k as f32 / N_SAT as f32 * 2. * PI);
|
||||||
gc.new_path();
|
gc.new_path();
|
||||||
for pt in &sat {
|
for pt in &sat {
|
||||||
let pt = mo * vec2(OFF_SAT, 0.) + R_SAT * mr * pt;
|
let pt = mo * vec2(OFF_SAT, 0.) + R_SAT * mr * pt;
|
||||||
|
|
@ -147,7 +140,7 @@ fn main() {
|
||||||
gc.stroke();
|
gc.stroke();
|
||||||
}
|
}
|
||||||
|
|
||||||
let m = Mat2::from_angle(t * W_SKY);
|
let m = Mat2::from_angle(angle_sky);
|
||||||
gc.new_path();
|
gc.new_path();
|
||||||
for pt in &crown {
|
for pt in &crown {
|
||||||
let pt = R_SKY * m * pt;
|
let pt = R_SKY * m * pt;
|
||||||
|
|
@ -157,7 +150,18 @@ fn main() {
|
||||||
gc.stroke_color(Rgba(0.1, 0.4, 0.8, 1.0));
|
gc.stroke_color(Rgba(0.1, 0.4, 0.8, 1.0));
|
||||||
gc.stroke();
|
gc.stroke();
|
||||||
});
|
});
|
||||||
frame += 1;
|
|
||||||
|
let v_sun: f32 = 1.0 + 2.0 * (0.007 * t).sin();
|
||||||
|
let v_sky: f32 = 1.0 - 2.0 * (0.003 * t).cos();
|
||||||
|
let v_sat: f32 = (v_sky - v_sun) / 2.0;
|
||||||
|
let v_orbit: f32 = (v_sun + v_sky) / 2.0;
|
||||||
|
|
||||||
|
let dt = 1.0 / FPS;
|
||||||
|
t += dt;
|
||||||
|
angle_sun += dt * v_sun / N_TEETH_SUN as f32;
|
||||||
|
angle_sky += dt * v_sky / N_TEETH_SKY as f32;
|
||||||
|
angle_sat += dt * v_sat / N_TEETH_SAT as f32;
|
||||||
|
angle_orbit += dt * v_orbit / (N_TEETH_SUN + N_TEETH_SAT) as f32;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user