演算増幅器

Similar documents
演算増幅器

第3章 OpenGL の基礎

第3章 OpenGL の基礎

( ) 1 1: 1 #include <s t d i o. h> 2 #include <GL/ g l u t. h> 3 #include <math. h> 4 #include <s t d l i b. h> 5 #include <time. h>

コンピュータグラフィックスS 演習資料

演算増幅器

準備 計算結果を可視化するために OpenGL を 利用する. 2

PowerPoint Presentation

PowerPoint プレゼンテーション - 物理学情報処理演習

PowerPoint Presentation

Prog1_6th

1 1. Program 1 OpenCV (OpenCV Sample001) 1 /* 2 - > - > - >VC++ 3 ( ) 4 C:\opencv\build\include 5 ( ) 6 C:\opencv\build\x86\vc10\lib 7 - > - > - > - >

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

2 2 GLUI 2 GLUI 2.1 GLUI GLUI OpenGL OpenGL glut OpenGL glut C++ Linux, Windows (Visual C++, gcc), Macintosh glut glut GUI glut GUI CG glmultmatrix()

j x j j j + 1 l j l j = x j+1 x j, n x n x 1 = n 1 l j j=1 H j j + 1 l j l j E

3D グラフィックス処理の一般過程 1. 3D グラフィックス処理の一般過程

memo

プログラミング基礎

$ ls -l $ ls -l -a $ ls -la $ ls -F $ ls <dirname> <dirname> $ cd <dirname> <dirname> $ cd $ pwd $ cat <filename> <filename> $ less <filename> <filena

2006年10月5日(木)実施

Prog1_12th

Microsoft Word - no202.docx

演算増幅器

#include <stdio.h> 2 #include <stdlib.h> 3 #include <GL/glut.h> 4 Program 1 (OpenGL GameSample001) 5 // 6 static bool KeyUpON = false; // 7 sta

Microsoft Word - no11.docx

練習&演習問題

謗域・ュ逕ィppt

gengo1-12

第1回 プログラミング演習3 センサーアプリケーション

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(12)

Prog1_10th

02: 変数と標準入出力

2 2 2 OpenGL (R,G,B,A) 2.1 OpenGL (x y) width height pixels void glreadpixels(glint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum t

gengo1-12

PowerPoint プレゼンテーション

Microsoft Word - 3new.doc

ポインタ変数

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft PowerPoint - kougi7.ppt

02: 変数と標準入出力

講習No.12

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

Microsoft Word - Training10_プリプロセッサ.docx

プログラミング実習I

Taro-ファイル処理(公開版).jtd

ファイル入出力

02: 変数と標準入出力

ファイル入出力

Microsoft PowerPoint - 11.pptx

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

02: 変数と標準入出力

Microsoft PowerPoint - kougi6.ppt

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

02: 変数と標準入出力

Prog1_15th

02: 変数と標準入出力

Microsoft PowerPoint - kougi8.ppt

Microsoft PowerPoint pptx

Microsoft PowerPoint - 04.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - 計算機言語 第7回.ppt

もう少し詳しい説明 1. アルゴリズムを構築するための 4 枚のサンプル画像を次々と読み込むここで重要なことは画像を順番に読み込むための文字列操作 for 文の番号 i を画像の番号として使用している strcpy は文字列のコピー,sprinf は整数を文字列に変換,strcat は文字列を繋げる

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

slide5.pptx

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft Word - no103.docx

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

プログラミングI第10回

02: 変数と標準入出力

C 言語講座 Vol 年 6 月 26 日 CISC

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

program7app.ppt

/*p7-1-1*/

沼津工業高等専門学校

02: 変数と標準入出力

gengo1-12

講習No.9

2 T ax 2 + 2bxy + cy 2 + dx + ey + f = 0 a + b + c > 0 a, b, c A xy ( ) ( ) ( ) ( ) u = u 0 + a cos θ, v = v 0 + b sin θ 0 θ 2π u = u 0 ± a

C言語講座 ~ファイル入出力編~

02: 変数と標準入出力

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

Microsoft PowerPoint - lec10.ppt

演算増幅器

1) OOP 2) ( ) 3.2) printf Number3-2.cpp #include <stdio.h> class Number Number(); // ~Number(); // void setnumber(float n); float getnumber();

