
๐ Rust Code
use nannou::prelude::*;
use nannou::noise::*;
struct Model {
angle: f32,
spiral_params: SpiralParams,
noise: Perlin,
noise_seed: u32,
}
struct SpiralParams {
turns: f32,
points_count: usize,
spacing: f32,
max_radius: f32,
noise_strength: f32,
noise_scale: f32,
}
impl Default for SpiralParams {
fn default() -> Self {
Self {
turns: 22.0,
points_count: 3000,
spacing: 3.0,
max_radius: 500.0,
noise_strength: 15.0,
noise_scale: 0.02,
}
}
}
fn main() {
nannou::app(model).update(update).run();
}
fn model(app: &App) -> Model {
let _window = app
.new_window()
.title("ํ๋ค๋ฆฌ๋ ๋์ ")
.size(800, 800)
.view(view)
.build()
.unwrap();
Model {
angle: 0.0,
spiral_params: SpiralParams::default(),
noise: Perlin::new(),
noise_seed: 0,
}
}
fn update(_app: &App, model: &mut Model, _update: Update) {
model.angle -= 0.01;
model.noise_seed += 1;
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app.draw();
draw.background().color(BLACK);
let draw = draw.rotate(model.angle);
let params = &model.spiral_params;
let max_t = params.turns * TAU;
for i in 0..params.points_count - 1 {
let t1 = ((i as f32) / ((params.points_count - 1) as f32)) * max_t;
let t2 = (((i + 1) as f32) / ((params.points_count - 1) as f32)) * max_t;
let base_r1 = params.spacing * t1;
let base_r2 = params.spacing * t2;
if base_r1 > params.max_radius {
break;
}
let noise_val1 = model.noise.get([
(t1 as f64) * (params.noise_scale as f64),
(model.noise_seed as f64) * 0.01,
]) as f32;
let noise_val2 = model.noise.get([
(t2 as f64) * (params.noise_scale as f64),
(model.noise_seed as f64) * 0.01,
]) as f32;
let r1 = base_r1 + noise_val1 * params.noise_strength;
let r2 = base_r2 + noise_val2 * params.noise_strength;
let p1 = pt2(r1 * t1.cos(), r1 * t1.sin());
let p2 = pt2(r2 * t2.cos(), r2 * t2.sin());
let progress = (i as f32) / ((params.points_count - 1) as f32);
let alpha = map_range(progress, 0.0, 1.0, 0.1, 0.9);
let hue = map_range(progress, 0.0, 1.0, 0.8, 0.5);
let saturation = map_range(progress, 0.0, 1.0, 0.3, 0.8);
let lightness = map_range(progress, 0.0, 1.0, 0.3, 0.7);
let weight = map_range(progress, 0.0, 1.0, 0.3, 2.5);
draw.line().start(p1).end(p2).weight(weight).color(hsla(hue, saturation, lightness, alpha));
}
draw.ellipse().radius(3.0).color(hsla(0.6, 0.8, 0.9, 0.8));
draw.to_frame(app, &frame).unwrap();
}