%表題   ごくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{そしてジャンプ}
\Dchapterhead

これまでとにかく簡単に2次元平面内の軌跡図や分布図を描く方法を紹介して
きましたが, この章ではもう少しグラフィクスの基本的な概念を理解して,応
用力をつけることにしましょう.
\vspace{1em}

まず, 第\ref{s:step_usgrph}節で宿題となっていた, 「正規化変換」に関し
て説明します. これらを理解すると, 描画領域内の任意の場所に自分で図の縦
横比を決めて作画したり, 対数座標のグラフを描いたりできるようになります.

%-----------------------------------------------------------------------
\section{基本概念(4): 正規化変換}
\label{s:jump_ntr}

グラフ用紙に何かのデータをプロットする時のことを思い浮かべてください.
まず, 直角一様座標か対数座標かのグラフ用紙を用意し, これからプロットし
ようとするデータと, グラフ用紙の目盛りの数をにらんで「一目盛りいくらに
しよう」と考えるはずです. このようにして実際のデータの数値とグラフ用紙
の目盛りとを対応づけるわけですが, このような操作をDCLでは「正規化変換」
と呼びます.
\vspace{1em}

前章で使った次のサブルーチン・コールを, 「おまかせ」でなく自分で陽に指
定することを考えましょう.
\begin{quote}
{\tt
      CALL USSPNT( NMAX, X, Y ) \\[-1.5mm]
      CALL USPFIT               \\[-1.5mm]
      CALL GRSTRF
}
\end{quote}
は, 第1章のプログラム {\tt HOP} の場合, 次と同じになります.
\begin{quote}
{\tt
      CALL GRSWND( -100., 100., 5.999, 6.001 ) \\[-1.5mm]
      CALL GRSVPT(   0.2,  0.8,   0.2,   0.8 ) \\[-1.5mm]
      CALL GRSTRN( 1 )                         \\[-1.5mm]
      CALL GRSTRF
}
\end{quote}
ユーザーの使っている座標系でグラフに描きたい範囲を「ウインドウ」と呼び
ますが, 上の「おまかせ」では {\tt USSPNT} ルーチンで {\tt X} と {\tt
Y} の最小値・最大値を求め, {\tt USPFIT}で切りの良い値にしてウインドウ
を設定しています. {\tt USSPNT}はウインドウ情報を指定する代わりに, これ
からプロットしたいデータそのものを与えて, これらがすべてウインドウ内に
納まるようにするものです. この例のデータでは {\tt
(UXMIN,UXMAX,UYMIN,UYMAX)} = {\tt (-100.,100.,5.999,6.001)} ですから,
この範囲でウインドウを指定するには, {\tt GRSWND} ルーチンでこれらの値
を陽に与えます. 第1章の軌跡図(\pageref{f:hop}ページ)で, 軌跡のまわりに
少し余白を与えようと思うと, これらの範囲を大きめにとれば良いことになり
ます(次節のプログラム {\tt JUMP1} 参照).
\vspace{1em}

次に, このウインドウをV-座標系(実際に作画できる領域に最大内接する正方
形で$[0,1] \times [0,1]$で規格化された描画領域. 第\ref{s:step_marker}
節参照)のどの範囲に対応させるかを考えて, これを「ビューポート」としま
す. ビューポートとは, V-座標系で通常座標軸が描かれる矩形の領域のことで
す. 「おまかせ」では {\tt (VXMIN,VXMAX,VYMIN,VYMAX)} = {\tt
(0.2,0.8,0.2,0.8)} の範囲をビューポートとしますが, ここでは{\tt
GRSVPT} ルーチンでこれらの値を陽に与えます.
\vspace{1em}

これで, ウインドウとビューポートの四隅は対応させることが出来ましたが,
ウインドウ内の各点をビューポート内の点に対応させる必要があります. 線形
に対応させるか, 対数をとって対応させるかなどの任意性がありますから, 具
体的に変換関数を決めなければなりません. 「おまかせ」では直角一様座標で
すから, {\tt GRSTRN} ルーチンで変換関数番号を1と指定します.
\vspace{1em}

このように設定されたパラメータの値は, 変換関数を確定するルーチン {\tt
GRSTRF} ルーチンを呼ぶことで有効になります. {\tt GRSWND} などで値を設
定しただけでは何も変わらず, {\tt GRSTRF} が呼ばれてはじめて正規化変換
が具体的に決められるのです.

\begin{itemize}
\item {\tt GRSWND(UXMIN,UXMAX,UYMIN,UYMAX)} [ウインドウの設定] \label{GRSWND}
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt UXMIN}, {\tt UXMAX} & (実数型) & ウインドウの $x$ 座標の
                                            最小値と最大値. \\
      {\tt UYMIN}, {\tt UYMAX} & (実数型) & ウインドウの $y$ 座標の
                                            最小値と最大値.
    \end{tabular}
  \end{quote}

