4.プリミティブ(基本作図ルーチン)

4.1 はじめに

デバイスを選択し、ビューポートとウィンドウを定義したら、いよいよ実際にビューポートに描かれるグラフの実体の作図にとりかかることが出来る。本章では、そのうちでもプリミティブ(primitives)と呼ばれる、最も基本的なルーチン群について説明する。PGPLOT には

の4種類のプリミティブがある。これらを実際のプログラムの中で用いる際には、線の色や種類、太さ、記号の種類や文字のフォント(字体)といった様々な属性の指定を伴うことが多い。この属性の仕方については、次の第5章で説明する。

4.2 クリッピング

前述のプリミティブは、ビューポートの境界で切り取られる。すなわち、定義したビューポートの外側にハミ出した部分は、描画されない。このことを、クリッピングと呼ぶ。

このクリッピングの「され方」は、プリミティブによって少しずつ異なる。「線」は、ビューポートの端と交差するところで切り取られる。「記号」は、その中心がビューポートの内側に入れば描かれる。端が入っていても中心がビューポート外にあれば、その記号は描かれない。「文字列」は、文字がビューポートの端にかからない限り、クリッピングされない。そして「閉領域の塗りつぶし」は、ビューポートの端で切り取られる(線と同じ扱い)。

4.3 線を引く

線を引くための代表的なプリミティブ・ルーチンは PGLINE である。このルーチンは、一つの線分、あるいは複数の繋がった線分を引くためのルーチンで、

      CALL PGLINE (N, XPTS, YPTS)

のように CALL する。3つの引数は、各々

を表す。これにより、(XPTS(1),YPTS(1))−(XPTS(2),YPTS(2))−(XPTS(3),YPTS(3))−・・・・・−(XPTS(N-1),YPTS(N-1))−(XPTS(N),YPTS(N)) の合計 N 個の点が順に線分で結ばれる。

また、PGMOVEPGDRAW という2つのルーチンを組み合わせても、PGLINE と同じことができる。これら2つのルーチンでは、プロッタの動作を思い浮かべれば理解しやすいが、常にペンの"現在"位置を意識して線が引かれる。

PGMOVE は、現在の位置から引数で指定した位置まで "ペンを上げて" 移動するためのルーチンで、

     CALL PGMOVE ( XP, YP )

のように CALL する。2つの引数は順に、移動先の x 座標と y 座標である(いずれも実数)。次に、PGDRAW は、現在の位置から引数で指定した位置まで "ペンを下ろして" 移動するためのルーチンで、これにより、2つの点を結ぶ線分が描かれる。

先に示した

     CALL PGLINE (N, XPTS, YPTS)

は、PGMOVEPGDRAW を使って

 
     CALL PGMOVE (XPTS(1), YPTS(1))
     DO I=2,N
        CALL PGDRAW (XPTS(I), YPTS(I))
     END DO

のように書き換えることも出来る。

4.4 記号(グラフマーカ)を描く

グラフマーカとは、十字、点、円といった記号を意味する PGPLOT の用語である。PGPT を使えば、一つ又は複数のグラフマーカを指定した位置に描くことができる。このルーチンは

     CALL PGPT (N, XPTS, YPTS, NSYM)

のように4つの引数を必要とする。これらは順に、

第4引数として指定する数と、描かれる記号の関係は、以下の通り:

Fortran の ICHAR 関数を使うと、書きたい文字の ASCII 配列を得ることが出来る。たとえば、F の文字を書きたい時は、

 
     CALL PGPT (1, 0.5, 0.75, ICHAR('F') ) 

のように CALL すれば良い。

4.5 文字列を書く

PGPLOT で文字列を書く時に用いられる最も単純なルーチンは PGTEXT である。

     CALL PGTEXT (X, Y, 'A text string')

のように用い、これによりワールド座標上で (x,y) の位置を始点とする、水平の文字列 A text string が描かれる。

PGTEXT は実は、より一般的なプリミティブ・ルーチン PGPTXT への窓口となっている。PGPTXT を使うと、文字列の向きや位置揃えを好みに合わせて変更することが出来る。たとえば、

     CALL PGPTXT (X, Y, 45.0, 0.5, 'A text string')

