#define IMAGE_WIDTH 256 #define IMAGE_HEIGHT 256 void __fastcall TForm1::FormCreate(TObject *Sender) { int p[IMAGE_WIDTH + 1][IMAGE_HEIGHT + 1]; int x, y; int d; int q; /* 乱数の初期化 */ randomize(); for (y = 0 ; y < IMAGE_HEIGHT + 1 ; y++) for (x = 0 ; x < IMAGE_WIDTH + 1 ; x++) p[y][x] = 0; /* 初期分割数を2にする */ d = IMAGE_WIDTH/2; /* 初期分割地点を乱数で決める */ for (y = 0 ; y < IMAGE_HEIGHT + 1 ; y += d) for (x = 0 ; x < IMAGE_WIDTH + 1 ; x += d) p[y][x] = random(256); /* 各部分を2分割していく */ for ( ; d >= 1 ; d /= 2) { for (y = 0 ; y < IMAGE_HEIGHT + 1; y += d) { for (x = 0 ; x < IMAGE_WIDTH + 1; x += d) { /* 分割点を回りの点の平均から求める                * そして、その平均に乱数を足し合わせる * 1回のループで3点求めている */ if (x < IMAGE_WIDTH && y < IMAGE_HEIGHT) p[y + d/2][x + d/2] = (p[y][x] + p[y][x + d] + p[y + d][x] + p[y + d][x + d])/4 + random(d*2) - d; if (x < IMAGE_WIDTH) { if (y == 0) p[y][x + d/2] = (p[y][x] + p[y + d/2][x + d/2] + p[y][x + d])/3 + random(d) - d/2; else if (y == IMAGE_HEIGHT) p[y][x + d/2] = (p[y][x] + p[y - d/2][x + d/2] + p[y][x + d])/3 + random(d) - d/2; else p[y][x + d/2] = (p[y][x] + p[y - d/2][x + d/2] + p[y + d/2][x + d/2] + p[y][x + d])/4 + random(d*2) - d; } if (y < IMAGE_HEIGHT) { if (x == 0) p[y + d/2][x] = (p[y][x] + p[y + d/2][x + d/2] + p[y + d][x])/3 + random(d) - d/2; else if (x == IMAGE_WIDTH) p[y + d/2][x] = (p[y][x] + p[y + d/2][x - d/2] + p[y + d][x])/3 + random(d) - d/2; else p[y + d/2][x] = (p[y][x] + p[y + d/2][x - d/2] + p[y + d/2][x + d/2] + p[y + d][x])/4 + random(d*2) - d; } } } } /* 1ドットごとを白と青のグラデーションで表示する */ for (y = 0 ; y < IMAGE_HEIGHT ; y++) for (x = 0 ; x < IMAGE_WIDTH ; x++) { q = p[y][x]; if (q < 0) q = 0; if (q > 255) q = 255; Image1->Canvas->Pixels[y][x] = (TColor)((255 << 16) + (q << 8) + q); } }