%表題   GRPH1 基本グラフィックルーチンライブラリ
%
%履歴
%\Drireki{
%         90/03/22 塩谷雅人
%         91/09/05 林祥介
%         91/12/12 塩谷雅人
%         92/02/07 塩谷雅人
%         92/03/14 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%         93/10/19 塩谷雅人
%         94/03/17 酒井敏, 塩谷雅人 (5.x版)
%         95/04/21 酒井敏, 塩谷雅人
%        }
%

%-----------------------------------------------------------------------
\section{デバイスとフレーム}

\label{gaiyou.device}

図形を描くためには,
まずディスプレイやプリンタなど {\bf デバイス} の準備をする必要がある.
その準備をする操作を「オープン」という.
そして, 最後に描画を終了する時の操作を「クローズ」という.
すべての図形は, デバイスをオープンしてからクローズするまでの間に
描かれなければならない.
地球流体電脳ライブラリでは, 一度に1つのデバイスをオープンすることがで
きる.
{\bf 同時に2つ以上のデバイスをオープンすることはできない}が,
オープン時にいくつかのデバイスの中の1つを選択できる.
\vspace{1em}

デバイスに出力される図形が複数ページにわたることがあるが,
地球流体電脳ライブラリでは,
ページという言葉の代わりに{\bf フレーム}という言葉を使う.
これは,
デバイスによってはページという概念のないもの
(例えば, 巻物のような長い紙に出力するようなデバイス) があったり,
後述のように物理的な1ページの中に複数のフレームを設定することもあるので,
物理的なページと区別するためである.
\vspace{1em}


グラフィックを使うプログラムの形態は次のようになる.

\begin{Dprogram}
       CALL SGOPN(1)      ! デバイス番号 1 の装置をオープン
       CALL SGFRM         ! フレームを用意
        ........
        ........          ! 1 ページめの描画プログラム
        ........
       CALL SGFRM         ! 改ページ
        ........
        ........          ! 2 ページめの描画プログラム
        ........
       CALL SGFRM
           .
           .
           .
           .
           .
           .
       CALL SGCLS         ! デバイスのクローズ
\end{Dprogram}


%-----------------------------------------------------------------------
\section{座標系と変換}

\label{gaiyou.coordinate}

本ライブラリで使用する座標系には 4 つのレベルがある.
それぞれのレベルには上位レベルから順に U, V, R, W という記号が付けられ,
「U座標系」, 「V座標系」, 「R座標系」, 「W座標系」と
いうように呼ばれる (図 \ref{fig:struct} 参照).
この U, V, R, W という文字は, それぞれ次のような名前に由来するが,
これらの名前が長いので,
以後は単に 「U座標系」などの用語を使うことにする
(さらに UC などとも略記する).

\begin{center}
\begin{tabular}{cll}
U & ユーザ座標系        & User coordinate \\
V & 仮想直角座標系      & Virtual rectangular coordinate \\
R & 正規直角座標系      & normalized Rectangular coordinate \\
W & 装置座標系          & Workstation coordinate \\
\end{tabular}
\end{center}

レファレンスマニュアルの引数の説明でも,
U座標系の座標値は {\tt (UX,UY)} というように,
座標系を表す文字をつけて記述してある.
(正規直角座標系を N 座標系でなく R 座標系と呼ぶのは,
 実変数に関する FORTRAN の規則による.)
\vspace{1em}

\input{gaiyou/struct.tex}

最も上位の U座標系は普通のX-Y座標から地図投影座標まで多くの座標系を含む.
その一つ下位のV座標系には2次元, 3次元のそれぞれ1つずつの直角座標系が
定義されており,
多様なU系の座標はすべてこの2種類の座標系に変換される.
この変換のことを{\bf 「正規化変換」} と呼ぶ.
\vspace{1em}

一方, 最も下位の座標系である W 座標系はデバイス固有の座標系で,
デバイスによって異なる.
これを統一するために, その一つ上位に R 座標系を定義して,
すべてこの R 座標系を経由して W座標系に変換される.
この変換を{\bf 「ワークステーション変換」}と呼ぶ.
R座標系は2次元の直角座標系で,
x軸, y軸 ともに定義域は$[0,1]$ である.
\vspace{1em}

これらの上位2つと下位2つの座標系を結ぶ V座標系から R 座標系への変換は
{\bf 「透視変換」} と呼ばれる.
透視変換はその名の通り, 透視図法すなわち遠近法による変換で,
基本的に3次元のV座標系から 2次元のR座標系への変換である.
2次元のV座標系は, 一旦, 3次元のV座標系に割り付けられてから透視変換
される.
この時2次元のV座標系を割り付ける位置は,
3次元座標の x軸, y軸 または z軸に垂直な任意の平面にとることができる.
これにより, 2次元的に描いた1枚の図を斜めから眺めたような描写が可能にな
る.
\vspace{1em}

初期状態では, 2次元V座標系からの透視変換は恒等変換となっているため,
2次元の座標系を普通に使う限り, 透視変換を意識する必要はないが,
あとで透視変換を使いたくなることも考えて,
V座標系とR座標系は使い分けておいた方が良い.
すなわち, 座標軸などの「図に付随した情報」は,
透視図法で図とともに変換すべき情報なので V 座標系で描画し,
SLPACK の描くページ数やパラメタの数値などのように「紙に付随した情報」
は R 座標系で描画すべきである.
\vspace{1em}

なお, 地図座標系の正規化変換は,
座標の「回転」と「投影」の2段階で行なわれ,
その中間の座標 (U座標系を回転した座標) を T 座標
(Terrestrial coordinate) という.
T 座標はx軸の定義域が$[-180, 180]$, y軸の定義域が$[-90, 90]$の座標系で,
この座標系から各地図投影の定義式に従って変換される.
任意の経線を中央経線としたり, 横軸法や斜軸法の投影をするためには
投影の前に回転操作が必要となる.
\vspace{1em}

T座標系は正規化変換の際の一時的な作業座標系であるので,
これを意識しなければならないことは少いが,
{\bf 地図座標のクリッピングだけは}
U座標系ではなくT座標系で行なわれるので,
この座標系を意識する必要がある.

%-----------------------------------------------------------------------
% \newpage
\section{2次元正規化変換}
\label{gaiyou.ntrf2}

\subsection{座標系の種類}

2次元のU座標系には次のような種類があり,
ユーザーはその中から関数番号で指定する
(略号, または名称から関数番号を返す関数も用意されている).
各座標系は, その種類によって正規化変換に必要なパラメータが異なる.

