%表題   GRPH2 図形処理上位パッケージ
%
%履歴
%\Drireki{
%         91/09/05 林祥介
%         91/12/10 林祥介
%         92/02/11 佐藤正樹
%         92/03/09 塩谷雅人
%         92/04/13 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%         95/04/19 塩谷雅人
%        }
%
%  \Dchapter{使用例 : 2次元量の表示(UDPACK,UEPACK,UGPACK)}
\Dchapterhead
\label{udegpk}
\section{概要}

ここでは UDPACK/UEPACK/UGPACK の基本的な機能を,
いくつかの簡単なプログラム例で示す.
これらの デモプログラムは dcl-x.x/demo/grph2/udegpk の中にあるので,
参考にしていただきたい.
% くわしくは, 第\ref{udpack}, \ref{uepack}, \ref{ugpack}章参照のこと.

なお，UDPACK, UEPACK はU座標系で作画しているので，
後で述べる地図投影にも対応できるが，
UGPACK はV座標系で作画しているため地図投影には対応していない．

\section{等高線図のクイックルック}
\label{u2df01}

2次元データを手早くコンタリングしたいというときには,
サブルーチン{\tt UDCNTR} 1つを呼ぶだけでよい.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df01.eps}\\
{\bf u2df01.f:page1}\\
\end{center}

\vspace{1em}
{\tt UDCNTR}は等高線図を描くだけで, 枠を描いたりはしてくれないから,
この例ではまず, 正規化変換を設定し
({\tt GRSWND}, {\tt GRSVPT}, {\tt GRSTRN}, {\tt GRSTRF}), 
USPACKの中のルーチン{\tt USDAXS}を使っておまかせの座標軸を描画したのちに,
{\tt UDCNTR}を呼んで等高線図を描いている.
{\tt UDCNTR}の引数は, 最初が作画しようとする場を与える2次元配列,
2番目が\.実\.際\.に\.宣\.言\.し\.た配列の第1次元寸法,
3, 4番目がそれぞれ, \.作\.画\.に\.使\.う配列の
第1次元および第2次元寸法である.
この例のように, 宣言した配列をフルに用いて作画するときは,
2番目と3番目の引数は同じになる.
第1次元目の寸法について, なぜこのように2つの引数を指定する必要があるの
かはu2df03.fの例で明らかになる.

\vspace{1em}
UWPACK によって,
格子点座標に関する情報を設定していないときは,
現在設定されているウインドウいっぱいに
等間隔の格子点を設定してコンタリングをおこなう.
つまり, 座標軸の目盛に関係なく, たとえばこの例では,
{\tt P(1,1)} が左下隅, {\tt P(NX,NY)} が右上隅にくるような
等間隔の格子点座標が設定される.
ハッチングやベクトル場の表示に関する
{\tt UETONE}, {\tt UGVECT}についても,
UWPACKを用いていないときは同様にして格子点座標の設定が
おこなわれる.

\vspace{1em}
また, {\tt UDCNTR}だけを呼ぶ, このいちばん簡単な使用例では,
コンターレベルも自動的に決定される.
さらに図の下には, そのコンター間隔が表示される.

\vspace{1em}
\Dproginput{udegpk/u2df01.f}

%-----------------------------------------------------------------------
\newpage
\section{格子点が不等間隔の場合}
\label{u2df02}

{\tt UDCNTR}を呼ぶ前にUWPACKのサブルーチン
{\tt UWSGXA} (X方向)/ {\tt UWSGYA} (Y方向)を呼んで
格子点の座標値をあらかじめ指定しておけば,
不等間隔な格子点座標系でのコンタリングもできる.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df02.eps}\\
{\bf u2df02.f:page1}\\
\end{center}

\vspace{1em}
この例では, u2df01.fと同じ2次元配列を用い,
ただしY方向にはサイン緯度(--1から+1の値を取る)の
座標系を設定してコンタリングをおこなっている.
まず, {\tt UYAXLB}を用いて文字列のラベルを指定し
ながら不等間隔の座標軸を描く.
つぎに, このY方向については{\tt UWSGYA}を用いて
不等間隔の格子点を設定している.
このとき, 格子点座標はU座標系の値で指定する.
X方向については, {\tt UWSGXB}を用い最大値と最小値および格子点数を
指定することによって, 格子点座標に関する情報を設定している.
ただし, 格子点をウインドウいっぱいに設定するようにしているだけなので,
{\tt UWSGXB}を呼ばなくても結果は同じである.

