๐Ÿ”ฎ :: Loping Lissajous Pattern

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

Nannou <Generative Art>

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

๐Ÿ“ Rust Code

use nannou::prelude::*;

struct Model {
    time: f32,
}

fn main() {
    nannou::app(model).update(update).run();
}

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 += 0.0001;
}

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 points_count = 4000;

    // ์ฃผํŒŒ์ˆ˜ (์‹œ๊ฐ„์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”์‹œ์ผœ์„œ ์›€์ง์ž„์„ ๋งŒ๋“ฆ)
    let a = 3.0 + (model.time * 0.3).sin() * 2.0;
    let b = 2.0 + (model.time * 0.2).cos() * 2.0;
    let delta = model.time; // ์œ„์ƒ ์ฐจ์ด

    // ํฌ์ธํŠธ ์ €์žฅ
    let mut points = Vec::new();
    for i in 0..points_count {
        let t = map_range(i, 0, points_count, 0.0, TAU * 5.0);

        // Lissajous ๊ณก์„  (Parametric)
        let x = (a * t + delta).sin() * win.w() * 0.4;
        let y = (b * t).sin() * win.h() * 0.4;

        points.push(pt2(x, y) + center); 
    }

    // ํŒจํ„ด ๊ทธ๋ฆฌ๊ธฐ
    draw.polyline()
        .weight(1.2)
        .points(points)
        .color(hsla(
            (model.time * 0.1).sin() * 0.5 + 0.5, // Hue oscillates over time
            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๊ฐœ์˜ ๋Œ“๊ธ€