\begin{itemize}
  \item {\bf 直角直線座標系}
    \begin{center}
	\begin{tabular}{cccp{4cm}}
	   \hline
          番号 & 略号 & \makebox[4.5cm]{名 \hspace{1cm}  称} &     \\
	   \hline
	     1 & U-U & UNI-UNI & 直角一様座標 \\
	     2 & U-L & UNI-LOG & 片対数座標 \\
	     3 & L-U & LOG-UNI & 片対数座標 \\
	     4 & L-L & LOG-LOG & 対数座標  \\
	   \hline
	\end{tabular}
    \end{center}

  \item {\bf 直交曲線座標系}
    \begin{center}
	\begin{tabular}{cccp{4cm}}
	   \hline
          番号 & 略号 & \makebox[4.5cm]{名 \hspace{1cm} 称} &     \\
	   \hline
	     5 & POL & POLAR    & 極座標 \\
	     6 & BPL & BIPOLAR  & 双曲線座標 \\
	     7 & ELP & ELLIPTIC & 楕円座標 (未実装) \\
	   \hline
	\end{tabular}
    \end{center}

  \item {\bf 地図投影座標系}
    \begin{center}
	\begin{tabular}{cccp{4cm}}
	   \hline
          番号 & 略号 & \makebox[4.5cm]{名 \hspace{1cm}  称} & \\
	   \hline
	    10 & CYL & EQDST. CYLINDRICAL & 正距円筒図法     \\
	    11 & MER & MERCATOR           & メルカトル図法 \\
	    12 & MWD & MOLLWEIDE          & モルワイデ図法   \\
	    13 & HMR & HAMMER             & ハンメル図法     \\
	    14 & EK6 & ECKERT 6           & エッケルト第6図法 \\
	    15 & KTD & KITADA             & 北田楕円図法 \\
	    16 & MIL & MILLER             & ミラー図法 \\
	    17 & RBS & ROBINSON           & ロビンソン図法 \\
	    18 & SIN & SANSON/SINUSOIDAL  & サンソン図法 \\
	    19 & VDG & VAN DER GRINTEN    & ファン・デル・グリンテン図法 \\
	    20 & CON & PTOLEMAIC CONICAL  & 正距円錐図法 \\
	    21 & COA & EQ.-AREA CONICAL   & ランベルト正積円錐図法 \\
	    22 & COC & CONFORMAL CONICAL  & ランベルト正角円錐図法 \\
	    23 & BON & BONNE              & ボンヌ図法 \\
	    24 & PLC & POLYCONIC          & 正規多円錐図法 \\
	    30 & OTG & ORTHOGRAPHIC       & 正射図法 \\
	    31 & PST & STEREOGRAPHIC      & 平射図法 \\
	    32 & AZM & EQUIDST. AZIMUTHAL & 正距方位図法 \\
	    33 & AZA & AZIMUTHAL EQ. AREA & 正積方位図法 \\
	    34 & GNO & GNOMONIC           & 心射図法 \\
	   \hline
	\end{tabular}
    \end{center}

  \item {\bf ユーザー定義座標系}
    \begin{center}
	\begin{tabular}{cccp{4cm}}
	   \hline
           番号 & 略号 & \makebox[4.5cm]{名 \hspace{1cm} 称} & \\
	   \hline
	    51  & GTR  & GRIDBASE TRANSFORM & 格子点間の対応で定義する投影法 \\
	    99  & USR  & USER    &ユーザー定義関数 \\
	   \hline
	\end{tabular}
    \end{center}
\end{itemize}

ユーザー定義座標系はユーザーが必要な変換関数を用意するものである.
詳しくは \ref{stpack}節 (STPACK) を参照のこと.
格子点間の対応で定義する投影法については \ref{grph1.gt2dlib} 節を参照のこと．

%-----------------------------------------------------------------------
\subsection{地図投影法}

地球流体電脳ライブラリでは地図投座標も普通のU座標系の
一つとして扱われる.
地図投影法には実にさまざまな種類があり,
すべてを解説するためには1冊の本が必要であるが,
ここでは地球流体電脳ライブラリを利用するために知っておくべき基本的事柄
を解説する.
なお, 地図学の詳しい解説は 政春尋志「地図投影法—地理空間情報の技法」（朝倉書店、2011）
 などを参考にされたい.
\vspace{1em}


地図投影法は基本的に「球面を何らかの方法で2次元平面に投影する」方法で
ある.
実際の地球は完全な球面ではなく回転楕円体に近いので,
厳密な地図投影を行なうためには回転楕円体の表面を平面に投影しなければ
ならない.
しかし, 本ライブラリでは回転楕円体からの投影ではなく,
{\bf 球面からの投影のみをサポートする.}
なお, 投影された図形は投影法によっては3次元的な雰囲気を持つが,
地図投影座標はあくまでも2次元座標であることに注意されたい.
\vspace{1em}

地図投影の多くの図法では幾何学的な方法で球面から平面に投影される.
その際の平面の形状によって次のようにいくつかの図法に分類される.
\begin{center}
\begin{tabular}{cp{12cm}}
  {\bf 円筒図法} & 地球儀をこれに接する円筒の中に位置付け,
		   何らかの方法で経緯線を円筒に投影して,
                   展開する図法. \\
  {\bf 円錐図法} & 地球儀をこれに接する直円錐の中に位置付け,
		   何らかの方法で経緯線を円錐に投影して,
		   展開する図法. \\
  {\bf 方位図法} & 地球儀上の一点でこれに接する平面を設定し,
		   何らかの方法で経緯線をこの平面に投影する図法. \\
  {\bf 便宜図法} & 上記以外の図法.
\end{tabular}
\end{center}
これらの円筒や円錐の軸, または方位図法における接点からの垂線が
地球の自転軸と一致するものを{\bf 正軸法},
直交するものを{\bf 横軸法}, 斜めに交わるものを{\bf 斜軸法}と呼ぶ.
一般に, 円筒図法は全球の表示に向いており,
円錐図法は中緯度の表示に向いている.
\vspace{1em}


地図投影では球面を平面に投影するため,
どうしてもひずみが生じてしまう.
そこで, 多くの図法では {\bf 面積} または {\bf 角度} のどちらかが
保存されるように工夫されている.
原理的に, この二つを同時に保存するような投影は不可能である.
この様な保存性に関する性質によって次のように分類される.

\begin{center}
\begin{tabular}{cp{12cm}}
  {\bf 正積図法} & 地図上のどこでも面積関係が正しく表現される図法. \\
  {\bf 正角図法} & 地図上のどこでも局所的な角度が正しく表現される図法.\\
  {\bf 正距図法} & 経線, 緯線または方位線上で, 長さが正しく表現される
                   図法. \\
\end{tabular}
\end{center}


本ライブラリでは以下のような地図投影がサポートされる.

\begin{itemize}
  \item {\bf 円筒図法}
     \begin{center}
	\begin{tabular}{ccccc}
	   \hline
           番号 & \makebox[4cm]{図 \hspace{1cm} 法}
                                            &  正積  & 正角 & 正距  \\
	   \hline
	    10 & 正距円筒図法               &   ×   &  ×  & 経線  \\
	    11 & メルカトル図法           &   ×   &  ○  &  ×   \\
	    12 & モルワイデ図法             &   ○   &  ×  &  ×   \\
	    13 & ハンメル図法               &   ○   &  ×  &  ×   \\
	    14 & エッケルト第6図法          &   ○   &  ×  &  ×   \\
	    15 & 北田楕円図法               &   ○   &  ×  &  ×   \\
	    16 & ミラー図法                 &  ×  &  ×  &  ×   \\
	    18 & サンソン図法               &  ○   &  ×  &  ×\\
	   \hline
	\end{tabular}
    \end{center}

  \item {\bf 円錐図法}
     \begin{center}
	\begin{tabular}{ccccc}
	   \hline
           番号& \makebox[4cm]{図 \hspace{1cm}  法}
                                            &  正積  & 正角 & 正距  \\
	   \hline
	    20 & 正距円錐図法               &   ×   &  ×  & 経線  \\
	    21 & ランベルト正積円錐図法     &   ○   &  ×  &  ×   \\
	    22 & ランベルト正角円錐図法     &   ×   &  ○  &  ×   \\
	    23 & ボンヌ図法                 &   ○   &  ×  &  ×   \\
	    24 & 正規多円錐図法 &  × &  × &  × \\
	   \hline
	\end{tabular}
     \end{center}

  \item {\bf 方位図法}
     \begin{center}
	\begin{tabular}{ccccc}
	   \hline
           番号& \makebox[4cm]{図 \hspace{1cm}  法}
                                            &  正積  & 正角 & 正距    \\
	   \hline
	    30 & 正射図法                   &   ×   &  ×  &  ×     \\
	    31 & ポーラーステレオ図法       &   ×   &  ○  &  ×     \\
	    32 & 正距方位図法               &   ×   &  ×  & 方位線  \\
	    33 & 正積方位図法     &   ○     &  ×  &  ×   \\
	    34 & 心射図法  &   ×   &  ○   &  × \\
	   \hline
	\end{tabular}
     \end{center}


  \item {\bf その他の図法}
     \begin{center}
	\begin{tabular}{ccccc}
	   \hline
           番号& \makebox[4cm]{図 \hspace{1cm}  法}
                                            &  正積  & 正角 & 正距    \\
	   \hline
	    17 & ロビンソン図法  &   ×   &  ×  &  ×   \\
	    19 & ファン・デル・グリンテン図法（詳細不明） &   ？   &  ？  &  ？ \\
	    34 & 心射図法（詳細不明） &   ？   &  ？  &  ？ \\
	   \hline
	\end{tabular}
     \end{center}

