rust nannouで蝶々曲線を描く

蝶々曲線 nannou

蝶々曲線って聞いてことありますか?

その名の通り、蝶々の形をした曲線で、ある、関数を描画すると描ける曲線です。

今回は、朝の雑談部屋でやった、ライブコーディングを元にrust nannouで蝶々曲線を描く方法を解説していきます。

動画はこちら https://youtu.be/PseUvXwPb-s

蝶々曲線とは

蝶々曲線とはどういうものかというと

実は、朝、「学のおもちゃ箱っていう本」を読んでるときに、「蝶々曲線」っていうのが出てきて、ナニコレ面白いと思ってコーディングしようと思いました


蝶々曲線っていうのがどういうものかっていうと、極座標$$r=\exp^{\cos{\theta}}-2\cos{(4\theta)}+\sin{(\frac{\theta}{12})}$$
であらわされるグラフです。

詳しいことは、書籍を読んでもらえると書いてあるので、割愛しますが

この極座標を描くとあら不思議、蝶々が現われるわけです。

蝶々曲線を描く方法

では、蝶々曲線をrust nannouを使って描いていきましょう。

今回は、Modelとupdateを使って、polylineで描いていきます。

Modelの定義と初期化

Structでmodelの変数を作ります。

今回はpolyline使うので、座標を収納するベクタ(chocho_points)を作ります。それと、update関数の中で使う\(\theta\)も併せて定義します。

こんな感じです。

Struct Model{
chocho_points:Vec<Vector2>,
theta : f32,
}

次にこれをmodel関数の中で、初期化します

fn model(app:&App)->Model{
....
....
     let mut chocho_points = Vec::new();
     chocho_points.push(pt2(0.0, 0.0));
Model{
     chocho_points,
     theta:0.0,
}
}

これでmodel定義と初期化は完了です

update関数で座標の算出と更新

さて、structとmodel関数で定義初期化したモデルをアップデート関数で計算していきましょう。

まずは、変化する値thetaと座標の拡大縮小をするscaleを作ります。

fn update(_app: &App, model: &mut Model, _update: Update) {
   let delta_theta = 0.01;
   model.theta += delta_theta;
   let scale = 50.0;
....
....
}

delta_thetaの値を変えることで、計算の細かさが変わります。scaleを変化させることで、図の大きさが変わります。

次に蝶々関数の極座標を計算していきます。まずはちょっと思い出してみましょう。

$$r=\exp^{\cos{\theta}}-2\cos{(4\theta)}+\sin{(\frac{\theta}{12})}$$

こうでしたね。

これを素直に計算します。

fn update(_app: &App, model: &mut Model, _update: Update) {
...
...
let r = model.theta.cos().exp() - 2.0 * ((4.0 * model.theta).cos()) + (model.theta / 12.0).sin();

....
....
}

こうなりますね。

あとは、これをx、y座標して、chocho_pointsに追加していきます。

fn update(_app: &App, model: &mut Model, _update: Update) {
...
....
.....
   let x = scale * r * (model.theta.cos());
   let y = scale * r * (model.theta.sin());
   model.chocho_points.push(pt2(x, y));
}

極座標をx、yに変換する方法は

$$x=r\cos({\theta})\\y=r\sin({\theta})$$

これでupdate関数は完成。

これによって、蝶々曲線の座標はmodel.chocho_pointsに収納されます。

蝶々曲線のpolyline描画

あとは、view関数の中でpolylineを描いていきましょう。

fn view(app: &App, model: &Model, frame: Frame) {
...
...
     draw.polyline()
         .weight(2.0)
         .points(model.chocho_points.clone())
         .color(RED);
     draw.to_frame(app, &frame).unwrap();
}

こんな感じですね。

これで、蝶々曲線を描画することができました。

蝶々曲線

まとめ

今回は、朝のYouTubeLIVEの雑談部屋で行ったライブコーディングの蝶々曲線をまとめてみました。

雑談部屋では、ellipse関数を使った描画についても扱ってます。

生配配信中に思い付きで行ったライブコーディング。

これぐらいの関数なら、なんとか思い付きでも下準備でなしでできるかな?って感じです。

今回紹介した、蝶々曲線は、「数学のおもちゃ箱 下」に載っています。数学のおもちゃ箱は、蝶々曲線だけじゃなくて、数学に関する小話がいっぱい載っているので、気になる方は、手に取ってみてはいかがでしょうか?

コメント

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