\vspace{1em}
また, {\tt UDGCLB}を呼ぶことによって
コンター間隔を陽に指定して, コンターレベルを生成するすることができる.
さらに, コンターラインにつける数値ラベルのフォーマットは
{\tt UDSFMT}で指定できる.
コンターラインにつけるラベルは, コンターレベルを決定するルーチンの中で
生成されるので, {\tt UDSFMT}はコンターラインを生成するルーチン
( {\tt UDGCLA}や{\tt UDGCLB} )の前に呼ばなければならない.
またここでは, {\tt UDGCLB}で等間隔のコンターレベルを生成したあとで,
コンターレベルの値が0.1のコンターを{\tt UDSCLV}によって
1本だけ補助的に設定している.
{\tt UDSCLV} は新しくコンターレベルを設定するだけでなく,
それまでに設定したコンターレベルについて
その属性を変更することもできる.
なお, コンターレベルは{\tt UDGCLA}を用い,
最小値・最大値およびきざみ値を指定することによって生成することもできる.

\newpage
\vspace{1em}
\Dproginput{udegpk/u2df02.f}

%-----------------------------------------------------------------------
\newpage
\section{配列の一部分を描く}
\label{u2df03}

配列の一部分だけを作画するにはどうしたらよいのだろうか?

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df03.eps}\\
{\bf u2df03.f:page1}\\
\end{center}

\vspace{1em}
u2df02.fと同じ格子点座標で同じ格子点値を持った配列を用い,
経度60$^{\circ}$から300$^{\circ}$,
緯度--60$^{\circ}$から+60$^{\circ}$の部分だけを
描くことを考えてみよう.
u2df02.fと異なる点は,
5, 6番目のパラメータ文で描く範囲を決めるいくつかの定数を定
義していることと, {\tt UWSGXB}, {\tt UWSGYB}, {\tt UDCNTR}の引数の
指定方法が少し違うことである.
(コンターレベルの設定に関する3つのサブルーチンはu2df02.fから除いた. )

\vspace{1em}
配列の一部分を作画するためにはまず, UWPACKを用い,
自分が描きたいと考えている範囲で格子点座標系を設定しなければならない.
この例では, 格子点座標系を,
X方向については{\tt UWSGXB}を使って経度60$^{\circ}$から
300$^{\circ}$まで20$^{\circ}$おきの13点と設定し,
Y方向については{\tt UWSGYA}を使って--60$^{\circ}$から
+60$^{\circ}$に対応するサイン緯度で不等間隔に13点設定している.
こうした上で, {\tt UDCNTR}にわたす最初の引数としては,
この矩形領域の左下$( 60^{\circ}, \sin (-60^{\circ}) )$ に対応する
配列要素(ここではその添字が({\tt IXZ1}, {\tt IYZ1}))を陽に書き,
2番目には実際に宣言した配列の第1次元寸法,
3, 4番目には実際の作画に使う配列の第1次元および第2次元寸法を
与えることによって配列の一部分だけを作画することができる.

\vspace{1em}
この辺の事情を正しく理解するためには,
FORTRANが記憶領域上で配列要素を
どのように順序づけているのかを知る必要がある.
%「MATH1」マニュアルの「概要」部分にこの点に関するくわしい記述が
%あるので参考にして欲しい.
(FORTRANの文法書などを参照のこと.)

\newpage

\Dproginput{udegpk/u2df03.f}

%-----------------------------------------------------------------------
\newpage
\section{とりあえず負の領域にトーンをはる}
\label{u2df04}

サブルーチン{\tt UETONE} 1つを呼ぶだけで,
とりあえず負の領域にトーンをはることができる.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df04.eps}\\
{\bf u2df04.f:page1}\\
\end{center}

\vspace{1em}
この例は, u2df01.fに{\tt UETONE}の1行を付け加えただけのものであるが,
これによって, 現在設定されているウインドウいっぱいに
等間隔の格子点を設定し, 負の領域に斜線のハッチをつけることができる.

\newpage
\Dproginput{udegpk/u2df04.f}

%-----------------------------------------------------------------------
\newpage
\section{トーンパターンを指定する}
\label{u2df05}

u2df04.fの例のように, ただ負の領域に斜線のハッチをつけるだけでは
あまりに芸がない.
もちろんUEPACKでは, トーンをつけるレベルやパターンを指定することができる.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df05.eps}\\
{\bf u2df05.f:page1}\\
\end{center}