イントロダクション

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

$ pwd /home1/t0/t0903 / / /home1/t0/t0903 / / /home1/t0/t0903 / /... ~ $ ls $ ls -a

PowerPoint プレゼンテーション

< F2D837C E95CF CF68A4A94C5816A2E6A>

ポインタ変数

02: 変数と標準入出力

問 1 図 1 の図形を作るプログラムを作成せよ 但し ウィンドウの大きさは と し 座標の関係は図 2 に示すものとする 図 1 作成する図形 原点 (0,0) (280,0) (80,0) (180,0) (260,0) (380,0) (0,160) 図 2 座標関係 問 2

情報処理演習 B8クラス

Microsoft Word - Cプログラミング演習(9)

ポインタ変数

スライド 1

untitled

Transcription:

スペースインベーダーもどき 1000 行プログラムの参考として スペースインベーダーもどきのプログラムを配布する いくつか習って いないものもあるので 補足の説明を加えていく 文字列の描画 文字の描画は glutbitmapcharacter() を用いる これは以下のようにして利用する int i; char *str = "Display String"; glcolor3f(0.0, 0.0, 0.0); // 色の指定 glrasterpos2f(10, 20); // 座標の指定 for(i = 0; i < strlen(str); i++) // 一文字ずつ描画 glutbitmapcharacter(glut_bitmap_9_by_15, str[i]); // 一文字描画 座標の指定は glrasterpos2f で行い x y 座標を指定する 原点はウィンドウの左下である strlen は文字数をカウントする関数であり string.h が必要となる glutbitmapcharacter() は 1 文字を表示する関数であり 繰り返し処理と併せて用いることで文字列を表示する この関数の第一引数では文字の種類 ( フォント ) を指定する これには 以下のような種類がある フォントの種類 : GLUT_BITMAP_8_BY_13, GLUT_BITMAP_9_BY_15, GLUT_BITMAP_TIMES_ROMAN_10, GLUT_BITMAP_TIMES_ROMAN_24, GLUT_BITMAP_HELVETICA_10, GLUT_BITMAP_HELVETICA_12, GLUT_BITMAP_HELVETICA_18 以下にサンプルプログラムを用意したので 確認しておくこと こちらでは使い勝手がいいように 文字列描画用の関数を定義した この方法での文字列描画は日本語の表示ができない OpenGL が多バイト文字に対応していないためである web で確認したところ どうやら日本語の表示を行うには OpenGL 以外の別のライブラリと組み合わせて行っているようだ これについては授業では行わない #include <string.h> #include <GL/glut.h> #define WINDOW_WIDTH 500 // ウィンドウサイズX #define WINDOW_HIGHT 200 // ウィンドウサイズY void init_opengl(void); void display(void); void resize(int w, int h); void display_string(char *str, void *font); // OpenGLの初期化 // コールバック関数 glutdisplayfunc() 用 // コールバック関数 glutreshapefunc() 用 // 文字列描画 int main(int argc, char *argv[]) glutinitwindowposition(100, 100); // ウィンドウの表示位置の指定 - 1 -

glutinitwindowsize(window_width, WINDOW_HIGHT); // ウィンドウサイズの指定 glutinit(&argc, argv); // GLUTの初期化 glutinitdisplaymode(glut_rgba); // 表示モードの指定 glutcreatewindow("string"); // ウィンドウを生成 glutdisplayfunc(display); // 描画イベントのコールバック関数の設定 glutreshapefunc(resize); // ウィンドウリサイズイベントのコールバック関数の設定 init_opengl(); glutmainloop(); // OpenGLに関する初期化一度だけ呼ばれる // GLUTに関する無限ループ void init_opengl(void) glclearcolor(1.0, 1.0, 1.0, 1.0); // ウィンドウを塗りつぶす色を設定 void display(void) glclear(gl_color_buffer_bit); // ウィンドウを glclearcolor() で設定した色で塗りつぶす // 文字列の表示 glcolor3f(0.0, 0.0, 0.0); glrasterpos2f(10, 200-20); display_string("1. GLUT_BITMAP_8_BY_13", GLUT_BITMAP_8_BY_13); glcolor3f(1.0, 0.0, 0.0); glrasterpos2f(20, 200-40); display_string("2. GLUT_BITMAP_9_BY_15", GLUT_BITMAP_9_BY_15); glcolor3f(0.0, 1.0, 0.0); glrasterpos2f(30, 200-60); display_string("3. GLUT_BITMAP_TIMES_ROMAN_10", GLUT_BITMAP_TIMES_ROMAN_10); glcolor3f(0.0, 0.0, 1.0); glrasterpos2f(40, 200-80); display_string("4. GLUT_BITMAP_TIMES_ROMAN_24", GLUT_BITMAP_TIMES_ROMAN_24); glcolor3f(1.0, 1.0, 0.0); glrasterpos2f(50, 200-100); display_string("5. GLUT_BITMAP_HELVETICA_10", GLUT_BITMAP_HELVETICA_10); glcolor3f(0.0, 1.0, 1.0); glrasterpos2f(60, 200-120); display_string("6. GLUT_BITMAP_HELVETICA_12", GLUT_BITMAP_HELVETICA_12); glcolor3f(1.0, 0.0, 1.0); glrasterpos2f(70, 200-140); display_string("7. GLUT_BITMAP_HELVETICA_18", GLUT_BITMAP_HELVETICA_18); glflush(); void resize(int w, int h) - 2 -

