前提・実現したいこと
visual StudioでC言語を使っているのですが、長方形の中身を塗りつぶすプログラム文の書き方がわかりません。
長方形の図形自体は出力できています。
int main()
{
DrawLine(160, 120, 160, 240, 150); DrawLine(320, 120, 320, 240, 150); DrawLine(160, 120, 320, 120, 150); DrawLine(160, 240, 320, 240, 150); /*ここに塗りつぶす関数を書く*/ WriteBmp("output.bmp");
}
実行のソースコードはこのようになっています。
DrawLineの定義は下記のソースコードにあります。
見当違いな質問をしていた場合は再度質問内容を変えて投稿しますので、ご指摘いただければ幸いです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
include <stdio.h>
include <stdlib.h>
include "bmpw.h" /←このフォルダのプログラム文も載せる必要がありましたらご指摘いただけると嬉しいです。/
/* 画像サイズ 640 * 480 (横幅を 4 の倍数として単純化している) */
define LINE_OFFSET 640
define FILE_SIZE (54 + 4 * 256 + 480 * LINE_OFFSET)
unsigned char file_data[FILE_SIZE]
={ 0x42, 0x4D, 54, 180, 4, 0, 0, 0, 0, 0, 54, 4, 0, 0, 40, 0, 0, 0,
128, 2, 0, 0, 224, 1, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 176, 4, 0};
unsigned char *image_data= &(file_data [54 + 4 * 256]);
/*
- 引数の説明:
-
const char* file_name 書き出すファイル名
/
void WriteBmp(const char file_name)
{
int i;
FILE *fp;
size_t res;
/* パレットデータの設定 */ for (i = 0; i <= 255; i++) { file_data[54 + i * 4] = i; file_data[54 + i * 4 + 1] = i; file_data[54 + i * 4 + 2] = i; file_data[54 + i * 4 + 3] = 0; } /* ファイルオープン→書き出し */ fp = fopen(file_name, "wb"); if (fp == 0) { printf("Can't open a file '%s'!\n", file_name); exit(EXIT_FAILURE); } res = fwrite(file_data, 1, FILE_SIZE, fp); if (res != FILE_SIZE) { printf("Can't write on a file '%s'!\n", file_name); exit(EXIT_FAILURE); } fclose(fp);
}
/*
- 引数の説明:
-
int x, y 位置 (それぞれ 0..639, 0.. 479 の範囲)
-
int color 色 (0..255, 0が 黒で、255が白)
*/
void SetPixel(int x, int y, int color)
{
if ( x >= 0 && x < 640 && y >= 0 && y < 480)
{
image_data[x + LINE_OFFSET * y] = color;
}
}
void DrawLine(int x0, int y0, int x1, int y1, int color)
{
/* 以下ではDDA アルゴリズムを用いている。*/
int x_diff, y_diff, y_rest, x, y; if (x1 - x0 < 0) { int swap_store; swap_store = x0; x0 = x1; x1 = swap_store; swap_store = y0; y0 = y1; y1 = swap_store; } x_diff = x1 - x0; y_diff = y1 - y0; y_rest = x_diff / 2; y = y0; if (y_diff >= 0) { /* x を1ずつ増やし、y が増える場合 */ /* (x_diff,y_diff) が第1象限 */ for (x = x0; x <= x1; x++) { SetPixel(x,y,color); y_rest += y_diff; while (y_rest >= x_diff && y <= y1) { SetPixel(x,y,color); y_rest -= x_diff; y++; } } SetPixel(x1,y1,color); } else { /* x を1ずつ増やし、y が減る場合 */ /* (x_diff,y_diff) が第4象限 */ for (x = x0; x <= x1; x++) { SetPixel(x,y,color); y_rest -= y_diff; while (y_rest >= x_diff && y >= y1) { SetPixel(x,y,color); y_rest -= x_diff; y--; } } SetPixel(x1,y1,color); }
}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。