
๐ Rust Code
use nannou::prelude::*;
fn main() {
nannou::app(model).update(update).run();
}
struct Model {
time: f32,
}
fn model(app: &App) -> Model {
app.new_window().size(800, 800).view(view).build().unwrap();
Model { time: 0.0 }
}
fn update(_app: &App, model: &mut Model, update: Update) {
model.time += update.since_last.secs() as f32;
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app.draw();
draw.background().color(hsla(0.0, 0.0, 0.01, 1.0));
let steps = 500;
let radius = 200.0;
let waves = 3.0;
let layers = 20;
for l in 0..layers {
let mut points = Vec::new();
let shift = l as f32 * 0.22 + model.time * 0.5;
let hue_base = (model.time * 20.0) % 360.0;
let hue = hue_base + map_range(l, 0, layers, 200.0, 320.0);
for i in 0..steps {
let t = i as f32 / steps as f32 * TAU;
let r = radius * (1.1 + 0.4 * ((waves * t + shift) + model.time * 0.1).sin());
let x = r * t.cos();
let y = r * t.sin();
points.push(pt2(x, y));
}
draw.polyline()
.weight(1.5)
.color(hsla((hue % 360.0) / 360.0, 0.8, 0.5, 0.7))
.points_closed(points);
}
draw.to_frame(app, &frame).unwrap();
}