glloadidentity(); // 変換行列を単位行列に設定 // 描画するワールド座標系の範囲を指定 // この場合には x が 0~WINDOW_WIDTH y が 0~WINDOW_HIGHT gluortho2d(0, WINDOW_WIDTH, 0, WINDOW_HIGHT); glviewport(0, 0, w, h); // ウィンドウの描画領域を指定 //======================================================================== // 文字列描画 :str が指す文字列を表示する // // 使用例 :display_string(str, GLUT_BITMAP_9_BY_15); // // フォントの種類 :GLUT_BITMAP_8_BY_13, GLUT_BITMAP_9_BY_15, // GLUT_BITMAP_TIMES_ROMAN_10, GLUT_BITMAP_TIMES_ROMAN_24, // GLUT_BITMAP_HELVETICA_10, GLUT_BITMAP_HELVETICA_12, // GLUT_BITMAP_HELVETICA_18 //======================================================================== void display_string(char *str, void *font) unsigned int i; for(i = 0; i < strlen(str); i++) glutbitmapcharacter(font, str[i]); // 一文字ずつ描画 // 一文字描画 図 1 文字列の描画 半透明描画 半透明描画の行い方を示す 次のプログラム例において 半透明描画に関する処理について太字で示 した 個別の処理の説明は以下である 表示モードを半透明描画に設定 glutinitdisplaymode(glut_rgba); - 3 -

今までに習った半透明を用いない描画でも同様に設定してきた これは色の指定に赤緑青 αの値を用いるという設定である αは次で示す 半透明描画の設定 によって不透明度に扱われる つまり glcolor4f() を用いた色の指定に 1.0 を設定すると完全な不透明になり 0.0 を設定すると完全な透明になる 半透明描画の設定 glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); blend の名前の通り 半透明描画は書き込む場所の色と書き込む図形の色の混合で実現される この関数で混合の割合を決めている 実際には引数の設定で使い分けていくことになるが 慣れないうちはここで示した例に従ってプログラムを作成していけば良いだろう その他の使用方法については各自の調査にまかせる web を活用しなさい 半透明描画を有効にする glenable(gl_blend); この関数を用いて混合処理を有効にする 無効にする関数には gldisable(gl_blend) がある 色の指定 glcolor4f(0.0, 1.0, 0.0, 0.8); 不透明度を含めて指定になる 今までは glcolor3f で RGB を指定したが この場合には 4 つ目の引数が増えた 0.0~1.0 の値を指定すればよい #include <GL/glut.h> #define WINDOW_WIDTH 200 // ウィンドウサイズX #define WINDOW_HIGHT 200 // ウィンドウサイズY void init_opengl(void); void display(void); void resize(int w, int h); // OpenGLの初期化 // コールバック関数 glutdisplayfunc() 用 // コールバック関数 glutreshapefunc() 用 int main(int argc, char *argv[]) glutinitwindowposition(100, 100); // ウィンドウの表示位置の指定 glutinitwindowsize(window_width, WINDOW_HIGHT); // ウィンドウサイズの指定 glutinit(&argc, argv); // GLUTの初期化 glutinitdisplaymode(glut_rgba); // 表示モードの指定 glutcreatewindow("blend"); // ウィンドウを生成 glutdisplayfunc(display); // 描画イベントのコールバック関数の設定 glutreshapefunc(resize); // ウィンドウリサイズイベントのコールバック関数の設定 init_opengl(); glutmainloop(); // OpenGLに関する初期化一度だけ呼ばれる // GLUTに関する無限ループ - 4 -

