USPACKを一工夫

この章から,上位ルーチン群である GRPH2 の各パッケージについて解説しま す.

まず,自動スケーリングルーチンパッケージ USPACK ですが,すでに第 [here]節などで見たように USGRPH ルーチンでデータを 簡単にグラフ化することができます.このパッケージの主な機能は,次の2つ です.

  1. データの最大値と最小値を調べて,適切な正規化変換を設定する.
  2. 現在設定されている正規化変換に対して,適切な目盛及びラベル 間隔を計算して,座標軸を描く.
座標軸を描くルーチンは独立に呼ぶこともできるので,簡単に座標軸を描くユー ティリティとして使うことも可能です.第[here]節で紹介したよ うにコンターを描く UDPACK などと組み合せて使うと便利です.

なお,実際の折れ線グラフの描画は UUPACK, 座標軸やタイトルの描画は UXPACK/UYPACK/UZPACK に依存しています.ここで,DCL全体で使用する内部変 数「未定義値」をうまく使うと,より簡単に一次元図が描けるようになります.

タイトルを描く

[here]節などで見たように,USGRPH ルーチンを使うと, 容易に折れ線グラフが描けます.しかし,座標軸にタイトルや単位をつけてお かないと,後で何のグラフだったのかわからなくなってしまいます.次の USPAC1 のプログラム例のように,USSTTL を使えば,座標軸のタ イトルや単位を簡単に描くことができます.4つの引数は,順に,x 座標の タイトル,単位,y 座標のタイトル,単位,です.これらを付けたくない時 には,1文字以上の空白文字を指定します.

なお,これらのタイトルや単位は GRFRM, GRFIG により初期化さ れます.同じタイトルで沢山の図を描きたい時には USISET で内部変数 'IRESET' を0にしておけば,タイトルの設定は1度で済みます.

uspack/uspac1.f


uspac1.f(uspac3.f): frame1

USGRPHの分解

ここで,プログラム USPAC1 で呼んだ USGRPH サブルーチンがどのようなルーチンで構成されているか,見てみましょう. 実は,

CALL USGRPH( N, X, Y )
というサブルーチン・コールは,次の5つのサブルーチンを順に呼ぶことと同 じなのです.
CALL USSPNT( N, X, Y )
CALL USPFIT
CALL GRSTRF
CALL USDAXS
CALL UULIN( N, X, Y )
データを自動的にスケーリングするためには,まず,描きたいデータすべての なかから最大値と最小値を見つける必要があります. サブルーチン USSPNT がこれを行ないます.つぎの USPFIT ルーチンでは,これらの データの最大値・最小値を切りの良い数値に丸めてウインドウを決め,ほかの 正規化変換のパラメータも「おまかせ」で決めます.そして,GRSTRF ルーチンで正規化変換を確定します.

ここで,「おまかせ」の中身を見てみましょう.

まず,MATH1 の SYSLIB パッケージが管理する内部変数 RUNDEF のお話 です.これはDCL全体で使用する内部変数のひとつで,GLRGET/GLRSETルー チンによって参照/変更できます. RUNDEF は「ユーザーが陽に指定し ていない」ことを表す実数値で,「未定義値」と呼びます.初期値は-999. です.

さて,この未定義値 RUNDEF ですが,GRFRM ルーチンで新しい作 画領域を設定する際に使われます.GRFRM を呼ぶと,ウインドウ,ビュー ポート,および変換関数番号の正規化変換に関する変数に RUNDEF が代 入され,これらが未定義状態になります.ここで,USSPNTUSPFIT を呼ぶと,ウインドウについては最大値・最小値を切りの良い数値に 丸めて設定し,それ以外の未定義状態にある変数には次の初期値を設定します:

ビューポート:   (0.2, 0.8, 0.2, 0.8)
変換関数番号:    1(直角一様座標)
当然ながら,USPFIT ルーチンの前に GRSWND, GRSVPT, ま たは GRSTRN でこれらの変数を設定していると,それは未定義状態では なくなっているので,その値のまま GRSTRF ルーチンで確定されます.

GRSTRF ルーチンの次の USDAXS は「おまかせ」で座標軸を描く ルーチンです.次章以降で説明する座標軸ルーチンを使っているのですが,す でに見たように座標軸ラベルがデータに合わせて自動的に付けられます(第 [here]節,quick2.f).

折れ線を描いているのは,UUPACK の UULIN ルーチンです.基本的には, SGPACK のポリラインプリミティブに対応するものですが,次節以降で具体的に 見るように別の機能が付け加えられています.

複数のデータを1つのグラフに描く

この章のはじめに紹介した USPAC1 のプログラムでは,一つのグラフに 一つのデータをプロットしましたが,複数のデータを折れ線の属性を変えなが ら1つのグラフに描いてみましょう(USPAC2).

まず,前節で紹介した USSPNT ルーチンを3回呼んで XY0, Y1, Y2 のデータのなかから x と y の最大値と最小値 を見つけ,USPFITGRSTRF ルーチンで正規化変換を確定しま す.そして,つぎの USSTTLUSDAXS で座標軸を描きます.

最後に,UUSLNTUUSLNI のサブルーチンで折れ線の属性(線種 と線の太さ)を変更しながら,UULIN ルーチンで折れ線を描きます. こ れら UUPACK のサブルーチンの動作は,この場合には SGPACK の SGPLU ルーチンなどと同じです.(便利な機能は次節の例で示します.)

uspack/uspac2.f


uspac2.f: frame1

等間隔データをおまかせにする

これまでのプログラム USPAC1USPAC2 では,x 座標値の配 列を宣言して等間隔に値を代入し,f(x)型の一次元図を描きましたが,これ はちょっと大げさな気もします.ここで,未定義値 RUNDEF をうまく使 うと,プログラムが簡単になります.次のプログラム USPAC3USPAC1 と同じ図を描くプログラムですが, x 座標値は等間隔なので, UUPACK におまかせします.

まず,19行めで RUNDEF の値を参照し,22行めの USGRPH ルーチ ンで X を指定するかわりに RUNDEF を指定します.このように, X は定義されていないと宣言すると,USGPRH は x 座標値がウ インドウの幅いっぱいに等間隔にならんでいるものと解釈してグラフを描きま す.このとき,USGRPH が呼ばれる前に x 方向のウインドウは決まっ ていないといけませんから,GRSWND ルーチンで x 方向だけを陽に与 えています.ここでも,y 方向は未定義にして,正規化変換の確定は USGPRH ルーチンにおまかせしています.実行結果は,前の USPAC1 の 場合と全く同じです.

uspack/uspac3.f

次のプログラム USPAC4 では,USSPNTUULIN などのルー チンで Y を指定するかわりに RUNDEF を指定して,y 方向に 等間隔なデータを描きます.ここで,UUMRK ルーチンはポリマーカープ リミティブに対応するもので,UUSMKT, UUSMKI, UUSMKSで このパッケージで使うマーカーの属性(種類,描く線の太さ,大きさ)を設定で きます.USSPNT ルーチンを使ってウインドウを決め,ビューポートの 設定は初期値に頼りますので,GRSTRF ルーチンの前に USPFIT を呼んでいることを再確認しておきましょう.

uspack/uspac4.f


uspac4.f: frame1

この章で紹介した正規化変換のおまかせ確定は,「らくらくDCL」の他の章で は使っていません.教育的な配慮を優先したからで,正規化変換の内容を陽に 意識してもらいたいからです.しかし,この章で「おまかせ」の意味がはっき り分かったら,これを積極的に使って何も問題ありません.より簡単にプログ ラムが書けることでしょう.


Back to Main


Latex Source


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

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