\end{itemize}
\vspace{1em}

ハンメル図法は地図学上,
ランベルト正積方位図法の変種として方位図法に分類されるが,
その形状や用途はむしろ円筒図法に近いので,
ここでは便宜的に円筒図法に分類する.
これらの図法すべてについて, 正軸法, 横軸方, 斜軸法が可能である.
\vspace{1em}

なお, 普通の地図投影法には含まれないが,
正射図法の変形として人工衛星から眺めたような投影法 (Satellite View)
もサポートされている.
普通の正射図法は地球儀を無限遠から眺めたような投影になっているが,
これを有限の位置から眺めたような投影に変形したものである.
%-----------------------------------------------------------------------
\subsection{格子点で指定する投影法}

\label{grph1.gt2dlib}

DCLは、U 座標から V 座標への投影法として、各種直交(曲線)座標や地図投影
などをサポートしている。本投影法は、その一つとして追加された、離散的な
格子点間の対応で定義する投影法である(一方、他の変換は解析的な関数によ
る)。変換番号は 51 である。格子点の間は双線形補間 (bilinear
interpolation) による補間を行う。このため、新設された MATH1 の GT2DLIB 
を用いる。変換の設定はサブルーチン G2SCTR で行う。実際の変換は下位のルー
チンが G2FCTR を呼んで行う(ユーザーは呼ぶ必要なし)。
\vspace{1em}

他の変換と同様、本変換も U 座標において論理的に矩形な2次元の領域を対象
とする。独立変数をξ, ηとするU座標系における格子点$[\xi_i,\eta_j]
(i=1,..,N_x, j=1,..,N_y)$ が、基準となる直交座標系(独立変数x,y)において$
[x_{ij}, y_{ij}] (i=1,..,N_x, j=1,..,N_y)$ である場合に、前者をユーザーにとっ
ての描画領域とし、後者の座標系で画面上に表示する。ここで、$\xi,\eta$はそれ
ぞれi,jのみに依存するのに対し、x, y は両方に依存することに注意せよ。即
ち、この格子はU座標において「矩形」である。
\vspace{1em}

この変換は、地球流体力学的には、格子生成された格子における流体シミュレー
ションの結果を可視化するときなどに、有用である。また、地形に沿った座標
系での計算結果の可視化にも役立つ。本変換は、特別な場合として、ξ＝x ま
たは$\eta=y$の場合に対応できるので、U座標で$\xi=x$として水平方向をとり、
$\eta$に地形に沿った座標、yに高度を取ればよい。
\vspace{1em}

本変換では、U 座標と V 座標を直接対応させるのでなく、C 座標と呼ぶ中間
的な直交座標を介させる。C 座標は Cartesian を語源とし、V 座標に線形に
対応する直交座標である（原点移動と縦・横軸それぞれの伸縮）。C座標は、
曲線座標定義の基準となる直行座標を具現化したものである。基準となる直交
座標系(上記のx,y座標系)は、V座標でなくC座標に対応させ、C 座標からV座標
への変換は、SGPACKの相似変換パラメター CXMIN, CXMAX, CYMIN, CYMAX で指
定する。一方, U 座標から C 座標への変換は、GT2DLIB で行う。
\vspace{1em}

座標軸は C 座標で U[XY]PACK を使って書くことができる。その場合、変換番
号1に切り替えU座標としてC座標を用いればよい。
\vspace{1em}

現在のところ、本変換では線分はV座標において線分となるように引く。この
ため、例えば座標軸に沿った線を一本の線分として書いても、格子の曲がりが
反映されない。従って、ある程度細かな間隔で線分を描きつなげることが必要
である。これは、変換番号2-7でも同様である。一方、地図投影では線分は大
円に沿って適当に区切って補間されることになっており、例えば経線を線分と
して描画しても、地図に沿った曲線(折れ線)として表示される。将来的には、
地図投影以外の変換に関して、U座標における補間を適宜行うようにすること
を検討している。




%-----------------------------------------------------------------------
\subsection{正規変換パラメタ}


上記のU座標を2次元V座標に変換する
正規化変換に必要なパラメータには以下のものがある.
これらはGRPH1の内部変数を管理するルーチン \SGPGETSET により
一つずつ設定/参照できるが,
同種のパラメータをまとめて設定するユーティリティーも用意されている.

