ここでは、コンピュータ上で、プログラムで作図する方法、きわめて簡素なコンピュータグラフィックについて体験してみます。
コンピュータ上で作図するには、いくつか方法があります。
たとえば、
- お絵かきソフトで描く。
- CSVで出力して、表計算ソフトでグラフにする。
- 直接画面に画像を描く。
- 画像/描画データをプログラムで出力して、別のソフトで表示する。
といった方法があります。
今回は、直接的に結果がわかる三つ目の方法を試してみます。
とはいえ、この方法は一番、普遍性がありません(グラフなどが困難なお絵かきソフトを除いて)。
基本的に、画面に何かを描く方法は、
- コンピュータそのもの
- その上で動くOS(基本ソフト、Windows, Linuxなど)
- その上で動くグラフィックシステム
- その上で動く描画用のライブラリ(手続きを集めたもの)
に依存します。
そのため、具体的な「やりかた」については深入りせず、2次元で線画を描くための方法について、体験してみることを主とします。
今回使用する手段は、
- X Window System
Linux, UNIX などで広く使われるシステム。
特徴として、作図したいソフトと、実際に描画するソフトが別で、その間をネットワークで通信するため、ずっと離れたのコンピュータの画面にも描画できる(もちろん、同じ目の前のコンピュータで使うことが普通)。
今回は、MS-Windows上で動作するXのプログラム、ASTEC-Xをつかう。
(結果的に、自前のプログラム→AXTEC-X→Windows→画像表示装置の制御ソフト(ドライバ)と指示が伝達され、描画される)
- グラフィックライブラリ
EGGX
Xに対して、C言語やFORTRANなどで気楽にお絵かきできるようにしたもの。
です。
いずれも(本来のXとEGGX)、
学院大学KNOPPIX EduTGには用意されているので、KNOPPIXさえ動けば自宅でも試せます、一応。
準備
 |
スタートメニュー→ASTEC-X |
 |
起動すると右下のタスクトレイに小さなX印 |
 |
graph.cの実行結果 |
まず、eggxを一式持ってきます。
「マイコンピュータ」→「Users」→「Kumagai」→「Computer」→「eggx」
の中にあるファイル(8個)をすべて、自分のcygwin/programフォルダにコピーします。
コンパイルできるかを確かめます。
$ egg -o graph graph.c
いままで、gccを使っていましたが、グラフィックをいじるときはいろいろと設定が必要なので、それをまとめてやってくれるのが「egg」です。
(eggを実行するとやたらと長いgcc〜が表示される)
次に、ASTEC-Xを起動します。
スタートメニュー→「ASTEC-X」→「ASTEC-X」
で起動します。
※注意:デスクトップにもUNIXと書かれたXアイコンがありますが、これではありません。
正常に起動すると右下に「X」アイコンがでます。
この操作は、普段はログオン後一度行えば、ログオフするまでは必要ありません。
なお、一見なにもウインドウが出てこないので、おかしいなと思って2回起動したりすると、2回目以降は文句を言われます。
さて先ほどのプログラムを実行してみます。
$ graph
すると、右の3枚目の画像のようなグラフが表示されると思います。
(他のウインドウの下に出てしまうことが多いので、そのときはタスクバーで選ぶか、掘り出してください)
プログラムを止めるには、
- 今回のプログラムに関しては、作図したウインドウで何かキーを押す(Enterとか)
- graphを実行したところで、Control-Cして無理にとめる
- 作図したウインドウの[×]で閉じる(graphを実行した側で切れたとか文句を言われるけど気にしない)
をしてください。
挑戦してみよう
 |
draw.cの実行結果 |
 |
とりあえずこれを目標 |
 |
図の座標 |
 |
元気があれば、このくらい目指してみましょう(プログラム的に。美的には真似してはいけないレベル...。) |
ここでは、自分で描画してみましょう。
まず、先ほどコピーした中にある draw.c もコンパイルして実行してみます。
$ egg -o draw draw.c
$ draw
$
右上の図のように、正方形のウインドウが開いて、黒線、赤線、青い矢印、記号が10個ほど表示されたと思います。
黒の線は、下1/4くらいのところに水平に引かれていますが、この線は、draw.cの
newcolor(win,"black");
drawline(win,0,100,399,100);
で作られています。newcolorは、以下「black」の色で作図せよ、drawlineは、座標(0,100)から座標(399,100)まで線を引け、という指示です。
座標とは、画面上の位置を表す数値で、右方向の位置(x座標)と、上方向の位置(y座標)を表しています。
今回は、左右も上下も0〜399で、左下が(0,0)で、右上が(399,399)です。
(グラフの座標と基本的に同じ、ただし、コンピュータの画面の座標としては左上が(0,0)で下方向がプラスのものが多い)
基本的には、コンピュータ上の作図はすべて、座標で行われます。
ので、自分で出力したいものを座標で考えて、それを指定すればいいわけです。
EGGXでは基本的な図形がいくつか描画できます。
マニュアルにこと細かにかいてありますが、使いそうな主なものとしては、
- newcolor(win,"色");
色指定。
一般的な「英語」の色は使える。black, white, red, blue, green, pink, brown, darkgreen など。
- circle(win,中心x,中心y,横半径,縦半径);
楕円がかける。
- drawsym(win,x,y,大きさ,種類);
グラフに打つような点がかける。
- drawline(win,始点x,始点y,終点x,終点y);
本来のeggxは連続的に引くためのline()が用意されているので、それを使って一本ごとに線を引きやすくしたもの。
などがあります。なお、必ず最初に「win」がありますが、これは「どのウインドウに描くか」を指定するためのもので必須です。
さて、ここからは、試行錯誤してください。
draw.cを適当にコピー、名前を変えて、自分のファイルを作ってください。
その上で、「//以下お絵かき」の下から「なにかキーを押したら終了」の上までの間を好きに書き換えてください。
それ以外はいじらない方が無難です。
挑戦課題:クリスマスツリー(?)
まずは、右の上から2番目の図のような、シンプルな木を目指しましょう。
- 茶色はbrown, 緑はdarkgreen (greenだとケバイ?)
- とりあえず、この図だと地面は(0,50)-(399,50)に引いてみた。
一発でうまくいくとは思わず、適当にdrawlineして、思ったとおりいかなかったら考えてみる、というのが手頃です。
(実際、この図はそうやって作った)
そこまでできたら、いろいろやってみましょう。
とりあえず、右3枚目は、
- ツリーをそれっぽくしてみた。
(けど、絵心がないのでバランスが悪い(汗))
- さっそくrand()をつかって、雪らしきモノをばらまいてみた。
※randを使うときは、冒頭で #include <stdlib.h>する。
※rand()%400 でx、yをつくると、全面にばらまかれる
とかやってみました。
自分なりに工夫した作品ができたら、見せびらかしてください。
楽しみにしています。
このページ、ここで終了。