
๐ Rust Code
use nannou::noise::{NoiseFn, Perlin};
use nannou::prelude::*;
struct Model {
perlin: Perlin,
time: f64,
}
fn main() {
nannou::app(model).update(update).run();
}
fn model(app: &App) -> Model {
app.new_window()
.size(800, 800)
.view(view)
.build()
.unwrap();
Model {
perlin: Perlin::new(),
time: 0.0,
}
}
fn update(_app: &App, model: &mut Model, _update: Update) {
model.time += 0.01;
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app.draw();
draw.background().color(BLACK);
let win = app.window_rect();
let center = pt2(0.0, 0.0);
let layers = 30;
let points_per_circle = 75;
for i in 0..layers {
let mut points = Vec::new();
let base_radius = map_range(i, 0, layers, 50.0, win.w() * 0.5);
for j in 0..points_per_circle {
let angle = map_range(j, 0, points_per_circle, 0.0, TAU);
let mut r = base_radius;
let n = model.perlin.get([
(angle.cos() * 0.8) as f64,
(angle.sin() * 0.8) as f64,
model.time + i as f64 * 0.2,
]);
let radius_offset = map_range(n, -1.0, 1.0, -30.0, 30.0);
r += radius_offset as f32;
let x = center.x + r * angle.cos();
let y = center.y + r * angle.sin();
points.push(pt2(x, y));
}
draw.polyline()
.weight(1.0)
.points_closed(points)
.color(hsla(
i as f32 / layers as f32,
0.8,
0.6,
0.8,
));
}
draw.to_frame(app, &frame).unwrap();
}