質問編集履歴

2

includeとdefineの#を抜きました。何度も訂正申し訳ありません。

2020/07/18 17:23

投稿

mag_m
mag_m

スコア1

test CHANGED
File without changes
test CHANGED
@@ -62,19 +62,21 @@
62
62
 
63
63
 
64
64
 
65
+
66
+
65
- #include <stdio.h>
67
+ include <stdio.h>
66
-
68
+
67
- #include <stdlib.h>
69
+ include <stdlib.h>
68
-
70
+
69
- #include "bmpw.h" /*←このフォルダのプログラム文も載せる必要がありましたらご指摘いただけると嬉しいです。*/
71
+ include "bmpw.h" /*←このフォルダのプログラム文も載せる必要がありましたらご指摘いただけると嬉しいです。*/
70
72
 
71
73
 
72
74
 
73
75
  /* 画像サイズ 640 * 480 (横幅を 4 の倍数として単純化している) */
74
76
 
75
- #define LINE_OFFSET 640
77
+ define LINE_OFFSET 640
76
-
78
+
77
- #define FILE_SIZE (54 + 4 * 256 + 480 * LINE_OFFSET)
79
+ define FILE_SIZE (54 + 4 * 256 + 480 * LINE_OFFSET)
78
80
 
79
81
 
80
82
 

1

HgBoxFillという関数を一般的なものと勘違いしていました。申し訳ありません。

2020/07/18 17:23

投稿

mag_m
mag_m

スコア1

test CHANGED
File without changes
test CHANGED
@@ -2,80 +2,314 @@
2
2
 
3
3
 
4
4
 
5
- 言語で、長方形の中身を塗りつぶすプログラムを作るために、HgBoxFill関数を使用したいのです
5
+ visual StudioでC言語を使っているのすが、長方形の中身を塗りつぶすプログラム書き方わかりません。
6
+
6
-
7
+ 長方形の図形自体は出力できています。
8
+
9
+
10
+
7
- void HgBoxFill(int x, int y, int w, int h, int color)
11
+ int main()
8
12
 
9
13
  {
10
14
 
15
+
16
+
17
+ DrawLine(160, 120, 160, 240, 150);
18
+
19
+ DrawLine(320, 120, 320, 240, 150);
20
+
21
+ DrawLine(160, 120, 320, 120, 150);
22
+
23
+ DrawLine(160, 240, 320, 240, 150);
24
+
25
+
26
+
27
+ /*ここに塗りつぶす関数を書く*/
28
+
29
+
30
+
31
+
32
+
33
+ WriteBmp("output.bmp");
34
+
35
+
36
+
11
37
  }
12
38
 
39
+ 実行のソースコードはこのようになっています。
40
+
41
+ DrawLineの定義は下記のソースコードにあります。
42
+
43
+
44
+
45
+ 見当違いな質問をしていた場合は再度質問内容を変えて投稿しますので、ご指摘いただければ幸いです。
46
+
13
- の中に何を書けばいいのかわかりせん
47
+ よろしくお願いいたし
48
+
49
+
50
+
14
-
51
+ ### 発生している問題・エラーメッセージ
52
+
53
+
54
+
15
-
55
+ ```
56
+
16
-
57
+ エラーメッセージ
58
+
59
+ ```
60
+
61
+ ## 該当のソースコード
62
+
63
+
64
+
65
+ #include <stdio.h>
66
+
67
+ #include <stdlib.h>
68
+
69
+ #include "bmpw.h" /*←このフォルダのプログラム文も載せる必要がありましたらご指摘いただけると嬉しいです。*/
70
+
71
+
72
+
73
+ /* 画像サイズ 640 * 480 (横幅を 4 の倍数として単純化している) */
74
+
75
+ #define LINE_OFFSET 640
76
+
77
+ #define FILE_SIZE (54 + 4 * 256 + 480 * LINE_OFFSET)
78
+
79
+
80
+
81
+ unsigned char file_data[FILE_SIZE]
82
+
83
+ ={ 0x42, 0x4D, 54, 180, 4, 0, 0, 0, 0, 0, 54, 4, 0, 0, 40, 0, 0, 0,
84
+
85
+ 128, 2, 0, 0, 224, 1, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 176, 4, 0};
86
+
87
+ unsigned char *image_data= &(file_data [54 + 4 * 256]);
88
+
89
+
90
+
91
+ /*
92
+
17
- int main()
93
+ * 引数の説明:
94
+
95
+ * const char* file_name 書き出すファイル名
96
+
97
+ */
98
+
99
+ void WriteBmp(const char* file_name)
18
100
 