void init_opengl(void) glclearcolor(1.0, 1.0, 1.0, 1.0); // ウィンドウを塗りつぶす色を設定 glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); // 半透明描画の設定 glenable(gl_blend); // 半透明描画を有効にする void display(void) glclear(gl_color_buffer_bit); glbegin(gl_quads); glcolor4f(0.0, 1.0, 0.0, 0.8); glvertex2f( 0.1, -0.1); glvertex2f( 0.1, 0.5); glvertex2f(-0.5, 0.5); glvertex2f(-0.5, -0.1); glcolor4f(1.0, 0.0, 0.0, 0.8); glvertex2f(-0.1, 0.1); glvertex2f(-0.1, -0.5); glvertex2f( 0.5, -0.5); glvertex2f( 0.5, 0.1); glend(); // 色を RGBA で指定この場合は緑 // 色を RGBA で指定この場合は赤 // 終了 glflush(); void resize(int w, int h) glloadidentity(); gluortho2d(-w / 200.0, w / 200.0, -h / 200.0, h / 200.0); glviewport(0, 0, w, h); 図 2 半透明描画 ビットマップ画像の読み込み ビットマップ画像を読み込んで OpenGL で描画するプログラムについて示す 画像ファイルには他に - 5 -

有名なものとして jpeg や gif といった形式がある ビットマップファイルは普通 無圧縮で使うため 読み込むプログラムを作成するのは比較的楽である ただし ある程度の C 言語のスキルは必要になってくる 処理をまとめたヘッダファイルをこちらで提供するので 現状では使用方法を理解できれば良いだろう 提供するヘッダファイルを用いたプログラム例を次に示す 基本的な使用方法は以下である インクルード use_bitmap.hをインクルードする これをインクルードする前にstdlib.hをインクルードしておく仕様 ヘッダファイル内で動的にメモリを確保するcalloc() 関数を利用しているため ちなみに stdlib.hはglut.hの前に読み込まなければならない これは両方のヘッダファイルにexit() 関数が定義されているため ヘッダファイル use_bitmap.h はインベーダーもどきのサンプルプログラム中のものを使う ビットマップファイル用構造体 BitmapFileData bmp_file1; のようにして ビットマップを扱うための構造体の変数を宣言する 読み込み read_bitmap("image1.bmp", &bmp_file1); のように利用する 第 1 引数は読み込みたいビットマップファイル名 第 2 引数はビットマップ構造体へのアドレスを指定する もちろん指定するファイル名は実行するディレクトリ内になければ読み込みに失敗する ビットマップファイル image1.bmp はインベーダーもどきのサンプルプログラム中のものを使う 描画 glrasterpos2i(50, 120); で描画する座標を指定する gldrawpixels(figure_width, FIGURE_HIGHT, GL_RGBA, GL_UNSIGNED_BYTE, bmp_file1.image_data); 第 1 2 引数は読み込む画像の幅と高さの指定 第 3 引数は描画モードの指定 第 4 引数は描画データ形式の指定 最後の引数は実際に描画を行うデータ列へのポインタである 第 3 4 引数には他にも種類がある このまま利用するか 各自で調査しなさい #include <stdlib.h> #include <GL/glut.h> // glut.h と use_bitmap.h のインクルードの前に必要 #include "use_bitmap.h" #define WINDOW_WIDTH 200 // ウィンドウサイズX #define WINDOW_HIGHT 200 // ウィンドウサイズY #define FIGURE_WIDTH 32 // キャラクタの図の横サイズ #define FIGURE_HIGHT 20 // キャラクタの図の縦サイズ void init_setting(void); // 初期化処理 - 6 -

