描画の基本(1))

これからの2章では,いくつかの簡単なプログラム例を用いて,GRPH1 の中の ユーザーインターフェイスパッケージ SGPACK の基本的な機能を説明しましょ う.まず,この章では,各種出力プリミティブとその属性について述べ,次章 では,座標系・座標変換と出力プリミティブのちょっと進んだ内容について述 べることにします.

出力例の図は縮小されているので線の太さなどの見た目が実際の出力結果と異 なる場合があります.ご注意下さい.FORTRAN プログラムが dcl-x.x/demo/rakuraku/kihon/ にありますので,実際に試してみて下さい.

仮想直角座標系(V-座標系)での基本描画

まず最初のプログラム KIHON1 を見て下さい.

kihon1/kihon1.f

図形を描くためには,まずディスプレイやプリンタなど図形出力装置(デバイ ス)の準備をします.この準備をする時の操作を「オープン」といい,SGOPN というサブルーチンを呼びます.ここで,引数 IWS はワークス テーション番号で,各デバイスに割り当てられた番号です.IWS>0 の ときは画面を横長に使い,IWS<0 のときは画面を縦長に使って図形出 力は 90度回転して表示します.14行めのサブルーチン SGPWSN を呼ぶ と,それぞれの環境で利用可能なワークステーション名のリストが書き出され ます.

[here]章では GROPN だったのが,SGOPN になっていま す.以下の SGFRMSGCLS なども同様ですが,SGxxx が GRPH1 のコントロールルーチンであるのに対して,GRxxx はそれぞれに 対応する GRPH2 のコントロールルーチンなのです.GRxxx ではいくつ かの初期化処理も同時に行なっているので,第[here]章のように GRPH2 のルーチン(例えば,QUICK1 では USGRPH) を使う場合に は,こちらを使います.一方, この章では GRPH1 で閉じたルーチン群で説明 をするので,SGxxx を用いています.

つぎに,SGFRM で新しい作画領域を設定します.DCLではいくつかの座 標系と座標変換が用意されていて,それぞれの座標系で作図ができます.しか し,それらの説明は次章にまわすことにして,ここでは [0,1] [0,1] の仮想直角座標系(これからV-座標系と略記します)だけを陽に考えま しょう.SGFRM を呼ぶことにより,各デバイスの作画できる領域に最大 内接するようにこの仮想直角座標系が設定され,この範囲がとりあえず「ビュー ポート」となります.SLPVPR ルーチンでこのビューポートの枠を描い ています.

図形を構成する基本要素を出力プリミティブといいます.GRPH1 の出力プリミ ティブには,ポリライン(折れ線), ポリマーカー(マーカー列), テキスト(文 字列), およびトーン(多角形のぬりつぶし)の4つがあり,補助的に,アロー (矢印)とライン(線分)のサブプリミティブがあります.結果の図を参照すれば 明らかですが,SGPLV ルーチンで3次関数の折れ線が実線で描かれ, SGPMV ルーチンでは2次関数が・のマーカー列として描かれます.また, SGTXV ルーチンで文字列 'SGTXV' がビューポートの真ん中に描 かれます.さらに,SGTNV ルーチンでは,y=√x と y=x で囲 まれた領域が点々でぬりつぶされます.とりあえず,24行めのサブルーチンコー ルはこのトーンの「おまじない」と思って下さい.これらのプリミティブには それぞれいくつかの属性があり,それらを陽に指定することにより,多種多様 な作図が可能となります.

そして,最後に描画を終了する時の操作を「クローズ」といい,SGCLS ルーチンを呼びます.すべての図形は,デバイスをオープンしてからクローズ するまでの間に描かれることになります.


kihon1.f: frame1

デバイスに出力される図形が複数「ページ」にわたることがありますが,DCL では,ページという言葉の代わりに「フレーム」という言葉を使います.これ は,デバイスによってはページという概念のないもの(例えば,巻物のような 長い紙に出力するようなデバイス)があったり,後述のように物理的な1ペー ジの中に複数のフレームを設定することもあるからです.

ポリラインプリミティブ

折れ線を描くポリラインプリミティブには,次の2つの属性があります.

カラーグラフィクスについてはまとめて第[here]章で説明しますので, ここでは線の太さだけが変えられる出力装置を念頭に置いて説明しましょう.

プログラム KIHON2 では,これらの属性がどのように指定できるかを示 します.正弦曲線を SGPLV ルーチンで描いていますが,一番上の線が ラインインデクスが初期値(1)の場合です(24行め). 次からの3本は,27行めの SGSPLI ルーチンでこの値を4, 6, 8と変えて描いた結果です.ラインイ ンデクスが大きくなるにつれて,線が太くなります.

34行めで SGFRM ルーチンを呼んで次のフレームを設定し,今度はライ ンタイプを変えて描いています.ラインタイプとは,実線, 破線などの線種で すが,1から4までの番号にはあらかじめ次のタイプが決められています.1: 実線, 2: 破線, 3: 点線, 4: 1点鎖線. 初期値は1で,単に SGPLV ルー チンを呼ぶと実線で折れ線を描きます.そういえば,frame1 の結果も実線でし た.40行めの SGSPLT ルーチンでこの値を2, 3, 4と変えて描いた結果 が frame2 です.

ラインタイプには,まだまだいろんな種類があり,ユーザーがそれぞれの好み の線種を指定することが可能です.それは第[here]節で詳しく説 明することにしましょう.

kihon1/kihon2.f


kihon2.f: frame1


kihon2.f: frame2

ポリマーカープリミティブ

マーカー列を描くポリマーカープリミティブには,次の3つの属性があります.

