Rust nannouでフェルマーの螺旋を描くsketchからmodelへ

nannou

今までは、Rust nannouでコードを描くときにsketchを使ってやってたんですが、これからもうちょっと複雑なこともしてみたいなと思って、依然作ったフェルマー螺旋のコードをmodelを使って描画するようにソースコードを書き換えてみた。

modelを定義すると、あとからパラーメーターをいじりやすくなるし、他の関数からも変数を参照できるから、広がりが見えてきた。

あと、model updateを使ってアップデートごとの変数の変化なども設定できるようになるから、もうちょっと細かく動かしたいとかいうのも設定できるようになった。

今までのsketchでもこれらのことはできないことはないんだけど、viewのなかに全部書いていく感じになっちゃうから、見ずらい。

あとは、イベント処理とかももうちょっとやりやすくなるかな?と思ってます。

これで、さらにアートな世界に行けるかな?

sketchの頃のソース

use nannou::prelude::*;
 fn main() {
     nannou::sketch(view).size(800, 800).run()
 }
 fn view(app: &App, frame: Frame) {
     let draw = app.draw();
     let f = frame.nth();
     let t = app.time;
     let f_ajust = f;
     let scale = 5.0;
     let rot = 2.0.sqrt(); 
     let theta = 2.0 * PI * rot * f_ajust as f32;
     let c = t.cos() + t.sin();
     draw.ellipse()
     .hsla(c, 2.0, 0.5, 0.5)
     .x_y(
         scale * (f_ajust as f32).sqrt() * (theta).cos(),
         scale * (f_ajust as f32).sqrt() * (theta).sin(),
     )
     .radius(3.0); draw.to_frame(app, &frame).unwrap();
 }

modelで書いてみたソース

use nannou::prelude::*;
 fn main() {
     nannou::app(model).update(update).run();
 }
 struct Model {
     scale: f32,
     rot: f32,
     f: f32,
 }
 fn model(app: &App) -> Model {
     let _window = app
         .new_window()
         .view(view)
         .key_pressed(key_pressed)
         .build()
         .unwrap();
     Model {
         scale: 5.0,
         rot: 2.0.sqrt(),
         f: 1.0,
     }
 }
 fn update(_app: &App, model: &mut Model, _update: Update) {
     model.f += 0.5;
 }
 fn view(app: &App, model: &Model, frame: Frame) {
     let draw = app.draw();
     let t = app.time;
     let theta = 2.0 * PI * model.rot * model.f;
     let c = t.cos() + t.sin();
     if frame.nth() == 0 {
         draw.background().color(BLACK);
     }
     draw.ellipse()
         .hsla(c, 2.0, 0.5, 0.5)
         .x_y(
             model.scale * model.f.sqrt() * theta.cos(),
             model.scale * model.f.sqrt() * theta.sin(),
         )
         .radius(3.0);
     draw.to_frame(app, &frame).unwrap();
 }
 fn key_pressed(app: &App, _model: &mut Model, key: Key) {
     if key == Key::S {
         app.main_window()
             .capture_frame(app.exe_name().unwrap() + ".png");
     }
 }

ソースは長くなるけど
stractでmodelをしっかり定義してるから、あとからの保守も楽だよね。
見やすいし

コメント

タイトルとURLをコピーしました