2001.4.23 KPC 情報技術科 関谷
MS-DOS版 C言語コンパイラのグラフィックス関数の違いを吸収して、12個の標準ライブラリ関数とその仕様を河西朝雄が1992年5月に決めた。(河西朝雄、C言語によるはじめてのアルゴリズム入門、技術評論社、1992.5.25初版、第8章-pp.313-408)
Glib.hの主な特徴は次の3点である。
そのGlib.hを使って、河西は以下の機能を実現している。
詳細は、テキストを参照のこと。
なお、河西は、「Visual Basicによるはじめてのアルゴリズム入門」(1999年6月、技術評論社刊)8章グラフィックスで、VBでのWindowsグラフィックスを示している。
Slsは平林によるWindowsグラフィックス用のライブラリである。(No.1の平林雅著,Windows95プログラムを10倍簡単に作るを参照)。
Slsの上に、上記の河西のGlib.hを移植したものが、Glibwv.hグラフィクス・ライブラリである。MoveとTurn、2D、3Dなどのグラフィックス・プログラミングが、Windows上で実現できる。
2次元図形処理の基本プログラム例として、以下の例題/練習問題を紹介する。
1)Move とTurnでは、例題56 正n角形を描く(n=3〜9)
練習問題56 渦巻き模様
2)2次元座標変換では、例題57 対称図形
例題57 対称複写をビューを使って同じ描画を繰り返した例(C言語ソースプログラム) と実行例
練習問題57 回転・拡大コピーをビューを使って描画を繰り返した例(C言語ソースプログラム)と実行例
例題を参考に、皆さんの描きたい図形データなどを用意して、プログラムを改造し、作品を作りなさい。
図形処理のNo.2Webページとして、各自のWebサイトにアップロードしなさい。Webページの内容は、考察、ソースリスト、実行グラフィックス画面(圧縮済み)とします。
画面の圧縮には、Wordなどを使うとよい。
注1) 画面のハードコピーとWordへの貼りつけ・圧縮保存の手順は以下のとおり。(窓全体なら、3−4は省略できる)
1 作図したグラフの画面をアクティブにします。(窓の選択です。)
2 Alt キーを押したまま,PrintScreenキーを押して, クリップボードに取り込みます。
3 アクセサリのペイントを起動して,カーソルを左上に移します。( 既にある場合は,すべてを選択して, 切り取り( 削除) してから,
上記の 2をすること。カーソルの移動をします)
4 ペイントで,編集−貼り付けを実行します。
5 次に, このなかの必要部分の図を,選択・コピーします。
6 Wordに貼り付ける。大きさや配置などが変更できます。
7 Wordで, 「Webページとして保存」で各自のホームドライブの科目のフォルダに保存する。ファイル名.filesフォルダに拡張子jpgのファイルができる。これをWebページのイメージファイルとして利用すること。
注2) Webページの作り方については、関谷のWebページの「個人ホームページの作成と更新」のページを参照のこと。なお、Windows2000での最新の教室環境での扱いについては、数値解析2001のNo.1ページも参照のこと。
(ローカルのホームページフォルダは、c:\でなく、各自のサーバのホーム(H:)ドライブに作ること。)
作業としては、今回分のWebページの作成と、index_htmlファイルの変更−今回のページに対するリンクを作る−が必要になる。
レポートには、結果の図をどのように作図したかを説明して欲しい。(プログラム名やその内容、実行でのデータなどです)。symbol()関数を使って、図形の上部に表示するのが望ましい。
そして、作図の元になっている図形の2次元座標変換についての考察をすること。
Wordなどに画面のPrintScreen(クリップボード)を貼り付けると、印刷時に背景が真っ黒になってしまう。描画した線などが分かりにくい。そのため、一度ペイントに貼り付けた後で、色の反転をしてそれを再度コピーして、Wordに貼り付けることもできる。
しかし、これは面倒である。slsの長方形を排他的論理和で塗りつぶす関数rectfillXOR()を最後に呼べば、色の反転をすることが出来る。これについては、No.1実習で解説していたが、Webでも書いた。
2次元座標変換(対称移動、平行移動、回転移動、拡大・縮小)式は、河西の8.2節に解説がある。
これらの変換式については、変換前のある点(x0,y0)を原点からのベクトルの成分表示と考えると、変換後の成分(x、y)は、前のそれぞれの成分ごとの回転による座標を加えることで求まる。これは、三角関数の加法定理を使うものよりも分かりやすい。なお、2Dでの回転は、3Dでのz軸回りの回転に相当する。
2次元座標変換は、Glibwv.hをもとに、河西の8.2節-C言語での関数mirror(),rotate(),multi()などを自作する-で実現できた。
これに対して、Java2Dでは、AffineTransformクラスとして、準備されており、単にそれらのメソッドを指定するだけで使えるようになっている。
(中山茂著、Java2グラフィックスプログラミング入門、技術評論社、1999.3、pp.228-236)
小生の移植では、図8.4での仮想物理座標系(原点をスクリーン左下)を使わず、原点は左上隅として、ビューポートの左下隅と右上隅を指定するようにしている。
ウィンドウ・ビューポート変換をしない単純なタートルグラフィックス機能のみをslsに移植した関数turtle.hをslsに追加している。これを使った例題56、練習問題56のプログラム例をIドライブのsekiya\図形処理フォルダにコピーしている。
ビューポートを変えることで、同じ図形データでの描画処理をしても、表示される大きさを変えることが出来る。(例題57での実行例を参照のこと。)今回の3次元処理での例のように、違った処理結果の表示も並べて表示できる。
このように、Glibwv.h自体が、2次元座標変換を利用している。これらの自作関数を準備しておけば、それを使うことで、図形処理が相当に便利になる。
(注) 河西のテキストのglib.hをslsを使ってGlibwv.hに移植したが、slsに移植する際に引数を追加した関数があり、全く互換にはしていない。その点で、テキストのプログラムのままでは、コンパイルエラーになったりして、解りにくくなっている。