とすると、ワールド座標上で (x,y) の点を中心とする、水平方向に対して 45 度傾いた向きの文字列が描かれる。

PGTEXTPGPTXT では共に、文字列を描く位置をワールド座標系で指定する。しかし例えばグラフに注釈を付ける場合など、ワールド座標ではなくビューポート(デバイス座標)上で文字の位置を指定した方が便利な時もある。PGMTXTはこれを可能とするルーチンである。図にタイトルなどを付ける場合に用いられる PGLAB では、この PGMTXT を呼び出してグラフに注釈をつけている。

文字列についても、その高さや字体など、属性を変更することができる。これについては第5章で詳しく説明するが、Figure 4.2 にも、その例の幾つかを示しておく。

一つ又は複数のグラフマーカ(ただし 0〜32 番目)を文字列の一部として含ませたい場合は、Fortran の CHAR 関数を用いて

     CALL PGTEXT (X, Y, 'Points marked with '//CHAR(17))

のように指定すれば良い。ちなみに、上の例の第3引数に含まれる "//" は、文字(列)同士をつなぐ時の Fortran の文法である。

4.5.1 エスケープ・シーケンス

PGPTXT や、(たとえば PGTEXTPGLAB のように)これ此を内部で呼び出すルーチンでは、書かせたい文字列の中に以下に示すようなエスケープ・シーケンス(escape sequences)を含ませることができる。このエスケープ・シーケンス自体は描かれないが、フォントを変えたり、添え字や肩字を書いたり、あるいは ASCII 文字以外の文字(ギリシャ文字など)を書かせるための命令として解釈される。

すべてのエスケープシーケンスは、バックスラッシュ(\) で始まる。PGPLOT では次のようなエスケープ・シーケンスが定義されている(\ に続く文字は大文字でも小文字でも構わない)。

\u 肩字(上付き字)を開始する。あるいは添え字(下付き字)を終了する
\d 添え字(下付き字)を開始する。あるいは肩字(上付き字)を終了する
\b バックスペース(すなわち、前の文字を描いた後、テキストポインタを進めない)
\fn ノーマル・フォント (1) に切り替える
\fr ローマン字体 (2) に切り替える
\fi イタリック字体 (3) に切り替える
\fs スクリプト字体 (4) に切り替える
\\ バックスラッシュ文字 (\) を描く
\x 掛け算記号
\.
\A オングストローム記号(Å)
\gx x で指定したローマ字に対応するギリシャ文字。Figure 4.3 参照
\mn
\mnn
n または nn (1-31) 番目のグラフマーカ。Figure 4.1 参照
\(nnnn) character number nnnn (1 to 4 digit number) from the Hershey character set; the closing parenthesis may be omitted if the next character is neither a digit nor ``)''. This makes a number of special characters (e.g., mathematical, musical, astronomical, and cartographical symbols) available. See Appendix B for a list of available characters.

4.6 閉領域(多角形、矩形、円)を塗りつぶす

矩形やそれ以外の多角形、円などの閉領域を塗りつぶすためのプリミティブである。塗りつぶしのスタイルや色などは、fill area stylecolor index といった属性を変更することで変えられる。これについては第5章で説明する。

PGPOLY ルーチンは、多角形で定義される閉領域を塗りつぶす時に用いられる。

     CALL PGPOLY (N, XPTS, YPTS)

のように3つの引数をとり、それらは各々

を表す。

多角形の中でも辺が座標軸と平行であるような矩形を描く場合は、PGPOLY を使うよりも PGRECT を使う方が便利である。PGRECT

     CALL PGRECT (X1, X2, Y1, Y2)

のように4つの引数をとり、それらは順に

を表す。

さらに、円を描きたい場合は PGIRC を使うと良い。このルーチンは

     CALL PGCIRC (X, Y, RADIUS)

のように CALL する。3つの引数のうち、最初の2つは中心点の x, y 座標で、最後の引数はワールド座標系における円の半径である。指定したワールド座標系の x, y 方向のスケーリングが異なる場合、円はどちらかの方向につぶれて "楕円" のようになる。


Previous: 第3章  Next: 第5章  目次