19
101
  {
20
102
 
21
-
103
+ int i;
104
+
22
-
105
+ FILE *fp;
106
+
107
+ size_t res;
108
+
109
+
110
+
111
+ /* パレットデータの設定 */
112
+
23
- DrawLine(160, 120, 160, 240, 150);
113
+ for (i = 0; i <= 255; i++)
114
+
24
-
115
+ {
116
+
25
- DrawLine(320, 120, 320, 240, 150);
117
+ file_data[54 + i * 4] = i;
26
-
27
- DrawLine(160, 120, 320, 120, 150);
118
+
28
-
29
- DrawLine(160, 240, 320, 240, 150);
119
+ file_data[54 + i * 4 + 1] = i;
30
-
31
-
32
-
120
+
33
- HgBoxFill(160, 120, 320, 240, 150);
121
+ file_data[54 + i * 4 + 2] = i;
122
+
34
-
123
+ file_data[54 + i * 4 + 3] = 0;
124
+
35
-
125
+ }
126
+
127
+
128
+
36
-
129
+ /* ファイルオープン→書き出し */
37
-
38
-
130
+
131
+
132
+
39
- WriteBmp("output.bmp");
133
+ fp = fopen(file_name, "wb");
134
+
40
-
135
+ if (fp == 0)
136
+
41
-
137
+ {
138
+
139
+ printf("Can't open a file '%s'!\n", file_name);
140
+
141
+ exit(EXIT_FAILURE);
142
+
143
+ }
144
+
145
+ res = fwrite(file_data, 1, FILE_SIZE, fp);
146
+
147
+
148
+
149
+ if (res != FILE_SIZE)
150
+
151
+ {
152
+
153
+ printf("Can't write on a file '%s'!\n", file_name);
154
+
155
+ exit(EXIT_FAILURE);
156
+
157
+ }
158
+
159
+ fclose(fp);
42
160
 
43
161
  }
44
162
 
163
+
164
+
165
+ /*
166
+
167
+ * 引数の説明:
168
+
45
- ようなプログラム文で実行がしたいです。
169
+ * int x, y 位置 (それぞれ 0..639, 0.. 479 範囲)
46
-
170
+
47
- DrawLineやHgBoxFillの定義は他のフォルダ書いています。
171
+ * int color 色 (0..255, 0が 黒、255が白)
48
-
49
-
50
-
51
- 見当違いな質問をしていた場合は再度質問内容を変えて投稿しますので、ご指摘いただければ幸いです。
172
+
52
-
53
- よろしくお願いいたします。
54
-
55
-
56
-
57
- ### 発生している問題・エラーメッセージ
58
-
59
-
60
-
61
- ```
62
-
63
- エラーメッセージ
173
+ */
64
-
65
- ```
174
+
66
-
67
- ## 該当のソースコード
68
-
69
-
70
-
71
- void HgBoxFill(int x, int y, int w, int h, int color)
175
+ void SetPixel(int x, int y, int color)
72
176
 
73
177
  {
74
178
 
179
+ if ( x >= 0 && x < 640 && y >= 0 && y < 480)
180
+
181
+ {
182
+
183
+ image_data[x + LINE_OFFSET * y] = color;
184
+
185
+ }
186
+
75
187
  }
76
188
 
77
189
 
78
190
 
191
+
192
+
193
+ void DrawLine(int x0, int y0, int x1, int y1, int color)
194
+
195
+ {
196
+
197
+ /* 以下ではDDA アルゴリズムを用いている。*/
198
+
199
+
200
+
201
+ int x_diff, y_diff, y_rest, x, y;
202
+
203
+
204
+
205
+ if (x1 - x0 < 0)
206
+
207
+ {
208
+
209
+ int swap_store;
210
+
211
+ swap_store = x0;
212
+
213
+ x0 = x1;
214
+
215
+ x1 = swap_store;
216
+
217
+ swap_store = y0;
218
+
219
+ y0 = y1;
220
+
221
+ y1 = swap_store;
222
+
223
+ }
224
+
225
+
226
+
227
+ x_diff = x1 - x0;
228
+
229
+ y_diff = y1 - y0;
230
+
231
+
232
+
233
+ y_rest = x_diff / 2;
234
+
235
+ y = y0;
236
+
237
+
238
+
239
+ if (y_diff >= 0)
240
+
241
+ {
242
+
243
+ /* x を1ずつ増やし、y が増える場合 */
244
+
245
+ /* (x_diff,y_diff) が第1象限 */
246
+
247
+
248
+
249
+ for (x = x0; x <= x1; x++)
250
+
251
+ {
252
+
253
+ SetPixel(x,y,color);
254
+
255
+ y_rest += y_diff;
256
+
257
+ while (y_rest >= x_diff && y <= y1)
258
+
259
+ {
260
+
261
+ SetPixel(x,y,color);
262
+
263
+ y_rest -= x_diff;
264
+
265
+ y++;
266
+
267
+ }
268
+
269
+ }
270
+
271
+ SetPixel(x1,y1,color);
272
+
273
+ }
274
+
275
+ else
276
+
277
+ {
278
+
279
+ /* x を1ずつ増やし、y が減る場合 */
280
+
281
+ /* (x_diff,y_diff) が第4象限 */
282
+
283
+
284
+
285
+ for (x = x0; x <= x1; x++)
286
+
287
+ {
288
+
289
+ SetPixel(x,y,color);
290
+
291
+ y_rest -= y_diff;
292
+
293
+ while (y_rest >= x_diff && y >= y1)
294
+
295
+ {
296
+
297
+ SetPixel(x,y,color);
298
+
299
+ y_rest -= x_diff;
300
+
301
+ y--;
302
+
303
+ }
304
+
305
+ }
306
+
307
+ SetPixel(x1,y1,color);
308
+
309
+ }
310
+
311
+ }
312
+
79
313
  ### 試したこと
80
314
 
81
315