%表題   らくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{USPACKを一工夫}
\Dchapterhead
\label{c:uspack}

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

まず, 自動スケーリングルーチンパッケージ USPACK ですが, すでに第
\ref{s:quick_line}節などで見たように {\tt USGRPH} ルーチンでデータを
簡単にグラフ化することができます. このパッケージの主な機能は, 次の2つ
です.
\begin{enumerate}
  \item データの最大値と最小値を調べて, 適切な正規化変換を設定する.
  \item 現在設定されている正規化変換に対して, 適切な目盛及びラベル
        間隔を計算して, 座標軸を描く.
\end{enumerate}
座標軸を描くルーチンは独立に呼ぶこともできるので, 簡単に座標軸を描くユー
ティリティとして使うことも可能です. 第\ref{s:quick_con}節で紹介したよ
うにコンターを描く UDPACK などと組み合せて使うと便利です.
\vspace{1em}

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


%-----------------------------------------------------------------------
\section{タイトルを描く}

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

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

\Dproginput{uspack/uspac1.f}

\begin{center}
\Depsf[10cm]{uspack/uspac1_0001.eps}\\
{\bf uspac1.f(uspac3.f): frame1}\\
\end{center}


%-----------------------------------------------------------------------
\section{{\tt USGRPH}の分解}

ここで, プログラム {\tt USPAC1} で呼んだ {\tt USGRPH}
サブルーチンがどのようなルーチンで構成されているか, 見てみましょう.
実は,
\begin{quote}
{\tt
      CALL USGRPH( N, X, Y )
}
\end{quote}
というサブルーチン・コールは, 次の5つのサブルーチンを順に呼ぶことと同
じなのです.
\begin{quote}
{\tt
      CALL USSPNT( N, X, Y ) \\[-1.5mm]
      CALL USPFIT            \\[-1.5mm]
      CALL GRSTRF            \\[-1.5mm]
      CALL USDAXS            \\[-1.5mm]
      CALL UULIN( N, X, Y )
}
\end{quote}
データを自動的にスケーリングするためには, まず, 描きたいデータすべての
なかから最大値と最小値を見つける必要があります.  サブルーチン {\tt
USSPNT} がこれを行ないます. つぎの {\tt USPFIT} ルーチンでは, これらの
データの最大値・最小値を切りの良い数値に丸めてウインドウを決め, ほかの
正規化変換のパラメータも「おまかせ」で決めます. そして, {\tt GRSTRF}
ルーチンで正規化変換を確定します.
\vspace{1em}

ここで, 「おまかせ」の中身を見てみましょう.
\vspace{1em}

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

さて, この未定義値 {\tt RUNDEF} ですが, {\tt GRFRM} ルーチンで新しい作
画領域を設定する際に使われます. {\tt GRFRM} を呼ぶと, ウインドウ, ビュー
ポート, および変換関数番号の正規化変換に関する変数に {\tt RUNDEF} が代
入され, これらが未定義状態になります. ここで, {\tt USSPNT} と {\tt
USPFIT} を呼ぶと, ウインドウについては最大値・最小値を切りの良い数値に
丸めて設定し, それ以外の未定義状態にある変数には次の初期値を設定します:
\begin{quote}
  ビューポート: \ \ (0.2, 0.8, 0.2, 0.8) \\
  変換関数番号: \ \  1 (直角一様座標)
\end{quote}
当然ながら, {\tt USPFIT} ルーチンの前に {\tt GRSWND}, {\tt GRSVPT}, ま
たは {\tt GRSTRN} でこれらの変数を設定していると, それは未定義状態では
なくなっているので, その値のまま {\tt GRSTRF} ルーチンで確定されます.
\vspace{1em}

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

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


%-----------------------------------------------------------------------
\section{複数のデータを1つのグラフに描く}

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

まず, 前節で紹介した {\tt USSPNT} ルーチンを3回呼んで {\tt X} と {\tt
Y0}, {\tt Y1}, {\tt Y2} のデータのなかから $x$ と $y$ の最大値と最小値
を見つけ, {\tt USPFIT} と {\tt GRSTRF} ルーチンで正規化変換を確定しま
す. そして, つぎの {\tt USSTTL} と {\tt USDAXS} で座標軸を描きます.
\vspace{1em}

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

\Dproginput{uspack/uspac2.f}

\begin{center}
\Depsf[10cm]{uspack/uspac2_0001.eps}\\
{\bf uspac2.f: frame1}\\
\end{center}

\vspace{1em}

%-----------------------------------------------------------------------
\section{等間隔データをおまかせにする}
\label{s:step_lime}

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

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

\Dproginput{uspack/uspac3.f}
\vspace{4em}

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

\Dproginput{uspack/uspac4.f}

\begin{center}
\Depsf[10cm]{uspack/uspac4_0001.eps}\\
{\bf uspac4.f: frame1}\\
\end{center}


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