๐Ÿ”ฎ :: Circular Noise

BamgasiJMยท2025๋…„ 9์›” 17์ผ

Nannou <Generative Art>

๋ชฉ๋ก ๋ณด๊ธฐ
10/55
post-thumbnail

๐Ÿ“ 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;

            // Perlin Noise๋ฅผ ์ด์šฉํ•ด ๋ฐ˜์ง€๋ฆ„์„ ํ”๋“ค๊ธฐ
            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, // ์ƒ‰์ƒ(Hue)
                0.8,                      // ์ฑ„๋„(Saturation)
                0.6,                      // ๋ฐ๊ธฐ(Lightness)
                0.8,                      // ์•ŒํŒŒ(Alpha)
            ));
    }

    draw.to_frame(app, &frame).unwrap();
}

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0๊ฐœ์˜ ๋Œ“๊ธ€