前回描画したマンデルブロ集合に色をつけます。どのような色をつけるかですが、収束しないことが確定したときのnの値から生成することにします。zの絶対値が2を超えたときが下記の漸化式が収束しないことが確定するときです。
nが0から127までは青から黄色に変化し、128から255までは黄色から赤へ、256から383までは赤から白へ、それよりも大きな値の場合は白とします。
この場合、渡された引数からColorを返すメソッドは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { Color CreateColorFromInt(int i) { if (i < 128) return Color.FromArgb(i * 2, i * 2, 255 - i * 2); else if (i < 256) return Color.FromArgb(255, 255 - (i - 128) * 2, 0); else if (i < 384) return Color.FromArgb(255, (i - 256) * 2, (i - 256) * 2); else return Color.FromArgb(255, 255, 255); } } |
IsMandelbrotSetメソッドを少し変えます。引数をもうひとつ追加して収束しないことが確定するnの値、コード内ではiの値を取得できるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { bool IsMandelbrotSet(Complex c, ref int count) { int numberOfTrials = 384; Complex z = Complex.Zero; for (int i = 0; i < numberOfTrials; i++) { z = z * z + c; if (z.Magnitude > 2) { count = i; return false; } } count = -1; return true; } } |
CreateMandelbrotSetBitmapメソッドでは複素数がマンデルブロ集合に属さない場合、IsMandelbrotSetメソッドを実行して取得されたcountと、これをCreateColorFromIntメソッドに渡して返されたColorをBitmapにセットします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { void CreateMandelbrotSetBitmap() { for (int x = 0; x < Bitmap.Width; x++) { for (int y = 0; y < Bitmap.Height; y++) { Complex c = new Complex(RealMin + x * ParDot, ImaginarylMin + y * ParDot); int count = 0; if (IsMandelbrotSet(c, ref count)) Bitmap.SetPixel(x, y, Color.Black); else Bitmap.SetPixel(x, y, CreateColorFromInt(count)); } } } } |
ボタンをクリックしたら拡大します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { // コンストラクタ内でParDotの値をフィールド変数InitParDotにコピーしておく private void button1_Click(object sender, EventArgs e) { ParDot *= 0.5; // 拡大するのはこの位置を中心とする CenterX = -0.70126220703125; CenterY = 0.356876220703125; CreateMandelbrotSetBitmap(); Invalidate(); label1.Text = "R = " + CenterX.ToString(); label2.Text = "I = " + CenterY.ToString(); label3.Text = (InitParDot / ParDot).ToString() + " 倍"; } } |
これは拡大した結果です。