%表題   らくらくDCL
%
%%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%  \Dchapter{地図投影や3次元図形も}
\Dchapterhead
\label{c:map3d}

いま, DCL グラフィクスで精力的に開発・整備されているパッケージに, 地図
投影と3次元グラフィクスがあります. これらのサブルーチンはこれから変更
されていく可能性があるので, ここではいくつかの出力結果を紹介するに留め,
具体的な解説はいつか将来に致しましょう.
\vspace{1em}

さっそく使ってみたいという人は, GRPH1, GRPH2 のマニュアルの該当すると
ころをお読み下さい. また, この章で示す図は,
dcl-x.x/demo/rakuraku/map3d/ にサンプルプログラムがあります. また,
dcl-x.x/demo/grph2/umpack と dcl-x.x/demo/grph1/scpack のディレクトリ
にあるテストプログラムなども覗いてみて下さい.
%-----------------------------------------------------------------------
\section{いろいろな地図投影法}

GRPH1 で扱える座標系としては，直角直線座標系などのほかに14種類の地図投
影座標系があります. U-座標系からV-座標系への正規化変換でこれらの座標系
を設定するれば, それぞれの地図座標系で描画が可能となります.
\vspace{1em}

これらの地図投影変換を用いて, 全球(いくつかの例外あり)を表示した結果を
map3d1.f の出力図に示します. 変換関数番号({\tt ITR})が10から33までの14
種類の投影法で海岸線情報と緯度・経度線を描きます. 第1フレームは円筒図
法(6種), 第2フレームは円錐図法(4種), 第3フレーム方位図法(4種)の地図投
影法です.
ver5.3 から新しく13の地図投影変換関数が追加されました.ただし, itrの番号に限りがあるので, 実用性の高い6つにのみ番号を割り当てています.itr=99 はユーザ定義関数用の番号で, ユーザ自身が {\tt STFUSR, STIUSR, STSUSR} を定義した {\tt stfusr.f} を用意することで利用できるが, その例として, 上記の選に漏れた地図投影法を指定できるような関数を実装した {\tt stfusr.f} がデフォルトで置いてありますので中を参考にして下さい.
\vspace{1em}


DCL で指定できる地図情報としては, 海岸線, 国境, 米国の州境, 日本の県境,
プレート境界などがあります.
\vspace*{15em}

\begin{center}
\Depsf[15cm]{map3d/map3d1_0001.eps}\\
{\bf map3d1.f: frame1}\\
\end{center}
\newpage
\begin{center}
\Depsf[15cm]{map3d/map3d1_0002.eps}\\
{\bf map3d1.f: frame2}\\
\end{center}
\newpage
\begin{center}
\Depsf[15cm]{map3d/map3d1_0003.eps}\\
{\bf map3d1.f: frame3}\\
\end{center}
\newpage

地図情報や緯線・経線を描くのと同時に, 等高線図やトーンによる塗りわけを
おこなったり, ベクトル場を描いたりすることが可能です.  等高線図作画パッ
ケージ UDPACK とトーンによる塗りわけパッケージ UEPACK はともにU-座標系
で作画するルーチン群ですから, 正規化変換で地図投影変換を指定していても
これまでと全く同じように利用できます.
\vspace{1em}

プログラム map3d2.f では, これまで描いてきた球面調和関数の重ね合わせを
正射図法で描きます. 第\ref{c:u2d2}章のプログラム {\tt U2D5} と同じよう
に等高線とハッチが地図上で作画され, 地球の裏側の部分は描かれないように
なっています.

\begin{center}
\Depsf[10cm]{map3d/map3d2_0001.eps}\\
{\bf map3d2.f: frame1}\\
\end{center}
\vspace{1em}

ベクトル場作画パッケージ UGPACK はV-座標系上で作画しますから, 残念なが
ら, 現在のところ地図投影には対応していません. しかしながら, SGPACK の
アローサブプリミティブを使って, 緯度・経度の単位を持った矢印を地図上に
描くことは簡単にできます. map3d3.f の例のように, 限られた地域だけでベ
クトル場を描くならば, 緯度・経度の単位で矢印をスケーリングしてもそれほ
ど気にならないでしょう.

\begin{center}
\Depsf[10cm]{map3d/map3d3_0001.eps}\\
{\bf map3d3.f: frame1}\\
\end{center}
\vspace{1em}

%-----------------------------------------------------------------------
\section{格子点で指定する投影法}

DCLでは、直行曲線座標の表示や地図投影など、数多くの投影変換による描画
が行えます。これらはいずれも解析関数より指定される変換ですが、それ以外
に格子点間の対応で変換を指定する投影法もあり、変換番号は51となっていま
す。ここではその使い方を説明します。なお、格子点の間の点の表示には双線
形補間(bilinear interpolation)が用いられます。補間は MATH1 の GT2DLIB
により行われますので、アルゴリズムの詳細については、そのマニュアルを参
照してください。
\vspace{1em}

・例１：
\Dproginput{map3d/g2pk01.f}

下記のプログラムを実行すると、図 xx が現れます。

