EGGXチュートリアル 3

ウィンドウに座標を設定する

これまでは、ウィンドウ内では左下隅を(0,0)とした2次元座標をとり、左下隅から縦横にそれぞれ何ドット離れているかで位置を指定した。 しかし、計算機シミュレーションの様子を表示させる場合、位置はドット数ではなく対象の物理的な位置で表わしたくなるだろう(mm単位やkm単位かもしれないし、もしかしたら秒単位の時間やあるいはまったく別の単位で表わしたいかもしれない)。 物理的な単位とドット数を換算するようにプログラムを書いてもいいが、eggx_window命令を使えばその換算を自動的にしてくれるように設定できる。 指定はeggx_window(w,x1,y1,x2,y2)のようにし、実数変数の組(x1,y1)でウィンドウ左下隅の座標をまた(x2,y2)で右上隅の座標を与える。

   w=eggx_gopen(100,100);
   eggx_window(w,1,2,3,6);
は、縦横100ドットで開いたウィンドウの左下隅をプログラム中の座標(1,3)に、また右上隅が座標(2,6)に対応させている。

これでは実感できないと思うので、以下のプログラムとその実行結果を比較して、なにが起きているか考えてみること。

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1,w2;
  int i;
  double x,y;

  w1=eggx_gopen(100,100);
  w2=eggx_gopen(100,100);
  eggx_window(w1,2,2,5,8);
  eggx_window(w2,1,1,7,4);

  eggx_drawrect(w1,2,2,2.5,2.5);
  eggx_drawrect(w2,2,2,2.5,2.5);

 eggx_msleep(5000);
}
ふたつのeggx_drawrectではどちらも座標(2,2)を左下隅として幅高さとも2.5の正方形を描いているかのように見えるが、windowの設定が違うために実際には一方は縦長・一方は横長の長方形が描かれる

色を変えて描く

これまでは背景の上に白で図形を描いてきたが、もちろんこの色は好きに変更できる。色は細かく指定できるが、ここでは色を名前で指定するeggx_newcolor命令だけを挙げておく。使い方は背景色のeggx_gsetbgcolorと同じである。

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1;
  int i;
  double x,y;

  w1=eggx_gopen(100,100);
  eggx_window(w1,0,0,4,4);
  eggx_gsetbgcolor(w1,"blue");
  eggx_gclr(w1);

  eggx_newcolor(w1,"red");
  eggx_fillrect(w1,1,1,2,2);
  eggx_newcolor(w1,"white");
  eggx_drawrect(w1,1,1,2,2);

 eggx_msleep(5000);
}
このプログラムは青の背景に赤で塗りつぶした矩形を描き、それを白で縁取りする(先に縁取りを描いてしまうとそこまでが塗りつぶされてしまうことに注意)

直線をひく

直線はeggx_line命令でひく。これを他の図形より後回しにしたのは、使い方が少々違うからである。eggx_lineの動作は「ペンの移動」という概念に近く、指定の位置まで「ペンを紙につけたまま移動」(要するに線がひかれる)するか「ペンを上げて移動」(移動するだけ)のどちらの動作をするかを指定する。また、最後にeggx_lineがよばれた際のペンの位置が記憶されており、eggx_line命令では「どこからどこまで」のうちで「どこまで」だけを指定する。この方法は一本の線をひくだけでもeggx_line命令を2度使わなくてはならないが、折れ線を描くには便利なものである。たとえば

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1;
  int i;
  double x,y;

  w1=eggx_gopen(100,100);
  eggx_window(w1,0,0,4,4);
  eggx_gsetbgcolor(w1,"blue");
  eggx_gclr(w1);

  eggx_line(w1,1,1,PENUP);
  eggx_line(w1,2,1,PENDOWN);
  eggx_line(w1,2,2,PENDOWN);
  eggx_line(w1,3,2,PENDOWN);
  eggx_line(w1,3,3,PENDOWN);
  eggx_line(w1,4,3,PENDOWN);

 eggx_msleep(5000);
}
は階段状の折れ線を描く

課題

  1. eggx_fillarcを使って、「点滅する信号」のようなものを作る
  2. 折れ線を使って、三角形や星型らしきものを描く
  3. 基本図形と折れ線を組み合わせて何かの絵を描く。猫の顔くらいなら、なんとかなるのでは。なお、どうしても多角形の内部を塗りつぶしたい場合は eggx_fillpoly 命令が使える。ただし、多角形の頂点の座標をあらかじめ配列として用意しなくてはならない。

前へ 次へ