%表題   基本グラフィックルーチンライブラリ
%
%履歴
%\Drireki{
%         93/09/28 酒井 敏 (map project)
%         93/10/13 塩谷雅人
%         }
%
\Dchapterhead
\label{stpack}
%-----------------------------------------------------------------
\section{概要}

STPACK は座標系の間の変換を受け持つ関数を集めたものである.
座標系の変換は,

\begin{itemize}
  \item 正規化変換
  \item 透視変換
  \item ワークステーション変換
\end{itemize}

の3段階に分けられる. 正規化変換はさらに次の変換を含む.

\begin{itemize}
  \item 角度の単位変換 (ラジアンと度)
  \item 地図座標の回転
  \item 基本変換
\end{itemize}

ここで基本変換とは, 正規化変換の本質的な部分で,
直角座標系では正規化変換そのものであり,
地図投影座標では座標系回転後の変換
(math1/maplib による変換) である.
また, 基本変換では角度は常にラジアンで扱われる.

\subsection{ユーザー定義関数}
\label{stpack.user}

以下のエントリをユーザー自身が用意することで,
独自の変換関数を定義することができる.
\vspace{1em}

  \begin{quote}
    \begin{tabular}{ll}
      {\tt STFUSR(UX,UY,XX,YY)}  & 正変換 \\
      {\tt STIUSR(XX,XY,UX,UY)}  & 逆変換 \\
      {\tt STSUSR}               & 関数初期化 \\
    \end{tabular}
  \end{quote}
\vspace{1em}


この正変換と逆変換のエントリは, {\tt STFTRF} の下請けルーチンである
{\tt STFTRN} から呼ばれる.
{\tt STFUSR} に渡ってくる {\tt UX, UY} の値は,
{\tt STFRAD} と {\tt STFROT} による処理が終った後の値である.
拡大, 並行移動は{\tt STFTRN} が行なうので, これらの関数は,
それ以外の基本的な変換関数を定義するだけで良い.
変換関数には正変換と逆変換があるが,
逆変換を使わない場合には, 逆変換はエントリー文だけで良い.
\vspace{1em}


{\tt STSUSR} は, 変換関数を確定する{\tt SGSTRF}から呼ばれる.
このエントリは, 通常{\tt SGSTRF} が行なっている STPACK の関数を
初期化しなければならない.
初期化すべき関数は,
{\tt STSTRF}, {\tt STSTRN}, {\tt STSRAD}, {\tt STSROT} (地図投影の時)
である.
\vspace{1em}

次のプログラムは常用対数の log-log 座標を定義するものである.
\begin{Dprogram}
*-----------------------------------------------------------------------
*     USER SUPPLIED FUNCTION
*-----------------------------------------------------------------------
      SUBROUTINE STFUSR(UX, UY, XX, YY)

      XX = LOG(UX)
      YY = LOG(UY)

      RETURN
*-----------------------------------------------------------------------
      ENTRY STIUSR(XX, YY, UX, UY)

      UX = EXP(XX)
      UY = EXP(YY)

      RETURN
      END
*-----------------------------------------------------------------------
      SUBROUTINE STSUSR

      CALL SGQVPT(VXMIN, VXMAX, VYMIN, VYMAX)
      CALL SGQWND(UXMIN, UXMAX, UYMIN, UYMAX)

      CX = (VXMAX-VXMIN)/LOG(UXMAX/UXMIN)
      CY = (VYMAX-VYMIN)/LOG(UYMAX/UYMIN)

      VX0 = VXMIN - CX*LOG(UXMIN)
      VY0 = VYMIN - CY*LOG(UYMIN)

      CALL STSTRF(.FALSE.)
      CALL STSRAD(.FALSE., .FALSE.)
      CALL STSTRN(99, CX, CY, VX0, VY0)

      END

\end{Dprogram}
\vspace{1em}

次のプログラムは MATH1/MAPLIB の MPFMWL/MPIMWL を使って
モルワイデもどきの地図投影関数を定義するものである.

\begin{Dprogram}
*-----------------------------------------------------------------------
*     USER SUPPLIED FUNCTION
*-----------------------------------------------------------------------
      SUBROUTINE STFUSR(UX, UY, XX, YY)

      CALL MPFMWL(UX, UY, XX, YY)

      RETURN
*-----------------------------------------------------------------------
      ENTRY STIUSR(XX, YY, UX, UY)

      CALL MPIMWL(XX, YY, UX, UY)

      RETURN
      END
*-----------------------------------------------------------------------
      SUBROUTINE STSUSR
      LOGICAL LDEG

      CALL SGQVPT(VXMIN, VXMAX, VYMIN, VYMAX)
      CALL SGQSIM(SIMFAC, XOFF, YOFF)
      CALL SGQMPL(PLX, PLY, PLROT)
      CALL SGLGET('LDEG', LDEG)

      IF(LDEG) THEN
        CP = RFPI()/180
      ELSE
        CP = 1
      ENDIF

      CALL SGRGET('TXMIN', TXMIN)
      CALL SGRGET('TXMAX', TXMAX)
      CALL SGRGET('TYMIN', TYMIN)
      CALL SGRGET('TYMAX', TYMAX)
      CALL SZSCLX(CP*TXMIN, CP*TXMAX)
      CALL SZSCLY(CP*TYMIN, CP*TYMAX)

      VX0 = (VXMAX+VXMIN)/2 + XOFF
      VY0 = (VYMAX+VYMIN)/2 + YOFF

      CALL STSTRF(.TRUE.)
      CALL STSRAD(LDEG, LDEG)
      CALL STSROT(RFPI()/2-CP*PLY, CP*PLX, CP*PLROT)
      CALL STSTRN(99, SIMFAC, SIMFAC, VX0, VY0)

      END
\end{Dprogram}

