Rust에서 Generative Art에 도전

15053 단어 Rustgenerativearttech
기하학적 패턴을 그린 애니메이션을 만들고 싶어서 Generative Art를 배우고 싶어요.
그때 나는 Rust의 창의적인 인코딩 라이브러리nannou가 있다는 것을 알고 만졌다.

Generative Art는 처음이지만 아주 간단한 구성으로 이렇게 복잡한 그림을 만들 수 있어요.
Rust도 접할 수 있고 Generative Art도 배울 수 있어서 정말 좋아요!
나는 꾸준하게 해 나가고 싶다.
다음은 코드를 불러옵니다!
use nannou::prelude::*;

struct Model {}

fn draw_circle(draw:&Draw, p:Vector2, r:f32) {
    let points = (0..=360).map(|i| {
        let radian = deg_to_rad(i as f32);
        let x = radian.sin() * r;
        let y = radian.cos() * r;
        (pt2(x, y), BLACK)
    });

    draw.polyline()
        .xy(p)
        .weight(1.)
        .points_colored(points);
}

fn render(draw:&Draw, p:Vector2, r:f32, level:u32) {
    if level <= 0 {return ;}

    draw_circle(draw, p, r);

    let r = r / 2.;

    for i in (0..=360).step_by(45) {
        let radian = deg_to_rad(i as f32);
        let p = p + vec2(radian.sin() * r, radian.cos() * r);

        render(draw, p, r, level - 1);
    }

}

fn main() {
    nannou::app(model)
        .event(event)
        .simple_window(view)
        .run();
}

fn model(_app: &App) -> Model {
    Model {}
}

fn event(_app: &App, _model: &mut Model, _event: Event) {
}

fn view(app: &App, _model: &Model, frame: Frame) {
    let draw = app.draw();

    draw.background().color(WHITE);

    render(&draw, vec2(0., 0.), 300., 4);

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

    app.main_window().capture_frame(captured_frame_path(app));
}

fn captured_frame_path(app: &App) -> std::path::PathBuf {
    app.project_path()
        .expect("failed to locate `project_path`")
        .join("capture")
        .with_extension("png")
}

좋은 웹페이지 즐겨찾기