プログラムで作図
\CAPTION\
\CAPTION\
\CAPTION\ \CAPTION\
ここでは、コンピュータ上で、プログラムで作図する方法、きわめて簡素なコンピュータグラフィックについて体験してみます。

コンピュータ上で作図するには、いくつか方法があります。 たとえば、

  • お絵かきソフトで描く。
  • 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さえ動けば自宅でも試せます、一応。

まず、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 もコンパイルして実行してみます。
$ 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をつくると、全面にばらまかれる
とかやってみました。

自分なりに工夫した作品ができたら、見せびらかしてください。
楽しみにしています。 このページ、ここで終了。