\begin{description}
  \item[ビューポート] {\tt ( VXMIN, VXMAX, VYMIN, VYMAX )} \\
	ビューポートを指定するパラメタは, すべての変換に共通で必須である.
	ビューポートとは, 通常座標軸が描かれる矩形の枠である.
	クリッピングをするように指定すると, この枠からはみ出した部分は
	描画されない.
	ビューポートを指定するには, その左下と右上の角のVCにおける座標値
	を指定する.
	\vspace{0.5em}

	これらのパラメータは {\tt SGSVPT/SGQVPT} によって
        設定/参照できる.
	\vspace{0.5em}

  \item[ウインドウ] {\tt ( UXMIN, UXMAX, UYMIN, UYMAX )} \\
	ウインドウは直角直線座標系を設定するのに必要なパラメタである.
	これは, ビューポートに対応する座標値を UC の値で指定する.
	\vspace{0.5em}

	地図投影座標系の場合には,
	GRPH1 の範囲ではこの情報を必要としないが,
	GRPH2 のパッケージが「注目している緯度経度範囲」という意味で
	参照する場合がある.
	この場合には, 一般にビューポートとウインドウは一致しない.
	\vspace{0.5em}

	これらのパラメータは {\tt SGSWND/SGQWND} によって
        設定/参照できる.
	\vspace{0.5em}


  \item[相似変換パラメタ] {\tt( SIMFAC, VXOFF, VYOFF ) } \\


  投影変換の基準となる直交座標系と V 座標の間の相似変換を指定するパラ
  メターには下記の2系統がある。DCL 5.2 までは2番目のものだけが存在し、
  地図投影などに用いられているが、5.3 ではより一般性のある1番目のもの
  が導入され、変換番号51などで用いられる。両系統の設定ルーチンは、それ
  ぞれ他方も設定するようになっているので、実際にはどちらを設定しても良
  いようになっている。
	\vspace{0.5em}

  {\tt ( CXMIN, CXMAX, CYMIN, CYMAX )}

    投影変換 (変換番号 5 以上. 地図投影や格子点で指定する変換を含む) 
    において、投影の基準となる直交座標系を V 座標に対応させるためのパ
    ラメター。ウィンドーの四隅のC座標を指定する。CXMIN, CXMAX, CYMIN,
    CYMAX が VXMIN, VXMAX, VYMIN, VYMAX に一致するとき、C座標とV座標は
    一致する。なお、相似変換パラメターは次に述べる SIMFAC, VXOFF,
    VYOFF によっても指定できる。こちらは縦軸と横軸の縮尺が同じであるこ
    とを補償する。
	\vspace{0.5em}

    {\tt (CXMIN, CXMAX, CYMIN, CYMAX)} はサブルーチンSGSCWD / SGQCWD で設定 
    / 参照できる。SGSCWD は、内部で {\tt (SIMFAC, VXOFF, VYOFF)} を設
    定するが、その際、SIMFAC は横軸のスケールを元に決める。

	直交曲線座標系および地図投影変換の場合の,
	相似変換 (拡大縮小と原点移動) のパラメタ.
	直交曲線座標系の関数は MATH1/CTRLIB,
	地図投影座標系の関数は MATH1/MAPLIB の関数によって
	定義されている.
	GRPH1 では, これらの関数が返す値に, {\tt SIMFAC} を掛けて
	 VC の値に変換し,
	原点をビューポートの中心から {\tt (VXOFF, VYOFF)} 平行移動した位置に
	設定する.
	\vspace{0.5em}

	これらのパラメータは {\tt SGSSIM/SGQSIM} によって
        設定/参照できる.

        SGSSIMは内部で (CXMIN, CXMAX, CYMIN, CYMAX) を設定する。
	\vspace{0.5em}

  \item[地図座標回転パラメタ]  {\tt ( PLX, PLY, PLROT )} \\
	地図投影変換は常に経度範囲$[-180^\circ , 180^\circ ]$
	緯度範囲$[ -90^\circ , 90 ^\circ ]$ に対して行なわれるので,
	任意の視点からの投影を行なうためには,
	地図投影を行なう前に緯度経度座標を回転させておく必要がある.
	{\tt (PLX, PLY)} は投影座標 (TC) の極をおく経度・緯度(UC)を
	指定し, {\tt PLROT} は投影座標の極の回りの回転角を指定する.
	\vspace{0.5em}

	これらのパラメタと, 一般に3次元の回転角を指定するのに使われる
	「オイラーの角 ($\theta, \varphi, \psi$)」
	との関係は,
	$\theta = \pi/2 - {\tt PLY}$, $\varphi = {\tt PLX}$,
 	$\psi={\tt PLROT} $ である.
	(オイラーの角の意味については, 数学辞典などを参照のこと.)
	\vspace{0.5em}

	これらのパラメータは {\tt SGSMPL/SGQMPL} によって
        設定/参照できる.
	\vspace{0.5em}

	実際の操作としては,
	UC と TC (投影座標) が一致している状態を初期状態として,
	\begin{enumerate}
	\item 北極を中心として TC を $ \varphi $ 回転させる. \\
	      (経度 {\tt PLX} の経線を中央経線とする)
	\item TC の北極を中央経線の方向に $ \theta $ 回転させる. \\
	      (経度・緯度 {\tt (PLX, PLY)} の地点を, TC の北極とする)
	\item TC の北極の回りに, $ \psi $ 回転させる. \\
	      (経度{\tt PLX} の経線と, TC の中央経線のなす角を
	      {\tt PLROT} とする. )
	\end{enumerate}
	となる.
	\vspace{0.5em}

        TC から VC への変換は上記の相似変換パラメタによって
        決められる.
        その際地図投影のタイプによって VC 原点に投影される TC の
        値が異なる.

        \begin{center}
	\begin{tabular}{cc}
 	   \hline
	    図 \hspace{0.5cm}  法  &  原点に投影される TC \\
	   \hline
	    円筒図法 &    (0, 0)         \\
	    方位図法 &    (90, 0)        \\
	    円錐図法 &    円錐の頂点     \\
	   \hline
	\end{tabular}
        \end{center}
        \vspace{1em}

        原点に投影されるこれら TC の値は, オイラーの角を (0, 0, 0) と
        したとき, すなわち $ {\tt (PLX,PLY,PLROT)} = (0, 90, 0) $ と
        した場合に対応する.
	\vspace{0.5em}

	通常の円筒図法や円錐図法 (正軸法) で,
	経度$\lambda$の経線を中央経線とするには,
	${\tt (PLX, PLY, PLROT)} = (\lambda, 90., 0) $ とする.
	\vspace{0.5em}

	方位図法において, 経度・緯度 $(\lambda, \phi)$ を中心とした
	地図を描くには,
	${\tt (PLX, PLY) } = (\lambda, \phi)$ とし,
	必要に応じて {\tt PLROT} を指定する
	${\tt PLROT} = 0$ の時, 必ずUCの南極が原点の下になる.
	\vspace{0.5em}

	横軸法の円筒図法などでは, {\tt (PLX,PLY)}として赤道上の点を
	指定する.
	${\tt PLROT} = 0$ の時, UCの南極が中央経線上に投影される.
	例えば, 北極海, 大西洋, 南極環海を一つながりの海として
	横軸法で表すには, {\tt (PLX, PLY, PLROT) = (60., 0., -90.)}
	とする.
	\vspace{0.5em}

  \item[標準緯度] {\tt ( STLAT1, STLAT2 )} \\
	円錐図法の投影では上記のパラメタ以外に,
	標準緯度が必要である.
	ランベルト正角円錐図法は標準緯線が二つあるので,
	{\tt STLAT2} も指定しなければならないが,
	その他の円錐図法は {\tt STLAT1 }の値のみを使う.
	\vspace{0.5em}

	これらのパラメータは {\tt SGRGET/SGRSET} によって
        設定/参照できる.
	\vspace{0.5em}

  \item[衛星軌道半径] {\tt ( RSAT )} \\
	正射図法は本来, 無限遠から地球を眺めたような投影法であるが,
	オプションとして有限の位置にいる衛星から眺めたような投影
	 (Satellite View) が可能である.
	正射図法でこのオプションを選択するには,
	{\tt RSAT} を 1 以上の値に設定する.
	{\tt RSAT} は, 地球半径を 1 とした時の「衛星の軌道半径」である.
	\vspace{0.5em}

	これらのパラメータは {\tt SGRGET/SGRSET} によって
        設定/参照できる.
	\vspace{0.5em}
\end{description}




%-----------------------------------------------------------------------
\subsection{U座標系の設定}

U座標系で描画するためには,
{\tt SGFRM} を呼んだ後でかつ描画をはじめる前に
変換関数を決めるパラメータを指定しておかなければならない.
指定すべきパラメータは座標系によって異なるが,
主要なパラメタはすべて \SGPGETSET によって管理されている.
ただし, \SGPGETSET は単に掲示版の役目をしているだけなので,
{\bf 設定したパラメタの値は, 変換関数を確定するルーチン
{\tt SGSTRF} を呼ぶことで有効になる.}
変換関数のパラメタを1つ1つ設定するのは面倒なので,
まとめてパラメタを設定するルーチンが用意されており,
普通はそちらを使ってパラメタの設定を行なう.
\vspace{1em}

具体的に変換パラメタを設定するには{\tt SGFRM} のあとで次のように
コーディングする.
\vspace{1em}

直角座標系
\begin{Dprogram}
       CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
       CALL SGSWND(UXMIN, UXMAX, UYMIN, UYMAX)
       CALL SGSTRN(ITR)
       CALL SGSTRF
\end{Dprogram}
\vspace{1em}

直交座標系
\begin{Dprogram}
       CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
       CALL SGSSIM(SIMFAC, XOFF, YOFF)
       CALL SGSTRN(ITR)
       CALL SGSTRF
\end{Dprogram}
\vspace{1em}

地図座標系
\begin{Dprogram}
       CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
       CALL SGSSIM(SIMFAC, XOFF, YOFF)
       CALL SGSMPL(PLX, PLY, PLROT)
       CALL SGSTRN(ITR)
       CALL SGSTRF
\end{Dprogram}
円錐投影の場合は, これ以外に {\tt SGRSET} によって標準緯線の緯度
{\tt (STLAT1, STLAT2)} を与えておく必要がある.
\vspace{1em}

これらのパラメタは 変換関数を確定するルーチン {\tt SGSTRF} が
呼ばれる前であれば, どのような順番で指定しても構わない.
変換関数名または略号を指定して, 変換関数番号を返す関数も用意されている.
\vspace{1em}

格子点で指定する座標系 (変換番号51)
\begin{Dprogram}
      CALL SGSTRN(51)
      CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
      CALL SGSCWD(CXMIN, CXMAX, CYMIN, CYMAX)
      CALL SGSWND(UXMIN, UXMAX, UYMIN, UYMAX)
      CALL G2SCTR(NX, NY, UX, UY, CX, CY)
      CALL SGSTRF