\begin{center}
\Depsf[10cm]{map3d/g2pk01_0001.eps}\\
{\bf g2pk01.f: frame1}\\
\end{center}
\vspace{1em}


デモのため、格子点はごく簡単な解析関数を用いて定義しました。 U 座標に
おいて「長方形」に並んだ格子点の座標が [ UX(I), UY(J) ] (I=1..NX,
J=1..NY) で定義され、それぞれが基準となる直交座標において [ CX(I,J),
CY(I,J) ] の座標値を持ちます。
\vspace{1em}

42-48行目で、変換を設定しています。U座標における描画範囲は, UX, UY の
カバーする領域ぴったりにすべく、

      CALL GRSWND(UX(1),UX(NX),UY(1),UY(NY))

と設定しました(44行目)。一方、ビューポートの四隅のC座標値を指定する
CXMIN,CXMAX,CYMIN,CYMAX には適当な値を設定しています(30-33 行目)。
GRFRM, GRSTR等、GRPH2のGRPACKを使って初期化する場合、C[XY](MIN|MAX)の
設定は省略できます(GRFRMはCXMIN等を不定にします)。省略時には、格子をぴっ
たり収めるべく、CX, CYの最大値を用いて内部的に設定します。
\vspace{1em}

U座標で色塗り(54-63行目)をしたあと、格子を表示します(67-79行目)。現在
のところ、線分はV座標でそのまま線分として書くようになってますので、こ
のように各格子点を結ぶ折れ線として書く必要があります。いずれにしろ、双
線形補間においていは、このようにすると厳密な格子の表示となります。
\vspace{1em}

座標軸は C 座標で書きました(83-87行目)。より正確に言えば、変換を定義し
なおして、それまでC座標であった座標系をU座標として定義した上で(変換番
号は1)、座標軸を書きました。今のところ、変換番号51における直接の差表示
区描画はサポートされていません。
\vspace{1em}

・例２：
\Dproginput{map3d/g2pk02.f}

下記のプログラムを実行すると、図 xx が現れます。

\begin{center}
\Depsf[10cm]{map3d/g2pk02_0001.eps}\\
{\bf g2pk02.f: frame1}\\
\end{center}
\vspace{1em}

この例では, CX＝UXとし、Y軸に沿ってのみ座標変換しています。UXは1次元配
列なのに対しCXは2次元ですから、そのような配列を別途用意しなければなら
ないとなると少し面倒です。そこで、CXの最初の要素の値が GLPACK のパラメ
ター 'RUNDEF' の値に等しい場合は、CX＝UXであると解釈されることになって
います。それ以降の値は読み込みませんので、CXのために2次元配列を用意す
る必要もありません（例では用意していますが）。同様なことは Y 軸に沿っ
ても出来ます。ただし、CX＝UXかつCY＝UYならこの変換の意味がないので、エ
ラーになるようになっています。
\vspace{1em}

座標変換の設定(41-46行目)において例１と違うのは、C[XY](MIN|MAX) を設定
していないことです。こうすると、内部的に格子点がぴったり収まるような領
域が確保されますので、図のような結果となります。ただしそのためには 例
のように　GRPH2 の設定ルーチン GRFRM 等を用いる必要があります。なお、
内部的に設定されたこれらのパラメターを参照することで、C座標への切り替
えと軸描画もできます（79-84行目)。
\vspace{1em}

%-----------------------------------------------------------------------
\section{3次元透視変換}

3次元透視変換とは, 3次元空間内に置かれた3次元図形を任意の視点から眺め
て2次元平面に投影する変換で, 遠近感が出る変換です. 3次元グラフィクスを
うまく使うと, これまでに見てこなかった新しい表現法が可能となります.
\vspace{1em}

まず, 3次元空間内で三軸に平行に置かれた立方体の表面に, 2次元の作図をし
てみましょう(map3d4.f). 作画する2次元平面をちゃんと指定すれば, これま
での描画サブルーチンがそのまま使えます.
\vspace{1em}

\begin{center}
\Depsf[10cm]{map3d/map3d4_0001.eps}\\
{\bf map3d4.f: frame1}\\
\end{center}
\vspace{1em}

また, GRPH2 のパッケージもそのまま使えます. map3d5.f のプログラムでは,
第\ref{s:u2d2_w}節で描いた等高線とベクトル場を2段重ねにして表現してみ
ました.
\vspace{1em}

\begin{center}
\Depsf[10cm]{map3d/map3d5_0001.eps}\\
{\bf map3d5.f: frame1}\\
\end{center}
\vspace{1em}

\newpage
さらに, 3次元空間内で線を引いたり, 面を定義してトーンをつけたりするこ
とも可能です. map3d6.f の図は, これまで何度も描いてきた球面調和関数を
ワイヤフレームで表現するものです. この2次元スカラー場を図示するのに,
縦横に張ったワイヤの凹凸として3次元的に表現しています. データの値の大
小がワイヤを張った面の高低となって, 視覚的にデータを把握しやすくなりま
す.
\vspace{1em}

\begin{center}
\Depsf[10cm]{map3d/map3d6_0001.eps}\\
{\bf map3d6.f: frame1}\\
\end{center}
