前回、rust nannouでマンデルブロ集合を描きました。
今回はそれをカラー化しました。
マンデルブロ集合カラー化の方法
カラー化をするためにいくつか方法を試しました。
どの方法にしても、漸化式の計算回数によって、色分けしています。
forを使う
30回ぐらい漸化式を計算すれば、ある程度きれいなマンデルブロ集合を描くことができるので、forを使って、30回計算を個別に取り出して、その都度色を付けてみました。
これ、forが元のを含めると3重になるので、とっても処理が重いです。
 for i in 0..800 {
        for j in 0..600 {
      for f in 0..30
            let re = i as f32 / 200.0 - 3.0;
            let im = j as f32 / 200.0 - 1.5;
            let c = Complex::new(re, im);
            if check(c, f) {
                draw.rect()
                    .w_h(1.5, 1.5)
                    .x_y(re * 150.0 + 150.0, im * 150.0)
                    .hsva((f as f32), 1.0, 1.0, 0.5);
              }
            }
        }
    }800回の600回の30回だからね(笑)
そしてcheck関数自体もきちんと手入れすればよかったけど、前回のまま使ってるので、さらにそれを何回計算するの?みたいな回数を1フレームで計算するっていう暴挙(笑)
一瞬フリーズするよね。
段階的に描く
これはやばい。一気に計算するとフリーズする!と思って
次に取った手は、段階的に描こうという方法
let f = frame.nth();
 for i in 0..800 {
        for j in 0..600 {
            let re = i as f32 / 200.0 - 3.0;
            let im = j as f32 / 200.0 - 1.5;
            let c = Complex::new(re, im);
            if check(c, f) {
                draw.rect()
                    .w_h(1.5, 1.5)
                    .x_y(re * 150.0 + 150.0, im * 150.0)
                    .hsva((f as f32).sin(), 1.0, 1.0, 0.5);
              
            }
        }
    }まぁこんな感じね。
こうするとフレームが進むごとに深さが深くなっていくので、どんどんマンデルブロ集合が現われてくる感じ。
こうすると、段階的に計算するので、フリーズすることはなくなりました。
まとめ
色々手段はあります。
他にもいろいろ試しました。1フレームで描くのか、それとも一瞬の計算量を減らすためにフレームを分けて重ね合わせていくのか、描き方は自由よね。透明度とか変えて、ちょっと違った見た目を求めるのもいいかも?
ではまた。
 
 


コメント
[…] カラー化のマンデルブロ集合の解説もあるよ⇒rust nannouのマンデルブロ集合をカラー化 […]
[…] rust nannouのマンデルブロ集合をカラー化前回、rust nannouでマンデルブロ集合… […]