\end{Dprogram}
    ここで、UX, UY はそれぞれ長さ NX, NY の一次元配列で、U座標における
    矩形に区切られた格子点を表す(概要説明における$\xi _i,\eta _j$に対応)。ま
    た, CY, CY はともにサイズ $(NX, NY)$ の2次元配列とする(概要説明おけ
    る$x_{ij},y_{ij}$に対応)。UX, UYは単調増加か単調減少でなければならな
    い。G2SCTR は MATH1のGT2DLIBにおける座標変換関数 G2FCTR の初期化関
    数である。G2FCTRは描画時に自動的に呼ばれる。なお、UX, UYの格子がぴっ
    たり入る U 座標をとるには、GRSWNDで
\begin{Dprogram}
      CALL SGSWND(UX(1),UX(NX),UY(1),UY(NY))
\end{Dprogram}

    などとすればよい。
\vspace{1em}

{\small     なお GRPH2 では上記のサブルーチンの接頭辞SG を GR に変えたサブルー
    チンが用意されている。GR* を用いて変換を設定する場合は、(CXMIN,
    CXMAX, CYMIN, CYMAX) の指定は省略できる。省略した場合すべての格子
    点が入る最小の範囲が選ばれる。例：}
\begin{Dprogram}
      CALL GRSTRN(51)
      CALL GRSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
      CALL GRSWND(UXMIN, UXMAX, UYMIN, UYMAX)
      CALL G2SCTR(NX, NY, UX, UY, CX, CY)
      CALL GRSTRF
\end{Dprogram}



%-----------------------------------------------------------------------
\section{3次元正規化変換}
\label{gaiyou.ntrf3}

\subsection{座標系の種類}
3次元のユーザー座標系 (UC) は次のような種類があり,
ユーザーはその中から関数番号によって 1 つを選択する.

\begin{center}
  \begin{tabular}{cp{4cm}}
    \hline
      番号 &             \\
       \hline
       1 & 直角座標      \\
       2 & 円筒座標      \\
       3 & 球座標        \\
     \hline
  \end{tabular}
\end{center}

3 次元座標系は2 次元座標系と異なり対数軸のしていは関数番号ではなく,
対数スイッチ (後述) によって指定する.


%-----------------------------------------------------------------------
\subsection{3次元正規変換パラメタ}


上記の3次元U座標を3次元V座標に変換する
正規化変換に必要なパラメータには以下のものがある.
これらはGRPH1の内部変数を管理するルーチン\SGPGETSET により
一つずつ設定/参照できるが,
同種のパラメータをまとめて設定するユーティリティーが
{\tt SCPACK} の中に用意されている.

\begin{description}
  \item[ビューポート] 
        {\tt ( VXMIN3, VXMAX3, VYMIN3, VYMAX3, VZMIN3, VZMAX3 )} \\
	直角直線座標 ({\tt ITR=1}) の変換に必要なパラメタで, 
	ウィンドのパラメタと共に指定する.
	2次元のビューポートと異なり
	クリッピングの範囲とは関係がない.
	\vspace{0.5em}

	これらのパラメータは {\tt SCSVPT/SCQVPT} によって
        設定/参照できる.

  \item[ウインドウ] {\tt ( UXMIN3, UXMAX3, UYMIN3, UYMAX3, UZMIN3, UZMAX3 )} \\
	{\tt ITR=1} の時, 
	ビューポートに対応する座標値を UC の値で指定する.
	\vspace{0.5em}

	これらのパラメータは {\tt SCSWND/SCQWND} によって
        設定/参照できる.

  \item[対数スイッチ] {\tt ( LXLOG3, LYLOG3, LZLOG3 )} \\
	{\tt ITR=1} の時, 
	それぞれの軸を対数にしたいときに, {\tt .TRUE.} にする.
	\vspace{0.5em}

	これらのパラメータは {\tt SCSLOG/SCQLOG} によって
        設定/参照できる.

  \item[相似変換パラメタ] {\tt( SIMFAC3, VXORG3, VYORG3, VZORG3) } \\
	円筒座標と球座標の時に指定する
	相似変換 (拡大縮小と原点移動) のパラメタ.
	座標原点を{\tt (VXORG3, VYORG3, VZORG3)} に設定する.
	\vspace{0.5em}

	これらのパラメータは {\tt SCSORG/SCQORG} によって
        設定/参照できる.
\end{description}

%-----------------------------------------------------------------------
\subsection{座標系の設定}

3次元のU座標系で描画するためには, 2次元座標系と同様
{\tt SGFRM} を呼んだ後でかつ描画をはじめる前に
変換関数を決めるパラメータを指定しておかなければならない.
これらのパラメタの値は, 変換関数を確定するルーチン
{\tt SCSTRF} を呼ぶことで有効になる.
3次元のパラメタは2次元のパラメタとは独立である.
\vspace{1em}

主要なパラメタはすべて \SGPGETSET によって管理されているが,
変換関数のパラメタを1つ1つ設定するのは面倒なので,
まとめてパラメタを設定するルーチンが用意されており,
普通はそちらを使ってパラメタの設定を行なう.
\vspace{1em}

具体的に変換パラメタを設定するには{\tt SGFRM} のあとで次のように
コーディングする.
\vspace{1em}

直角座標系
\begin{Dprogram}
       CALL SCSVPT(VXMIN3, VXMAX3, VYMIN3, VYMAX3, VZMIN3, VZMAX3)
       CALL SCSWND(UXMIN3, UXMAX3, UYMIN3, UYMAX3, UZMIN3, UZMAX3)
       CALL SCSTRN(ITR3)
       CALL SCSTRF
\end{Dprogram}
\vspace{1em}

円筒座標, 球座標
\begin{Dprogram}
       CALL SCSORG(SFAC3, VXORG3, VYORG3, VZORG3)
       CALL SCSTRN(ITR3)
       CALL SCSTRF
\end{Dprogram}
\vspace{1em}

%-----------------------------------------------------------------------
\section{透視変換}
\label{gaiyou.ptrf}

透視変換とは, 任意の視点から3次元空間を眺めて遠近感を出す変換である.
電能ライブラリにおいては, 3次元V座標系から2次元R座標系への変換を指す.
\vspace{1em}

一般に, この変換では3次元空間上の平行線は投影された2次元平面上では
平行にならない.
視点を無限遠に持っていけば, 平行線は平行線に投影されるが,
そのように投影された図形はかえって不自然に感じられる.
\vspace{1em}

透視変換を行なうには, {\bf 「視点」} と{\bf 「焦点中心」}を設定
しなければならない.
視点とは読んで字の通り3次元空間を眺める位置であり,
カメラのレンズの位置であると思えば良い.
これに対して, 焦点中心はカメラのフィルム上の焦点ではなく,
注目している点, すなわち視点から「見つめる点」である.
この視点と焦点中心を結ぶ線が{\bf 「視線」} である.
\vspace{1em}

透視変換によって 3次元図形の各点は,
その点と視点を結ぶ線が {\bf 「投影面」}と交わる点に投影される.
地球流体電脳ライブラリでは,
投影面は焦点中心を通り, 視線に垂直な面である.
\vspace{1em}

2次元座標系の場合, 2次元のV座標系を3次元のV座標系の1平面に割り付ける
ことで, 透視変換が可能になる.
この際に割り付けることができる平面は, 3次元 X, Y, Z 座標軸のいずれかに
垂直な平面であり, 斜めの面に割り付けることはできない.
(斜めに見るには視点を動かせば良い)


%-----------------------------------------------------------------------
\subsection{変換パラメタ}

