質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

3回答

2678閲覧

図形を塗りつぶす関数を使いたい

mag_m

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/07/17 17:06

編集2020/07/18 17:23

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/07/17 17:26

C言語で、標準で画面に描画できるグラフィックライブラリ(関数群)は存在しません。ご提示のコード中のDrawLineやWriteBmpとは、どのようなライブラリをお使いになっているのでしょうか。有名なDXライブラリっぽくもありますが、HgBoxFillと言う関数名は、以下の京都産業大学様のサイト内でもヒットしました。 http://www.cc.kyoto-su.ac.jp/~mmina/bp1/handyGraphicFunctions.html http://www.cc.kyoto-su.ac.jp/~ogihara/Hg/products/guide0.64.pdf その辺りを明確にしないと回答をいただくのは難しいと思います。 また、質問文中のソースコードは、 https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にして、適切に、見やすく表示するようにしてください。
mag_m

2020/07/18 16:57

すみません。やはり見当違いな質問をしていたようです。 もう一度質問内容を修正いたします。
bboydaisuke

2020/07/19 06:58

ソースコードは ``` で囲ってくれませんか。これを読んで欲しいなんてあんまりです。
guest

回答3

0

ええと、WindowsのAPIを使わず(なぜ?)、BMP形式ベースの仮想的なイメージデータに、点を打つ関数を利用して中を塗りつぶした長方形を描きたいということですね。

まず、提示されている(枠線のみの)長方形なら、そもそもデジタル微分解析(DDA)を使う必要はないですよね。y軸が変化しない線分を描く関数(DrawLineHとか)とx軸が変化しない線分を描く関数(DrawLineVとか)を作成し、それらを組み合わせればよろしい。

中を塗りつぶす長方形も、DrawLineHを「長方形の2つのy座標の小さい方から大きい方まで」繰り返し描けばできてしまいます。

そうではなく、任意の角度に傾いた長方形の中を塗りつぶしたいということであれば、多角形の塗りつぶしに使われる「Solid Area Scan Conversion」を使ってください。

投稿2020/07/19 06:19

編集2020/07/19 06:19
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

簡単に言うと、関数HgBoxFillの内容は、「すでにHandyGraphicの作者が作っている」ので、あなたが作る必要がありません。あなたはその関数を実行する(呼び出す)だけで使えます。

ドキュメントをざっと見た限り、HgBoxFillを使うにあたっては、関数HgOpenで描画用のウィンドウを開いて、その中に描画することになるようです。あなたのmainにはそれが書いてありませんね。

投稿2020/07/18 00:00

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mag_m

2020/07/18 16:59

見当違いな質問をしていたようで、もう一度質問内容を修正いたします。 申し訳ありません。
guest

0

HandyGraphic という Mac 用のライブラリを使って長方形を描いてその中身を塗りつぶしたい、ということですよね。

そしてそのライブラリでそれをするには HgBoxFill という関数を呼び出せばいいのだが、関数を呼び出すということの概念がわからないということですよね。

https://www.cse.kyoto-su.ac.jp/~oomoto/lecture/program/software_install/ を見る限りそれは一般に配布されているものではなくその大学で教育目的で内部で配布されているもののようですから、もしあなたがその大学の学生で課題等でそれを使っているなら、まずは教官やクラスメイトに聞いてみたらいいと思います。

投稿2020/07/17 17:33

bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mag_m

2020/07/18 17:01

「HgBoxFill」というものが一般的に図形を塗りつぶす際に使われる関数と思っていたため、少し誤解を招いた質問をしてしまっていました。 申し訳ありません。 もう一度質問内容を修正いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問