プログラム KIHON3 は,マーカータイプとマーカーサイズの属性を変え て描く例です.

まず最初のフレームですが,第[here]節で見たように,単に SGPMV ルーチンを呼ぶと初期値である・のマーカー列が描かれます. 28行め の SGSPMT ルーチンでマーカータイプを2から7まで変えると,+, , と順に異なるマーカー列が上から下へと描かれていきます. 巻末付録のフォントテーブルにあるマーク・記号・文字などには,それぞれ DCL文字番号が与えられていますが,ここでは SGSPMT で与えるDCL文字 番号に対応するマーカー列が描かれているのです.たとえばITYPE=152 のとき,α のマーカー列を描きます.

次のフレームではマーカーの大きさを変えています.初期値はV-座標系におけ る単位で 0.01 です.2番めからは,SGSPMS ルーチンで大きさを 0.005, 0.01, 0.015, ..., 0.03 と変えた結果です.塗りつぶしたような マーカーもどんどん大きくしていくと,いくつかの線分で構成されていること が見えてきます.このような時には,SGSPMI ルーチンで描くマーカー のラインインデクスを大きくしておくと,線が太くなって塗りつぶした雰囲気 が出てきます.


kihon3.f: frame1


kihon3.f: frame2

kihon1/kihon3.f

テキストプリミティブ

文字列を描くテキストプリミティブには,次のような属性があります.

プログラム KIHON4 で,これらの属性を1つずつ順に変えて文字列を書 いてみましょう.

まず,SGTXV だけを呼んで,デフォルトで 'SGTXV' と書いてみ ました.ラインインデクスの初期値は1, 文字の大きさの初期値はV-座標系に おける単位で 0.05 で,指定した座標に文字列の中心が来ます.

次に,SGSTXI ルーチンで文字を描く線のラインインデクスを変えて, 'INDEX3', 'INDEX5' と書いてみました.大きな値にすると太字 になります.このラインインデクスはポリラインなどのラインインデクスとは 独立に管理されており,他のラインインデクスに影響を与えたりしません.マー カーのラインインデクスも同様です.

また,文字の大きさは SGSTXS ルーチンで変えることができます ('SMALL''LARGE').

文字列の位置ですが,文字列の左端の座標や,右端の座標で指定することもで きます.SGSTXCで-1を指定すると左あわせ('LEFT'), 1で右あわせ ('RIGHT')となります.初期値は0で,中央あわせとなっています.この引数は 整数に限られることに注意して下さい.

文字列を回転させるためには,SGSTXR ルーチンで回転角を指定します. 単位は度で,指定した位置を中心に反時計回りに回転します.やはり,このルー チンでも引数は整数値に限られます。

kihon1/kihon4.f


kihon4.f: frame1

トーンプリミティブ

これまでの出力プリミティブはすべて線分で構成されていましたが,トーンプ リミティブは出力装置の能力に応じて,ハードフィルまたはソフトフィルを切 替えて多角形のぬりつぶしを行ないます.ハードフィルでは実際にデバイスに 依存した「領域のぬりつぶし」を行ないますが,ソフトフィルではそこにドッ トや線分を描くことによって「ぬりつぶし」を実現します.

トーンプリミティブには,トーンパターンという属性があります.トーンパター ンには色とパターンの2つの情報が含まれていますが,カラーグラフィクスに ついては第[here]章で説明しますので,ここではドットや横線, 斜線 などのパターンだけが変えられる出力装置を念頭に置いて説明しましょう.

まず,パターンの種類ですが,3けたのパターン番号で指定します.具体的に は巻末付録のトーンパターンテーブルを参照して下さい.パターン番号の1桁 め(0〜6)は,次のパターンの種類をあらわします.0: ドット,1: 横線, 2: 斜線(右上がり), 3: 縦線, 4: 斜線(左上がり), 5: 格子(縦横), 6: 格子 (斜め). 2桁めは,ドットの大きさや斜線の太さで,0から5まで値が大きくな るにつれてドットは大きくなり斜線は太くなります.3桁めはドットや斜線の 密度で,0から5まで値が大きくなるにつれて密度が高くなります.ただし3桁 めが0のときは何も描かれません.パターン番号として999を指定するとべたぬ りとなります.これらの組合せ以外の整数値はパターンが定義されていません.

さて,KIHON5 のプログラム例ですが,27行めで SGLSET ルーチ ンを用いてトーンプリミティブに関する論理型内部変数 'LSOFTF'.TRUE. としてソフトフィルを選んでいます.そして SGTNV ルー チンで多角形の内部をぬりつぶします.引数の与え方は SGPLV と似て いますが,SGTNV では多角形を定義する頂点の座標を与えます.配列の 最初と最後(ポリラインでは始点と終点)が一致する必要はありません.この例 の左上では6角形をトーンパターンの初期値001(小さく疎なドット)でぬりつぶ しました.右上では,SGSTNP ルーチンでトーンパターン番号を3に指定 してぬりつぶしています.003 ですから,同じ大きさのドットでより密なパター ンです.左下は 601 で斜め格子の例です.

SGTNV で指定する多角形は単連結領域である必要はありません.右下の ように多角形の辺同志が交差する「ねじれた多角形」でも,その図形によって できる閉領域を全てぬりつぶします.

kihon1/kihon5.f


kihon5.f: frame1


Back to Main


Latex Source


地球流体電脳倶楽部 : 95/6/9 (Version 5.0)

NUMAGUTI Atusi <a1n@gfdl.gov>
Last Modified: Thu Aug 31 13:11:24 EDT 1995