\begin{description}
  \item[視点] {\tt ( XEYE3, YEYE3, ZEYE3 )} \\
	3次元空間上での視点.
	この位置にカメラを構えていると思えば良い.
  \item[焦点中心] {\tt ( XOBJ3, YOBJ3, ZOBJ3 ) } \\
	3次元空間内で視線を向ける目標点.
	カメラを向ける被写体の位置と思えば良い.
	なお, 焦点中心を通り, 視線(視点と焦点中心を結ぶ線)に垂直な面が
	投影面となる.
	すなわち, 3次元空間上の点(X,Y,Z) は, その点と視点を通る線が
	投影面と交わる点に投影される.
  \item[画角] {\tt ( ANGLE3 ) } \\
	視点からこの角度で見える投影面上の長さが,
	正規直角座標系の単位長さとなる.
  \item[傾き] {\tt ( TILT3 ) } \\
	Z 軸の傾き. カメラの光軸回りの傾きに相当する.
	この角度が0 の時, 3次元空間のZ軸は正規直角座標のY軸に並行にな
        る.
	視線がZ 軸と平行な場合には, Y 軸が基準になる.
  \item[オフセット] {\tt ( XOFF3, YOFF3 ) } \\
	正規直角座標系に投影された焦点中心の位置を,
        中心からの位置で指定する.
	通常この値は (0,0) で良い.
  \item[2次元平面位置] {\tt ( IXC3, IYC3, SEC3 )}\\
	2次元平面を3次元空間のどこに位置付けるか指定する.
	{\tt IXC3, IYC3} はそれぞれ2次元平面のX座標, Y座標に対応する
	3次元座標を (1,2,3) の数字で指定するもので,
	数字はそれぞれ X座標, Y座標, Z座標に対応する.
	これらの数値に負の値を指定すると, 正負を逆に割り当てる.
	{\tt SEC3} は残りの座標の座標値である.
\end{description}


%-----------------------------------------------------------------------
\subsection{透視変換の設定}

透視変換のパラメタも
{\tt SGFRM} を呼んだ後でかつ描画をはじめる前に
変換関数を決めるパラメータを指定しておく.
これらのパラメタの値は, 変換関数を確定するルーチン
{\tt SCSPRJ} を呼ぶことで有効になる.
透視変換のパラメタは, 2次元およおよび3次元正規化変換と独立である.
\vspace{1em}

主要なパラメタはすべて \SGPGETSET によって管理されているが,
まとめてパラメタを設定するルーチンが{\tt SCPACK} に用意されており,
普通はそちらを使ってパラメタの設定を行なう.
\vspace{1em}

具体的に変換パラメタを設定するには{\tt SGFRM} のあとで次のように
コーディングする.
\vspace{1em}

\begin{Dprogram}
       CALL SCSEYE(XEYE3, YEYE3, ZEYE3)
       CALL SCSOBJ(XOBJ3, YOBJ3, ZOBJ3)
       CALL SCSPRJ
\end{Dprogram}
\vspace{1em}

そのほかのパラメタは必要に応じて \SGPSET で指定する.

なお, 2次元平面を3次元平面に割り付けるには,  {\tt SCSPRJ} の前に,
\begin{Dprogram}
       CALL SCSPLN( IXC3, IYC3, SEC3)
\end{Dprogram}
を呼ぶ.
これにより, 2次元平面上の描画ルーチンを
3次元空間内の平面上で使うことができるようになる.
\vspace{1em}

%------------------------------------------------------------------------


\section{出力プリミティブ}
\label{gaiyou.outp}

図形を構成する基本要素を出力プリミティブという.
GRPH1 の出力プリミティブには次のものがある.

\begin{itemize}
  \item ポリライン(polyline) : 折れ線.
  \item ポリマーカー(polymarker) : マーカー列.
  \item テキスト(text) : 文字列.
  \item トーン(tone) : 多角形のぬりつぶし.
\end{itemize}
このほか, 補助的に次のプリミティブがある.
\begin{itemize}
% \item フィルエリア(fill area) : 斜線による多角形のぬりつぶし.
  \item ライン(line) : 線分.
  \item アロー(arrow) : 矢印.
\end{itemize}

これら6つのプリミティブのうち, トーンプリミティブ以外の5つは
すべて線分で構成される.
線分にはラインインデクスとラインタイプ呼ばれる属性がある.
また, トーンには, トーンパターン番号という属性がある.
これらの属性は, 以下のように定義されている.
\vspace{1em}

GRPH1 で扱う座標系には曲線座標系も含まれるので,
線分やトーンの境界を指定する座標点の間を直線で
つなぐと不都合が起こる場合がある.
そこで, 座標点の間をいくつかに分割して, 補間する機能がある.
さらに,
すべてのプリミティブはある境界でのクリッピングの対象となる.


%-----------------------------------------------------------------------
\subsection{ラインインデクス}
\label{gaiyou.lindex}

GRPH1 で描かれる線分の太さと色はラインインデクスと呼ばれる
3桁の整数(nnm)で指定される.
線の太さと色のうちどちらか一方しか変えられないような
デバイスに出力する場合でも,
ラインインデクスの異なる2本の線が識別できるようにするため,
ラインインデクスは次のような規則にしたがって太さと色に対応づけられる.
\vspace{1em}

線の太さと色が両方変えられるようなシステムでは,
上位2桁(nn=0- 99)が色番号, 下位1桁(m=0- 9)が線の太さを表す.
色番号は, 1から5 までは標準的に

\begin{center}
    \begin{tabular}{cl}
	1: &  白または黒 (フォアグラウンド) \\
	2: &  赤 \\
	3: &  緑 \\
	4: &  青 \\
	5: &  黄 \\
    \end{tabular}
\end{center}

と決められているが,
それより大きな番号に関しては
colormap ファイルの定義による.
またm: 1(細)$\rightarrow $9(太)となっている.
線の太さだけが変えられるような出力装置では,
m=0のときに限ってnnをmとして読みかえる.
また, 線の色だけがかえられるような出力装置では,
nn=0のときに限ってmをnnとして読みかえる.
したがって線の太さと色を明示したいとき以外は,
1桁のラインインデクスを指定しておけば,
とりあえず装置に固有な方法によって線分は識別可能となる.

%-----------------------------------------------------------------------
\subsection{ラインタイプ}

ラインタイプとは, 実線, 破線などの線種である.
1から4までの番号にはあらかじめ以下のタイプが決められている.

\begin{center}
    \begin{tabular}{cl}
	1: &  実線 \\
	2: &  破線 \\
	3: &  点線 \\
	4: &  1点鎖線\\
    \end{tabular}
\end{center}

その他の0以外の整数は下位Nビット
 (Nは内部変数{\tt 'NBITS'}で決まる値.
初期値は16; \ref{sgpack.cntl.sgpget}節参照)
のビットパターンを用いて線種が設定される.
たとえばN=16で{\tt ITYPE} = Z'0000F0F0' (16進定数)のとき,
'\underline{4bits ON} 4bits OFF \underline{4bits ON} 4bits OFF'
のような破線が設定される.
1ビット当たりの長さは内部変数{\tt 'BITLEN'}が決める.
ラインタイプの作画例は\ref{append.table.sgplin}節参照.

%-----------------------------------------------------------------------
\subsection{トーン番号}

トーンパターン番号には色の情報と,
パターンの情報が両方含まれており,
下位3桁がパターン番号, それより上位の桁は色を指定する.
色を指定しない (3桁の番号だけ指定) 場合は,
フォアグラウンド (色番号1) と解釈される.
\vspace{1em}

パターン番号の最上位桁は, パターンの種類をあらわす.

\begin{center}
    \begin{tabular}{cl}
	0: &  ドット \\
	1: &  横線 \\
	2: &  斜線 (右上がり) \\
	3: &  縦線 \\
	4: &  斜線 (左上がり) \\
	5: &  格子 (縦横) \\
	6: &  格子 (斜め) \\
    \end{tabular}
\end{center}

2桁めは, ドットの大きさや斜線の太さを0から5の間で指定する.
値が大きくなるにつれてドットは大きくなり斜線は太くなる.
最下位桁はドットや斜線の密度を0から5の間で指定する.
値が大きくなるにつれてドットや斜線の密度があがる.
ただし0のときは何も描かれない.
\vspace{1em}