void init_opengl(void); void display(void); void resize(int w, int h); BitmapFileData bmp_file1; int main(int argc, char *argv[]) init_setting(); // OpenGLの初期化 // コールバック関数 glutdisplayfunc() 用 // コールバック関数 glutreshapefunc() 用 // ビットマップの構造体 // 初期化 glutinitwindowposition(100, 100); // ウィンドウの表示位置の指定 glutinitwindowsize(window_width, WINDOW_HIGHT); // ウィンドウサイズの指定 glutinit(&argc, argv); // GLUTの初期化 glutinitdisplaymode(glut_rgba); // 表示モードの指定 glutcreatewindow("invader modoki"); // ウィンドウを生成 glutdisplayfunc(display); // 描画イベントのコールバック関数の設定 glutreshapefunc(resize); // ウィンドウリサイズイベントのコールバック関数の設定 init_opengl(); glutmainloop(); // OpenGLに関する初期化一度だけ呼ばれる // GLUTに関する無限ループ void init_setting(void) read_bitmap("image1.bmp", &bmp_file1); // ビットマップファイルの読み込み void init_opengl(void) glclearcolor(1.0, 1.0, 1.0, 1.0); // ウィンドウを塗りつぶす色を設定 glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); // 半透明描画の設定 glenable(gl_blend); // 半透明描画を有効にする void display(void) glclear(gl_color_buffer_bit); glrasterpos2i(50, 120); gldrawpixels(figure_width, FIGURE_HIGHT, GL_RGBA, GL_UNSIGNED_BYTE, bmp_file1.image_data); glflush(); void resize(int w, int h) glloadidentity(); gluortho2d(0, WINDOW_WIDTH, 0, WINDOW_HIGHT); glviewport(0, 0, w, h); - 7 -

図 3 ビットマップファイルを利用した描画 ビットマップファイルのピクセルの白い部分については背景色と同じ色になる この部分については不透明度を 0 に設定して 描画しないようにしている use_bitmap.h のファイルの色の読み込む部分でこれを設定しているので 確認しておくこと ビットマップファイルには様々な設定が可能であり このヘッダファイルのプログラムは完全に対応したものではない このプログラムでは読み込めるビットマップファイルは Windows 形式 色数が 24 ビット 非圧縮のものだけに限定している ビットマップファイルについての詳しい情報は以下の Web ページが役に立つ http://www.kk.iij4u.or.jp/~kondo/bmp/ http://www.umekkii.jp/data/computer/file_format/bitmap.cgi 乱数の利用方法疑似乱数を生成する rand() 関数はゲーム制作に良く使われる 例えばある確率で敵がビームを発射したり RPG で敵から受けたり与えたりするダメージの量をある程度の幅を持たせてランダムにするといった場合に利用できる 疑似乱数を用いたプログラムは以下のようになる #include <stdlib.h> int main(void) int a; a = rand() % 10; // a には 0~9 までの数値が格納される if(a < 6) // aが0~5までの6 通りのどれかならば printf("6 割の確率でこの文が表示されています \n"); else // aが6~9までの4 通りのどれかならば printf("4 割の確率でこの文が表示されています \n"); - 8 -

関数 rand() は 0 から最大値 RAND_MAX(#define された定数 ) までの範囲の値について 関数を実行するたびに違う値を生成する この得られた値を % を用いて場合分けすることで 確率をプログラムに導入する この関数は擬似的な乱数を生成するが 上記のような使い方をする上では大きな問題にならない 問題はこのプログラムを数回実行すると確認できるが 毎回同じ結果になってしまうことである 疑似乱数の生成を行うこの関数は特定のルールに従って 決められた処理を行っているため このような結果になる プログラムを実行するたびに結果を変えるためには 次のプログラムのようにする必要がある このプログラムでは乱数生成に用いて初期値を設定している その値は time() 関数によって 現在時間を取得しているものを用いた この方法を使えば プログラムを実行するたびに異なる結果が得られる ちなみに srand をプログラム中で何度も呼び出す必要はない 一度呼び出せば十分である #include <stdlib.h> #include <time.h> int main(void) int a; srand((unsigned int)time(null)); // 乱数の初期化 a = rand() % 10; // aには~までの数値が格納される if(a < 6) // aが0~5までの6 通りの内ならば printf("6 割の確率でこの文が表示されています \n"); else // aが6~9までの4 通りの内ならば printf("4 割の確率でこの文が表示されています \n"); - 9 -