#02 フラクタル図形
こちらも以前に作成したもの。ライフゲームに似たやつ。
基本情報技術者試験…!
IT、プログラミング等を自習した記念に、FE試験を受験しようと思っていました。R2年度春はコロナの影響で中止になってしまい、そのままに。。
久しく調べてみると、現在はCBT形式で月1くらいで受けれるようになってた!またやるか。
勉強していた当時、午後のC言語対策に下の本勉強している中で平成28年度春の問題でフラクタル図形を描く問題があったので、写経・編集しつつ、動かしてみました。
フラクタルを描画するプログラム
プログラム内で単位図形となる部分を与えています。 フラクタルを生成する深さd(回数)は画面から入力して、深さ毎の datファイル を出力。 0は黒、1は白として Gnuplotで描画して、gifファイル を作成。
出力例(d=6)
ソースコード
c
#include <stdio.h>
#include <stdlib.h>
/* 単位図形,例1の場合 */
int pat[2][2] = {
{ 1, 1 },
{ 1, 0 },
};
/*2D配列のサイズ / 2D配列の行[0]のサイズ(列数) = 与えた行列の行数 */
int p_rn = sizeof pat / sizeof pat[0];
/* 2D配列の行[0]のサイズ / 2D配列の要素[0][0]のサイズ = 与えた行列の列数 */
int p_cn = sizeof pat[0] / sizeof pat[0][0];
/* プロトタイプ宣言*/
int exists_at(int, int, int);
int main(void) {
int i, j, k, rn, cn, d;
char filename[256];
FILE *fp;
/* フラクタル作成ループ*/
printf("Fractalの生成回数(d)を入力.\n");
scanf("%d", &d);
rn = cn = 1;
for (k = 0; k < d; k++) {
sprintf(filename, "frac%d.dat", k);
fp = fopen(filename, "w");
if (fp == NULL) {
printf("ファイルをオープンできません.\n");
exit(1);
}
rn *= p_rn;
cn *= p_cn;
for (i = 0; i < rn; i++) {
for (j = 0; j < cn; j++) {
fprintf(fp, exists_at(i, j, d) ? "0 " : "1 ");
/* cmd画面確認用:putchar(exists_at(i, j, d) ? '*': ' '); */
}
fprintf(fp, "\n");
}
fprintf(fp, "\n");
}
fclose(fp);
return 0;
}
int exists_at(int i, int j, int d) {
if (d == 0) {
return 1;
} else if (exists_at(i / p_rn, j / p_cn, d - 1) == 0) {
return 0;
} else {
return pat[i % p_rn][j % p_cn];
}
}
gnuplot
cd '「.datが入っているディレクトリのパス」'
d = 7
set term gif size 400, 400
set size square
set nozeroaxis
unset colorbox
set palette grey #gray0 = 黒
set title font "Arial,20"
set key center below
do for [i=0:d-1] {
set output sprintf("frac%d.gif", i)
set notics
data = sprintf("frac%d.dat", i)
plot data matrix with image title sprintf("Fractal %d", i)
}
set output
当時のメモも残っていました。
できなかったこと
わからなかったこと
発展
これもこれも同じ原理…? 美しすぎる。。
この記事が気に入ったらサポートをしてみませんか?