{\bf パターン番号として999を指定するとべたぬりとなる. }
\vspace{1em}

カラーの端末やカラーのプリンターでは, 色を指定したべた塗りによる塗りわ
けがしばしばおこなわれる. このプログラムをカラーがサポートされない環境
で実行しても, それなりな見わけがつくようにドットによる塗りわけとして表
現するようなオプションも用意されている.
\vspace{1em}

これらの組合せ以外の整数値はパターンが定義されていない.
%これらの組合せ以外の整数はパターンが定義されていないが,
%hard fillが可能なシステムにおいてユーザーが指定することもできる.
トーンパターンテーブルについては
\ref{append.table.sgtone0}- \ref{append.table.sgtone6}節を参照のこと.

%-----------------------------------------------------------------------
\subsection{補間とクリッピング}

補間機能には次の2つがある.
\begin{description}
  \item[線形補間:] ユーザ座標系で線形的に補間する.
	すべての座標系で指定可能であるが,
 	通常の直角一様座標 ({\tt  ITR=1}) で指定しても意味はない.
	曲線座標系の座標軸や, 地図座標の緯度線を描く時などに使われる.
  \item[大円補間:] 地図投影座標(TC)で, 始点と終点を通る大円上で補間す
        る. これは地図投影関数のみ有効.
\end{description}
地図投影関数の場合には, TC において特異点は必ず極になっているので,
大円補間を指定することにより, 特異点付近での線分がより適切に描けるよう
になる.
\vspace{1em}


この機能に関する\SGPGETSET のパラメタは以下の通り.

\begin{quote}
  \begin{tabular}{llp{11cm}}
    {\tt LLNINT} & {\tt (L)} & 線形補間を行なうかどうか指定するフラグ
			       (省略値{\tt .FALSE.}). \\
    {\tt LGCINT} & {\tt (L)} & 大円補間を行なうかどうか指定するフラグ
			       (省略値{\tt .TRUE.}). \\
    {\tt RDX, RDY} & {\tt (R)} & 補間間隔.
                           1セグメントの長さがこれらの値を越えないように
                           補間される(省略値 (5., 5.)).\\
  \end{tabular}
\end{quote}
\vspace{1em}


クリッピングは次の場所で行なわれる.

\begin{itemize}
   \item {\bf 地図の境界}   地図投影座標 (TC)
   \item {\bf ビューポート} 仮想直角座標 (VC)
   \item {\bf デバイス境界} 正規直角座標 (RC)
\end{itemize}
それぞれのクリッピングは, その座標系の座標軸に平行な線で囲まれる矩形領
域に対して行なわれる.
したがって, 地図投影の際に極を移動する回転を行なうと,
TC におけるクリッピング境界はは経緯線に一致しなくなる.
\vspace{1em}

この機能に関する\SGPGETSET のパラメタは以下の通り.

\begin{quote}
  \begin{tabular}{llp{8cm}}
      {\tt LCLIP} & {\tt (L)} & ビューポートでのクリッピングを
				行なうかどうか指定するフラグ
				(省略値{\tt .FALSE.}). \\
      {\tt VXMIN, VXMAX, VYMIN, VYMAX} & {\tt (R)} &
				ビューポート.
				通常 {\tt SGSVPT} により設定される. \\
      {\tt TXMIN, TXMAX, TYMIN, TYMAX} & {\tt (R)} &
				TC におけるクリッピング境界
				(省略値は -180.0, +180.0, -90.0, +90.0). \\
      {\tt IRMOD}  & {\tt (I)} & トーンの境界線をクリッピングした時に,
				右回りに接続するか, 左回りに接続するか
				指定するパラメタ.
				(\ref{gaiyou.tclip} 参照)
				(省略値{\tt 0}). \\
  \end{tabular}
\end{quote}
\vspace{1em}

ビューポートにおけるクリッピングは {\tt 'LCLIP'} によって
ON/OFF できるが, 他のクリッピングは常におこなうようになっている. 
正射図法で TC におけるクリッピング境界を省略値のまま使うと,
裏側の線分なども描くことになる.
表側だけを描くためには{\tt 'TYMIN'} を 0 にする.


%-----------------------------------------------------------------------
\subsection{トーンのクリッピングに関する注意}
\label{gaiyou.tclip}
地球流体電脳ライブラリのトーンは通常 (クリッピングされなければ) 
指定された境界線が交わっていても, その図形の内側が塗りつぶされる.
正確には, ソフトフィルは Even Odd Rule にしたがって塗りつぶしが行われ,
ハードフィルは機種依存であるが, できるだけソフトフィルに近い規則で
塗りつぶされる様になっている.
\vspace{1em}

旧バージョンではハードフィルはクリッピングの対象になっていなかったが, 
DCL ver.5 からハードフィルも{\bf ソフト的にクリッピング}
できるようになった.
すなわち, トーンのクリッピングはハードウェアが行うのではなく, 
指定された領域とクリッピング範囲が重なる部分を指定する境界点を生成して, 
そのデータをトーンルーチンに渡すようになっている.
このクリップされた境界線を求めるアルゴリズムは, 
境界線の向きが決まっていることを前提としている.
ここで, 境界線の向きとは境界線を指定する点列を, 
時計回りに指定するか, 反時計回りに指定するかということを言う.
このアルゴリズムは旧来のトーンの塗りつぶし規則と整合性が悪いが, 
地図上 (T 座標系) では境界線の向きがわからないと内側と外側を
判断することができない.
\vspace{1em}

具体的にはトーンをクリッピングする手順は次のようになる.
\begin{enumerate}
\item 境界線をクリップして, いくつかの線分に分割する.
\item 切断された線分を接続しなおし, 閉じた境界を生成する.
      {\tt IRMODE=0} の時, 反時計回り; {\tt IRMODE=1} の時, 時計回り
      に接続する.
\item 生成された境界線に対して旧来の規則にしたがって塗りつぶしを行う.
\end{enumerate}
クリッピングされない領域に関しては, 旧来の規則がそのまま適用され, 
{\tt IRMODE} は何の意味ももたない.
つまり, {\tt IRMODE } を適当に指定することで, 
境界線の外側を塗りつぶすことができるわけではない.
\vspace{1em}

したがって, 
境界線が交わるような図形を塗りつぶす時に, 
クリッピングを行うのは危険である.
クリッピングを行う時は, 安全のために
\begin{center}
{\bf 境界線の向きを決めて, 小さな単純な図形にする }
\end{center}
様にしていただきたい.
\vspace{1em}

なお, 図形の外側を塗りつぶしたい時には, 
その図形が確実にクリッピングされるように領域を2分割し, 
クリッピング領域 (ビューポート) を設定しなおして, 
2度トーンルーチンを呼ぶ.
%-----------------------------------------------------------------------
\section{カラーグラフィクス}

\label{gaiyou.color}

  紙に出力する際は、白黒を使うことが多かった.
  しかし、紙に印刷するだけでなく、ライブラリをデーター解析のために使用したり
  出版物もカラー印刷が簡単に行え、また出版が紙媒体に限らなくなっていることから
  ライブラリにもカラー化が施されている。
\vspace{1em}

  できるだけ、カラーと白黒が同じような使用感でできる様にデザインされており、
  カラーが使用できないときにはトーンに置き換わるなどユーザーが気にしなくても
  なんとか出力するようにデザインされている.
\vspace{1em}

  また、カラーの性能も3bitカラーから
  24bitもしくはそれ以上のカラーのデバイスが存在していた.また色は24bitの空間があっても
  デバイス上で同時に扱える色数は8bitまでであったり、多種多様なカラーデバイスモデルが存在した
  おかげで標準的にサポートされたのは256色のカラーパレットを使用したモデルのみであった.
