#3
by かずま » 5年前
1次元配列ではなく、3次元配列にすると分かりやすくなると思います。
コード:
#include <stdio.h>
#define WIDTH 320 // 画像の横のサイズ
#define HEIGHT 240 // 画像の縦のサイズ
#define R 0
#define G 1
#define B 2
int main(void)
{
unsigned char pixels[HEIGHT][WIDTH][3];
for (int j = 0; j < HEIGHT; j++) { // 全ピクセルを単一色に塗りつぶす
for (int i = 0; i < WIDTH; i++) {
pixels[j][i][R] = 100;
pixels[j][i][G] = 155;
pixels[j][i][B] = 255;
}
}
for (int j = 0; j < HEIGHT; j++) {
pixels[j][j][R] = 0; // 左上から右下への斜線
pixels[j][j][G] = 0; // 色は黒
pixels[j][j][B] = 0;
pixels[j][HEIGHT - j + 1][R] = 0; // 右上から左下への斜線
pixels[j][HEIGHT - j + 1][G] = 0; // 色は黒
pixels[j][HEIGHT - j + 1][B] = 0; // 2ピクセル右にずれている
}
//ppm形式で画像を書き出す
FILE *fp = fopen("hoge01.ppm", "wb"); // ファイルをバイナリーモードでオープン
if (fp != NULL) {
fprintf(fp, "P6\n%d %d\n255\n", WIDTH, HEIGHT);
// マジックナンバー,幅,高さ, 色の最大値
fwrite(pixels, 1, sizeof pixels, fp); // 画像データ
fclose(fp);
}
return 0;
}
どこが分からないのかを具体的に質問してもらえれば、
もっと丁寧に説明します。
おまけ
円を描くならこんなもんでしょうか?
コード:
#include <math.h> // sqrt
#define PLOT(p, x, y, r, g, b) \
(p[y][x][R] = r, p[y][x][G] = g, p[y][x][B] = b)
const int cx = WIDTH / 2, cy = HEIGHT / 2; // 中心の座標
const int r = cy - 1; // 円の半径(少し小さめ)
const int R = r * sqrt(2) / 2; // 八分の一円を書くのに必要な x の最大値
for (int x = 0; x <= R; x++) {
int y = sqrt(r * r - x * x) + 0.5;
PLOT(pixels, cx + x, cy + y, 0, 0, 0);
PLOT(pixels, cx + x, cy - y, 0, 0, 0);
PLOT(pixels, cx - x, cy + y, 0, 0, 0);
PLOT(pixels, cx - x, cy - y, 0, 0, 0);
PLOT(pixels, cx + y, cy + x, 0, 0, 0);
PLOT(pixels, cx - y, cy + x, 0, 0, 0);
PLOT(pixels, cx + y, cy - x, 0, 0, 0);
PLOT(pixels, cx - y, cy - x, 0, 0, 0);
}
1次元配列ではなく、3次元配列にすると分かりやすくなると思います。
[code]
#include <stdio.h>
#define WIDTH 320 // 画像の横のサイズ
#define HEIGHT 240 // 画像の縦のサイズ
#define R 0
#define G 1
#define B 2
int main(void)
{
unsigned char pixels[HEIGHT][WIDTH][3];
for (int j = 0; j < HEIGHT; j++) { // 全ピクセルを単一色に塗りつぶす
for (int i = 0; i < WIDTH; i++) {
pixels[j][i][R] = 100;
pixels[j][i][G] = 155;
pixels[j][i][B] = 255;
}
}
for (int j = 0; j < HEIGHT; j++) {
pixels[j][j][R] = 0; // 左上から右下への斜線
pixels[j][j][G] = 0; // 色は黒
pixels[j][j][B] = 0;
pixels[j][HEIGHT - j + 1][R] = 0; // 右上から左下への斜線
pixels[j][HEIGHT - j + 1][G] = 0; // 色は黒
pixels[j][HEIGHT - j + 1][B] = 0; // 2ピクセル右にずれている
}
//ppm形式で画像を書き出す
FILE *fp = fopen("hoge01.ppm", "wb"); // ファイルをバイナリーモードでオープン
if (fp != NULL) {
fprintf(fp, "P6\n%d %d\n255\n", WIDTH, HEIGHT);
// マジックナンバー,幅,高さ, 色の最大値
fwrite(pixels, 1, sizeof pixels, fp); // 画像データ
fclose(fp);
}
return 0;
}
[/code]
どこが分からないのかを具体的に質問してもらえれば、
もっと丁寧に説明します。
おまけ
円を描くならこんなもんでしょうか?
[code]
#include <math.h> // sqrt
#define PLOT(p, x, y, r, g, b) \
(p[y][x][R] = r, p[y][x][G] = g, p[y][x][B] = b)
const int cx = WIDTH / 2, cy = HEIGHT / 2; // 中心の座標
const int r = cy - 1; // 円の半径(少し小さめ)
const int R = r * sqrt(2) / 2; // 八分の一円を書くのに必要な x の最大値
for (int x = 0; x <= R; x++) {
int y = sqrt(r * r - x * x) + 0.5;
PLOT(pixels, cx + x, cy + y, 0, 0, 0);
PLOT(pixels, cx + x, cy - y, 0, 0, 0);
PLOT(pixels, cx - x, cy + y, 0, 0, 0);
PLOT(pixels, cx - x, cy - y, 0, 0, 0);
PLOT(pixels, cx + y, cy + x, 0, 0, 0);
PLOT(pixels, cx - y, cy + x, 0, 0, 0);
PLOT(pixels, cx + y, cy - x, 0, 0, 0);
PLOT(pixels, cx - y, cy - x, 0, 0, 0);
}
[/code]