\vspace{1em}
この例も, u2df04.fと同じようにコンターとの重ね書きをおこなっているが,
プログラムの構成上大きく異なる点がある.
それは, {\tt SGLSET} (「GRPH1」のマニュアル参照)で
内部変数{\tt 'LSOFTF'}を{\tt .FALSE.}として,
ハードフィルを指定しているために,
座標軸の描画やコンタリングをおこなうよりも前に{\tt UETONE}を
呼んでいることである.
UEPACKのハッチングは「GRPH1」のトーンプリミティブを用いている.
トーンプリミティブは出力装置の能力に応じてハードフィルとソフトフィルとを
切替えることができるが,
出力装置によってはハードフィルによる塗りわけによって
先に描かれた図形が消えてしまうことがある.
u2df04.fの例では, 内部変数{\tt 'LSOFTF'}を{\tt .TRUE.}とし,
ソフトフィルを用いていたので,
そのような不都合が起こらなかった.
しかしこの例では, ハードフィルを指定したので,
{\tt UETONE} を最初に呼んでいるわけである.

\vspace{1em}
トーンの指定は, 必要なレベルの分だけ{\tt UESTLV}を
呼ぶことによっておこなう.
( {\tt UESTLN}というルーチンを用いれば,
複数のレベルを配列で指定することもできる;
また {\tt UDGCLA}, {\tt UDGCLB}と同様のトーンレベル生成ルーチン
{\tt UEGTLA}, {\tt UEGTLB}もある).
最初の2つの引数によってぬりわけるレベルの下限値と上限値を指定し,
最後の引数でトーンパターン番号を指定する.
トーンパターンのリストは「GRPH1」マニュアルに
付されているので参照されたい.
この例の{\tt UESTLV}による第1レベル目の設定のように,
{\tt GL}{\it p}{\tt GET/}{\tt GL}{\it p}{\tt SET}が管理する
内部変数{\tt 'RMISS'}を下限値として使えば
2つ目の引数で与える値以下の領域をぬりわけることができる.
また第3レベル目のように,
{\tt 'RMISS'}を上限値として使えば最初の引数以上の部分を
ぬりわけることができる.
またもちろん, 第2, 3レベル目の設定のように,
あるレベルの上限値と他のレベルの下限値を等しくして,
連続的なぬりわけも可能である.

\newpage
\Dproginput{udegpk/u2df05.f}
%-----------------------------------------------------------------------
\newpage
\section{欠損値格子点の取り扱い}
\label{u2df06}

格子点の値が欠損値のときでも, 欠損値処理の指定をすることによって,
UDPACKやUEPACKは適切な作画をおこなう.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df06.eps}\\
{\bf u2df06.f:page1}\\
\end{center}

\vspace{1em}
この例では, 基本的にはu2df04.fと同じプログラム構成で,
ただし格子点値の一部分を欠損値とし, 欠損値処理の指定を
おこなって作画している.
欠損値処理の指定は, {\tt GLLSET}によって内部変数{\tt 'LMISS'}を
{\tt .TRUE.}とすることによっておこなう.
{\tt P(3,15)} (経度40$^{\circ}$, 緯度50$^{\circ}$に対応) を欠損値とした
例からもわかるように, 欠損値のまわりの格子点を境界として等値線やトーンが
描かれない.

\newpage
\Dproginput{udegpk/u2df06.f}

%-----------------------------------------------------------------------
\newpage
\section{ベクトル場の表示}
\label{u2df07}

2次元格子点上で与えられたベクトルデータのクイックルックには
{\tt UGVECT}を用いればよい.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df07.eps}\\
{\bf u2df07.f:page1}\\
\end{center}

\vspace{1em}
この例では, 基本的にはud2f01.fと同様なプログラム構成で
(ただしベクトル場の生成をおこなった上で), {\tt UGVECT}を呼んでいる.
格子点座標に関する情報を設定していないときには, これまでの
{\tt UDCNTR}や{\tt UETONE}と同じように,
現在設定されているウインドウいっぱいに等間隔の格子点を設定する.

\vspace{1em}
ベクトルの各成分はV座標系(ビューポートの座標系)に
おける単位であたえる.
ただしこの例のようなおまかせ描画のときは,
ベクトルの長さが格子点間隔を越えないようにスケーリング
ファクターが決定され, それを乗じてベクトルが描かれる.
これは, {\tt UG}{\it p}{\tt GET/}{\tt UG}{\it p}{\tt SET}の
管理する内部変数{\tt 'LNRMAL'}が
初期値としては{\tt .TRUE.}
(自動的にスケーリングファクターを決める)となっているためである.
さらに, XとYのスケーリングファクターを同じにするかどうかを決める
内部変数{\tt 'LEQRAT'}が, 初期値として{\tt .TRUE.}となっているので,
XとYのスケーリングファクターは同じになっている.
図の下部マージンには用いられたスケーリングファクターが表示される.

