Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年3月9日に更新

第2章57 キャッシュを利用した図形描画

イチからゲーム作りで覚えるC言語
第2章56 三角関数 : PREV
NEXT : 第2章58 キャッシュ、メモ化を使用してのプログラム高速化 :

概要

以前バッファ領域を確保するメリットについて確認していきました。 画面出力のためのバッファを用意して、図形描画を行う手順を確認します。

コード

このプログラムは幅40 x 縦10の文字サイズを画面に見立てて、 複数の円を描画して出力します。

 
draw_diagram.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SCREEN_WIDTH 40
#define SCREEN_HEIGHT 10

// 円をバッファに描画する
void drawCircle( double cx, double cy, double r, char *buf) {
    for ( int y = 0; y < SCREEN_HEIGHT; y++) {
        for ( int x = 0 ; x < SCREEN_WIDTH ; x++ ) {
            if ( r > sqrt((x-cx)*(x-cx) + (y-cy)*(y-cy)) ) {
                 buf[y * SCREEN_WIDTH + x] = 1;
            }
        }
    }
}
// バッファの中身をすべて画面に出力
void outputscreen( char *buf) {
    for ( int y = 0; y < SCREEN_HEIGHT; y++) {
        for ( int x = 0 ; x < SCREEN_WIDTH ; x++ ) {
            printf("%d", buf[y * SCREEN_WIDTH + x]);
        }
        printf("\n");
    }
}
int main () {
    char *buf = (char*)calloc(SCREEN_WIDTH * SCREEN_HEIGHT, sizeof(char));
    drawCircle(  5, 3, 4, buf);
    drawCircle( 17, 1, 9, buf);
    drawCircle( 35, 8, 3, buf);
    outputscreen(buf);
    free(but);
}

バッファを確保して、描画する前に、複数の図形(今回は円のみ)をバッファへ書き込み、 最後に画面の中身を出力する、という流れです。実行すると下のような結果がえられます!

実行結果
0001111101111111111111111100000000000000
0011111111111111111111111100000000000000
0011111111111111111111111100000000000000
0011111111111111111111111100000000000000
0011111111111111111111111100000000000000
0011111111111111111111111100000000000000
0001111100111111111111111000000001111100
0000000000011111111111110000000001111100
0000000000001111111111100000000001111100
0000000000000111111111000000000001111100

0 と 1 が並んでますが、 1 の部分が円で描画した部分です。

プログラムの流れ

以下の順番で動作するプログラムです。

  1. 画面のバッファ確保
  2. バッファに対して円を描画。円の範囲内なら バッファの指定の位置に "1" を描画する
  3. バッファの内容を画面に出力。

画面のバッファサイズはプログラムの冒頭で define 文により定義しています。

 
draw_diagram.c
#define SCREEN_WIDTH 40
#define SCREEN_HEIGHT 10

以降のプログラム内では画面バッファサイズはこの定数を使用しています。

8行目では、渡された画面バッファに対して、中心点(cx,cy)、半径 r の円を描画しています。

 
draw_diagram.c
void drawCircle( double cx, double cy, double r, char *buf) {

円の内側だったら整数の 1 を代入することで、円の内側のみデータを上書きしています。 ある点(x,y)が円の内側か、外側にあるかの判定方法は、前回の記事で詳細に記述しているので、 興味がございましたら、見ていただけるとうれしいです。

 
draw_diagram.c
void outputscreen( char *buf) {

18行目で、渡されたバッファの中身をすべて出力しています。

あとがき

このように 横×縦サイズのバッファを用意して、バッファの中身(画像でいえばドット単位)で 処理を書いていけば、画像処理ができます。

今回は非常にシンプルな例ですが、この考えを基礎にして、 gimpやphotshop などで実現する、「ぼかし」画像フィルタ等のフィルタ類や画像を編集するアプリケーションを自作することもできます。

参考文献

  • 特になし
イチからゲーム作りで覚えるC言語
第2章56 三角関数 : PREV
NEXT : 第2章58 キャッシュ、メモ化を使用してのプログラム高速化 :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第4章3 C言語コンソール上で迷路脱出プログラム・迷路の自動生成

#C11仕様#C言語#ゲームプログラミング✎ 2021-05-15
C言語のコンソールゲームで迷路脱出ゲームプログラムの作り方を確認します。迷路は自動生成されます
広告領域
追従 広告領域
目次
第2章57 キャッシュを利用した図形描画
第2章57 キャッシュを利用した図形描画
概要
概要
コード
コード
プログラムの流れ
プログラムの流れ
あとがき
あとがき
参考文献
参考文献
Nodachisoft © 2021