リスト1 mandelblot.c
/* マンデルブロ集合計算プログラム */ #include <stdio.h> #include <math.h> #define C0r -0.743 // 計算する場所の中心座標(実数部) #define C0i 0.1145 // 計算する場所の中心座標(虚数部) #define VS 0.003 // 計算する場所の中心座標からの範囲(±VS) #define NMAX 20000 // 計算の繰り返し上限 #define STEP 800.0 // 計算する刻み double mandelbrot(double a, double b){ double x = 0.0; double y = 0.0; double x1, y1; int n; for (n = 1; n <= NMAX; n++) { x1 = x * x - y * y + a; y1 = 2.0 * x * y + b; if ( x1 * x1 + y1 * y1 > 4.0) return log(n); // 発散 x = x1; y = y1; } return 0; // 計算の繰り返し上限到達 } int main() { double a, b; for (a = C0r-VS; a < C0r+VS; a += 2.0*VS/STEP) { for (b = C0i-VS; b < C0i+VS; b += 2.0*VS/STEP) { printf("%1.14e %1.14e %1.14e\n", a, b, mandelbrot(a, b)); } printf("\n"); // これがないとgnuplotでエラーが出る } return 0; }
リスト2 png.gnuplot (gnuplot実行スクリプト)
set term png size 900, 900 set output "mandelbrot.png" set grid set pm3d map set size square set palette defined (0 "#000000", 2 "#c00000", 7 "#ffff00", 9 "#ffffff") splot "data.txt"
リスト3 コンパイル&実行
# cc -o mandelbrot -lm -O4 -Wall mandelbrot.c # ./mandelbrot > data.txt # gnuplot png.gnuplot
図1 実行結果(mandelbrot.png)
- 計算する場所はリスト1のdefine文の数値を変えることにより可能です。
- 色の変化を分かりやすくするため、Logスケールで表示しています。
0 件のコメント:
コメントを投稿