\vspace{1em}
これまでに説明したUDPACKやUEPACKと同様に,
UGPACKにおいても欠損値処理が可能である.
ここでは, Y方向の下端と上端は欠損値となっているので,
{\tt GLLSET}によって内部変数{\tt 'LMISS'}を{\tt .TRUE.}とし
欠損値処理をおこなうよう指示している.

\vspace{1em}
(流れの場は, 単にu2df01.fで用いた場の差分から作ったもので
コリオリのファクターなどは取り込まれていませんので悪しからず. )

\newpage
\Dproginput{udegpk/u2df07.f}

%-----------------------------------------------------------------------
\newpage
\section{等高線とベクトル場の重ね書き}
\label{u2df08}

最後に等高線図とベクトル場を重ね書きした例を示す.

\vspace{1em}
\begin{center}
\Depsf[10cm]{udegpk/u2df08.eps}\\
{\bf u2df08.f:page1}\\
\end{center}

\vspace{1em}
u2df07.fの説明のところでも述べたが,
ベクトルの各成分の単位はV座標系(仮想直角座標系)
における単位で表現する.
ただし実際には, V座標系の単位に変換した配列
を与える必要はなく, スケーリングファクターを与えてやればよい.
このスケーリングファクターは,
内部変数{\tt 'LNRMAL'}が{\tt .TRUE.}(初期値)なら
内部的に決定される;
{\tt .FALSE.}なら内部変数{\tt 'XFACT1'}, {\tt 'YFACT1'}を参照する.
したがって, この例のように
スケーリングファクターを陽に指定する場合は,
{\tt 'LNRMAL'}を{\tt .FALSE.}として
{\tt 'XFACT1'}, {\tt 'YFACT1'}を設定してやればよい.
ここでは, XFACT1=0.025, YFACT1=0.05 であるから,
たとえば, ベクトル (U,V)=(4,1) は,
V座標系単位で (0.1, 0.05) の大きさのベクトルとして表示される.
つまり, スケーリングファクターとは, 「次元量」として与えられたベクトル
の成分を V座標系の単位で表現される矢印の成分に変換するための
比例係数なのである.

\vspace{1em}
またこの例では,
内部変数{\tt 'LUNIT'}を{\tt .TRUE.}としてユニットベクトルを描いている
({\tt .FALSE.}なら描かない; 初期値は{\tt .FALSE.}).
表示するユニットベクトルの大きさはV座標系の単位で
内部変数{\tt 'VXUNIT'}, {\tt 'VYUNIT'} によって設定する.
もしも 「次元量」で指定したいならば
内部変数{\tt 'UXUNIT'}, {\tt 'UYUNIT'} を設定することで
ユニットベクトルを描くこともできる.

\vspace{1em}
図の右下に表示されるユニットベクトルには,
{\tt UGSUT} でタイトルをつけることができる.
なお, 図の下部に表示されるユニットベクトルの大きさ
XUNIT, YUNIT は「次元量」である.
ユニットベクトルの大きさをV座標系の単位で指定した場合はそれぞれ
スケーリングファクターで割った量が表示される.
この例では, VXUNIT=0.05, VYUNIT=0.1 としてあるから,
XUNIT=2, YUNIT=2 が表示されている.

\vspace{1em}
UGPACKが図の下に書くメッセージについては,
ユニットベクトルを描かないときにはスケーリングファクターが表示される;
ユニットベクトルを描くときにはユニットベクトルの大きさが表示される.
ユニットベクトルを描くときにも,
内部変数 {\tt 'LUMSG'} を {\tt .FALSE.} とすることによって
スケーリングファクターの表示に切替えることもできる.
メッセージを何も描かせたくないときには
内部変数 {\tt 'LMSG'} を {\tt .FALSE.} とすればよい.

\vspace{1em}
なお, コンターにつけるラベルの文字高や, 下部マージンに書くメッセージの
文字高を,
{\tt UDPACK}については{\tt 'RSIZEL'}, {\tt 'RSIZET'}を設定して,
また, {\tt UGPACK}については{\tt 'RSIZET'}を設定して
小さめに描画している.

%\newpage
\Dproginput{udegpk/u2df08.f}
