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

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

ただいまの
回答率

88.93%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 319

mag_m

score 1

前提・実現したいこと

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dodox86

    2020/07/18 02: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/19 01:57

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

    キャンセル

  • bboydaisuke

    2020/07/19 15:58

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

    キャンセル

回答 3

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/18 02:44 編集

    http://www7a.biglobe.ne.jp/~ogihara/Hg/hg-jpn.html
    HandyGraphicの利用、再配布は制限なしのようですよ。

    キャンセル

  • 2020/07/19 02:01

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/19 01:59

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

    キャンセル

0

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る