\vspace{1em}

  このカラーモデルは科学情報を等値線に区切られた領域をべた塗りするという比較的良く行われる
  データ可視化法で都合が良かった。フルカラーのデバイスのみになっても、なくなることはないと
  考えられる。
\vspace{1em}

  現在は、デバイスについては、ほぼ24bitカラーを扱うことができる様になった.この24bitの色空間を
  フルカラーと呼んでいる.フルカラーで表現できない色も存在し、また、その表現域はデバイスに依存するが、
  その詳細については専門書に譲る.24bitのうち分けは赤緑青の光の三原色に8bitずつ割り振られている。
  順序についてもデバイスに依存している.また、これに8bit追加して32bitを色の単位にするデバイスも
  存在するが、通常はその領域は透明度もしくは色のダイナミックレンジ拡張などに使われる.
  DCLも次期バージョンでは8bit拡張することを予定している.

%パックするやつ
\begin{Dprogram}
  INTEGER R,G,B,IRGB
  R=128
  G=0
  B=128

  IRGB = ISGRGB(R,G,B)
\end{Dprogram}

  引数が多くなることを防ぐためにフルカラーはパックされて扱われている。
  上のプログラムはパックする関数の使用例であるが、３つの値が
  符号なしの整数で、{\tt 0-255}に治まっている値だとして{\tt IRGB=R*65536+G*256+B}と
  計算していることに相当する。

\subsection{カラーデバイス}
  現在、カラーの扱えるデバイスでフルカラーをドライバやライブラリレベルで扱えないデバイスは、
  ほぼ皆無であると考えて良い。実際に発色されユーザーが目にする色の分解能がそこまでないとしても
  フルカラーのデータを渡せば、よく似た色を出力して、プログラム側から見たときにはフルカラーである
  ように扱うことができる。
  \vspace{1em}

%%ここはコラム的にした方が良いかも
  かつてはXのように、デバイスの出力できるカラーのに合わせてプログラム側で対処する必要のある
  デバイスが存在した。たとえば、画像表示デバイスとしてはフルカラーが出せるものでも、あるドットの
  色を指定するのに、インデックスカラーを使い256色のみ同時に使用できるようにするデバイスがあった。
  このときにはデバイス側のパレットという意味でのカラーマップが必要であった。このようなデバイスが
  作られた理由はグラフィクスに使用する高速なメモリが高価であったことがおおきい。しかし現在は、
  仮にそのようなデバイスであったとしても、{\tt gtk}のようなライブラリで、フルカラーの指定を受け
  均等にもしくはライブラリによってはダイナミックにパレットを変化させながら最も自然に減色して表示
  する。その結果、カラーマップはデバイスを取り扱うためという役目は終了し、純粋に色に番号を
  割り振るためのものとなった。

\subsection{HSV/HLSカラー}
  RGBの強さで色を扱うのはデバイスにとっては都合が良いが、人間にとってはその色がどのような色なのか
  ということを理解しがたい.人間の理解しやすい色モデルとしてはHSVやHSLというモデルがある.HとはHUE
  色合いのことで$0-360^0$の値を取り、円周方向に変化するように配置されることが多い.
  虹色に変化して0と$360^0$はつながっている.SATURATIONは彩度、色の鮮やかさで数字が大きくなると
  その色自体に、小さくなるとくすんだ灰色に近づく量である.普通は$0-100\%$で表される.
  VはBとも書かれ、ValueもしくはBrightnessの略である.それぞれ輝度、明るさなどと呼ばれる.これは
  その名の通り明るさの指標で、$0-100\%$の値を取り、0で黒100でその色の最大明るさとなる.HLSモデルの
  HSはHSVと同じである.LはLightnessといってやはり輝度と呼ばれるが、0で黒100で白となる.Hの値を持つ
  純色となるのはHSVではVが100$\%$の時、HLSでは、$50\%$の時となる.RGBとHSVやHLSとの変換は、簡単な
  変換で行える。ただし、これらの値は整数値であるのに、変換式は実数係数であるので、変換した後に
  逆変換を行っても元と厳密には同じ値にならないことに注意が必要である。

\begin{Dprogram}
       INTEGER R,G,B
       REAL    H,S,V
       H = 225
       S = 0.75
       V = 0.6
       CALL CLSVRG(H,S,V,R,G,B)
\end{Dprogram}

  HSVは実数で、Hは$0.-360.$、SとVは、$0.-1.$に治まるように与える。HLSも同様の使い方である。
  配列に対して正規化するためのルーチンを使うことで、値を色の各コンポーネントに変換することもできる。
  そのようなルーチンとしてMATH1の {\tt INORML,RNORML}がある。
  まず、HSVのどれかのコンポーネントに変換してRGBに直すことで、色情報から直感的に値の大小を
  感じられるような図に直すことができる。


\subsection{CMYKカラー}
  DCLでは現在サポートしていないが、印刷物用出力で使用される。光の三原色をすべて混合すると
  白になる.白からある原色を抜き去るとその色の補色と呼ばれる色になる.その補色で作った三原色が
  シアン、マゼンタ、イエローである.ディスプレイは、色が加色されていくが、印刷物では色を追加
  するたび減色されていく.印刷物で色を出すのは印刷面で光の一部が吸収されて残りの色を感じると
  いう仕組みだからである.そのため、この三原色を混ぜると理想的には黒になる.しかし、実際に絵の具で
  混ぜても濁色ではあるが、黒とは呼べない色となるので黒を追加しているデバイスが多い.そのような
  デバイスで適切に扱いやすいように色空間に黒(K)を追加した色モデルである。

\subsection{カラーマップ}
  従来のカラーマップは、今でも有効である。フルカラー用に追加したルーチンを使わなければ、
  いままでのプログラムも変わらず利用することができる。また、フルカラーの描画ルーチンの描画した
  上にカラーマップを利用したルーチンやトーン、ラインなども重ねて描画することができる。
  カラーマップは、フルカラーの絵の具箱から100色の絵の具セットをセレクトしたことに相当する。
  カラーマップは、初期にはデフォルトのカラーマップを読み込むが、いつでも変更することができる。
  カラーマップが変更されても、それ以前に描画された画像の色は変化しない。カラーマップの変更は、
  {\tt X}では保証されない。{\tt gtk}の使用が推奨される。次期{\tt DCL} ではxlibは使用されず
  {\tt gtk}がデフォルトになる予定である。

%  \dprogram	
  カラーマップの変更？ここは記述を足すこと。

%-----------------------------------------------------------------------
\section{レイアウト}

\label{gaiyou.layout}

R座標系はx軸, y軸ともに0 から 1の値をとり,
描画範囲は 1:1 の縦横比を持つ.
これに対して, 実際のデバイスの縦横比はいろいろである.
描画範囲とデバイスの縦横比が一致しない時には,
通常 {\tt SGFRM} が呼ばれた段階で,
デバイスの中央に描画範囲が最大内接するように
ワークステーション変換が設定される.
\vspace{1em}

しかし, デバイスの描画領域をいっぱいに使いたかったり,
逆に, 図の回りに適当なマージンをとりたい場合もある.
そのような時には, GRPH1/SLPACK を使う.
SLPACK は基本的にワークステーション変換を設定するもので,
描画範囲の縦横比を変える以外に,
マージンにタイトルなどの文字列を書いたり
1枚の紙に複数のフレームを並べたりする機能がある.
この様な機能をレイアウト機能と呼ぶ.
\vspace{1em}

このレイアウト機能を使うには, デバイスをオープンした後で
{\tt SGFRM} を呼ぶ前に, 適切な設定を行なう.
例えば,

\begin{Dprogram}
       CALL SGOPN(IWS)
       CALL SGDIV('S', 4, 3)  ! １ページを 4x3 に分割する.
       CALL SGFRM
       ..........

       CALL SGFRM
       ..........

       CALL SGCLS
\end{Dprogram}

とすることで, 1ページに12枚のフレームを設定することができる.