\item {\tt GRSVPT(VXMIN,VXMAX,VYMIN,VYMAX)} [ビューポートの設定] \label{GRSVPT}
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt VXMIN}, {\tt VXMAX} & (実数型) & ビューポートの $x$ 座標の
                                            最小値と最大値.(初期値は0.2と0.8) \\
      {\tt VYMIN}, {\tt VYMAX} & (実数型) & ビューポートの $y$ 座標の
                                            最小値と最大値.(初期値は0.2と0.8)
    \end{tabular}
  \end{quote}

\item {\tt GRSTRN(ITR)} [正規化変換の変換関数番号の設定] \label{GRSTRN}
  \begin{quote}
    \begin{tabular}{llp{11cm}}
      {\tt ITR} & (整数型) & 変換関数番号.
      1:直角一様座標, 2:片対数($y$軸)座標, 3:片対数($x$軸)座標,
      4:両対数座標. (初期値は1)
    \end{tabular}
  \end{quote}

\item {\tt GRSTRF} [正規化変換の確定] \label{GRSTRF2}
  \begin{quote}
    ウインドウ, ビューポート, および変換関数を設定したあとで, このルー
    チンを呼び, 正規化変換を確定する.
  \end{quote}
\end{itemize}

{\tt USSPNT} ルーチンを使ってウインドウを決めたり, 初期値を使うことで
ビューポートや変換関数番号の設定を省略する場合には, {\tt USPFIT} ルー
チンを呼んで正規化変換の設定をおまかせすることになります. 一方, {\tt
GRSWND}, {\tt GRSVPT}, {\tt GRSTRN} の3つを自前で呼んでこれらを設定し
た場合には, あと何も必要ありません. いずれの場合にも, {\tt GRSTRF}ルー
チンを呼んで正規化変換を確定します.

\begin{itemize}
\item {\tt USPFIT} [「おまかせ」で正規化変換のパラメータを決める]
       \label{USPFIT2}
  \begin{quote}
    {\tt USSPNT} で設定されたデータをもとにウインドウを決め, それ以外の
    パラメータも陽に指定しなければそれぞれの初期値を使って, 正規化変換
    を設定する.
\end{quote}
\end{itemize}


%-----------------------------------------------------------------------
\section{異なる大きさの図形}

大きい図形の隣に小さな図形を並べる時には, {\tt GRSVPT} を使って陽にビュー
ポートを設定することになります. 次のプログラム {\tt JUMP1} を御覧下さ
い. まず, ビューポートを {\tt (0.15,0.45,0.65,0.95)} として, 描画範囲
の左上に正方形の図を描きます. 内容は, 第\ref{s:hop_kihonsousa}節のプロ
グラム {\tt HOP} と同様のリサジュー図です. 次に, 43行めで {\tt GRFIG}
ルーチンを呼んで2番めの図を描くために必要な初期化をします. {\tt GRFRM}
と違って, 次のフレームには移りません. そして, ビューポートを {\tt
(0.15,0.95,0.1,0.5)} として下の図を描きます. こうすれば, 縦横比が1:2の
長方形の図となります. 内容は, 第\ref{s:step_marker}節の分布図と同様の
ものです.

\begin{itemize}
\item {\tt GRFIG} [新しい図を描くために必要な初期化をする] \label{GRFIG}
  \begin{quote}
      一つのフレーム内に複数の図を描くとき, 2つ目以降の図を描き始める
      前に, そのつど, このルーチンを呼ぶ.
  \end{quote}
\end{itemize}

\begin{center}
\Depsf[10cm]{jump/jump1_0001.eps}\\
{\bf jump1.f: frame1}\\
\end{center}

\Dproginput{jump/jump1.f}


%-----------------------------------------------------------------------
\section{対数座標}
\label{s:u1d1_log}

次のプログラム {\tt JUMP2} は両対数座標のグラフを描く例です. {\tt
GRSTRN} ルーチンで正規化変換の変換関数番号を4に指定します.
\vspace{1em}

対数座標軸の描画も {\tt USDAXS} ルーチンにおまかせ下さい.  ここで,
{\tt USSTTL} ルーチンで指定する文字列ですが, '{\tt |}', '{\tt "}' など
の制御文字を使うと上付や下付の添字も描けます.

\begin{itemize}
\item {\bf 添字モードの制御文字}
  \begin{quote}
    \begin{tabular}{lp{11cm}}
      '{\tt |}'  & 上付添字の始まり \\
      '{\tt \_}' & 下付添字の始まり \\
      '{\tt "}'  & 上付または下付添字の終わり \\
    \end{tabular}

    注意: 文字列が添字で終る場合でも, 最後に必ず '{\tt "}'を入れて通常
    の文字モードに戻すこと.
  \end{quote}
\end{itemize}

\Dproginput{jump/jump2.f}

\begin{center}
\Depsf[10cm]{jump/jump2_0001.eps}\\
{\bf jump2.f: frame1}\\
\end{center}
