1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
|
%表題 MATH1下位gt2dlib
%
%履歴
%\Drireki{
% 2011/08/16 堀之内武
% }
%
% \Dchapter{GT2DLIB : }
\Dchapterhead
\label{gt2dlib}
\section{概要}
本ライブラリーは2次元の補間、並びにそれを用いた2次元の座標変換を扱う。
座標間の対応は離散的な格子点で指定し、間は補間する。補間アルゴリズムは
双線形補間を用いる。このため逆変換は解析的に計算される。将来的には双3
次補間もサポートする可能性があるが、その場合逆変換は反復法によることに
なる。
補間のサブルーチンは、座標変換のみならず一般の用途に適するよう作ってある。
座標変換は、$(\xi,\eta) -> (x,y)$ において、離散的な点 $\xi _i (i=0,1,2,..),\eta _j(j=0,1,2,..)$ で
\begin{eqnarray*}
x_{i,j} = x(\xi_i,\eta_j) \\
y_{i,j} = y(\xi_i,\eta_j)
\end{eqnarray*}
という形で表される格子点での対応関係により定義される。従って「正変換」
においては、変換元の座標のデータは2つの1次元配列、変換先の座標のデータ
は2つの2次元配列となる。逆変換はその逆である。なお、2つの2次元配列から
2つの2次元配列へと対応づけられる座標変換は、中間的に1次元配列ベースの
「矩形」格子を設定すれば、逆変換、正変換の2段階で行うことが出来る。こ
れは、幾何的には、基準となるデカルト座標系を用いることに相当する。
\section{関数のリスト}
\begin{tabular}{lp{10cm}}
{\tt G2FBLI(P, Q, Z00, Z10, Z01, Z11, Z)} & 双線形補間 \\
{\tt G2FBL2(P,Q, X00,X10,X01,X11, Y00,Y10,Y01,Y11, X,Y)} & 2変数同時の双線形補間\\
{\tt G2IBL2(X,Y, X00,X10,X01,X11, Y00,Y10,Y01,Y11, P,Q)} & G2FBL2 の逆変換\\
{\tt G2SCTR(NX, NY, UXA,UYA, TXA,TYA)} & 2次元の座標変換の設定\\
{\tt G2FCTR(UX, UY, TX, TY)} & 2次元の座標変換\\
{\tt G2ICTR(TX, TY, UX, UY)} & G2FCTRの逆変換\\
{\tt G2QCTR(LINIT)} & 初期化済かの問合わせ\\
{\tt LG2INQ(TX,TY, TX00,TX10,TX01,TX11, TY00,TY10,TY01,TY11)} & 四辺形の内側にあるか判定
\end{tabular}
\section{関数の説明}
\subsection{G2FBLI}
\label{gt2dlib.sub.g2fbli}
\begin{enumerate}
\item 機能
\begin{quote}
双線形補間. 入力座標 (P, Q) はともに [0, 1] の区間に正規化されたものをとる.
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2FBLI(P, Q, Z00, Z10, Z01, Z11, Z)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt P,Q} & {\tt (R)} & 補間すべき点の座標. 4隅が (0,0), (1,0), (1,1), (0,1) となるよう正規化されてるものとする. (入力) \\
{\tt Z00, Z10, Z01, Z11} & {\tt (R)} & P,Q の4隅(上述)、即ち、それぞれ (P,Q) = (0,0), (1,0), (1,1), (0,1) における変数の値 (入力) \\
{\tt Z} & {\tt (R)} & 補間結果 (出力)
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item 中身はZ = (1-P)*(1-Q)*Z00 + P*(1-Q)*Z10 + (1-P)*Q*Z01 + P*Q*Z11
である(一行のみ).
\item P, Q とも [0,1] の区間内にある場合は補間, そうでなければ外挿 となる.
\item パラメターの説明から明らかであろうが, (P,Q) = (0,0), (1,0), (1,1), (0,1) の場合、出力はそれぞれ {\tt Z00, Z10, Z01, Z11} に等しくなる.
\end{enumerate}
\end{enumerate}
\subsection{G2FBL2}
\label{gt2dlib.sub.g2fbl2}
\begin{enumerate}
\item 機能
\begin{quote}
2変数同時の双線形補間. 入力座標 (P, Q) はともに [0, 1] の区間に正規化 されたものをとる.
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2FBL2(P,Q, X00,X10,X01,X11, Y00,Y10,Y01,Y11, X,Y)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt P, Q} & {\tt (R)} & 補間すべき点の座標. 4隅が (0,0), (1,0), (1,1), (0,1) となるよう正規化されてるものとする. (入力) \\
{\tt X00, X10, X01, X11} & {\tt (R)} & P,Q の4隅(上述)、即ち、それぞれ (P,Q) = (0,0), (1,0), (1,1), (0,1) における一つめの変数の値 (入力) \\
{\tt Y00, Y10, Y01, Y11} & {\tt (R)} & P,Q の4隅(上述)、即ち、それぞれ (P,Q) = (0,0), (1,0), (1,1), (0,1) における二つめの変数の値 (入力) \\
{\tt X} & {\tt (R)} & {\tt X00, X10, X01, X11} に関する補間結果 (出力) \\
{\tt Y} & {\tt (R)} & {\tt Y00, Y10, Y01, Y11} に関する補間結果 (出力)
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item {\tt G2FBLI} を2回呼んでいるだけである。よって
X = (1-P)*(1-Q)*X00 + P*(1-Q)*X10 + (1-P)*Q*X01 + P*Q*X11
Y = (1-P)*(1-Q)*Y00 + P*(1-Q)*Y10 + (1-P)*Q*Y01 + P*Q*Y11
\item 2変数から2変数への変換であるから逆変換が存在する.
逆変換を行うサブルーチンは {\tt G2IBL2 }である.
\end{enumerate}
\end{enumerate}
\subsection{G2IBL2}
\label{gt2dlib.sub.g2ibl2}
\begin{enumerate}
\item 機能
\begin{quote}
{\tt G2FBL2} (2変数同時の双線形補間) の逆変換. 解析解である.
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2IBL2(X,Y, X00,X10,X01,X11, Y00,Y10,Y01,Y11, P,Q)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt X,Y, X00,X10,X01,X11, Y00,Y10,Y01,Y11} & {\tt (R)} & (入力) \\
{\tt P, Q} & {\tt (R)} & (出力)
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item パラメーターの説明は {\tt G2FBL2} を参照のこと.
\item 連立2次方程式を解析的に解く. (実質的に1次方程式になる場合等、 多くの場合分けを含む)
\end{enumerate}
\end{enumerate}
\subsection{G2SCTR}
\label{gt2dlib.sub.g2sctr}
\begin{enumerate}
\item 機能
\begin{quote}
2次元の座標変換の設定(初期化). 格子点間の対応で定義する.
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2SCTR(NX, NY, UXA,UYA, TXA,TYA)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt NX, NY} & {\tt (R)} & 配列の長さ (入力) \\
{\tt UXA} & {\tt (R)} & 変換元の座標 (独立変数その1). 長さ {\tt NX} の1次元配列 (入力).\\
{\tt UYA} & {\tt (R)} & 変換元の座標 (独立変数その2). 長さ {\tt NY} の1次元配列 (入力).\\
{\tt TXA} & {\tt (R)} & 変換先の座標 (独立変数その1). 長さ {\tt NX*NY}の2次元配列 (入力).第1要素({\tt TX(1,1)})を {\tt RUNDEF} とすることで省略できる. 省略の場合,{\tt TX(I,J)=UX(I)} が用いられる.\\
{\tt TYA} & {\tt (R)} & 変換先の座標 (独立変数その2). 長さ {\tt NX*NY}の2次元配列 (入力).第1要素({\tt TY(1,1)})を {\tt RUNDEF} とすることで省略できる. 省略の場合,{\tt TY(I,J)=UY(J)} が用いられる.
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item 2次元配列 {\tt (TXA,TYA)} のセーブは、C 言語で書かれた下請の関数が行う。
動的割り当てによるため、サイズに制限がない。一方、一次元の {\tt UXA,UYA} は静的に確保されたサブルーチン内の配列にセーブされる。
最大の長さは {\tt GRPH2} の {\tt UWPACK} と同様、コンパイル時に変更可能な定数 {\tt MAXNGRID} である。デフォルト長は 4000。
\end{enumerate}
\end{enumerate}
\subsection{G2FCTR}
\label{gt2dlib.sub.g2fctr}
\begin{enumerate}
\item 機能
\begin{quote}
2次元の座標変換を行う.
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2FCTR(UX, UY, TX, TY)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt UX} & {\tt (R)} & 変換前の座標(その1) (入力)\\
{\tt UY} & {\tt (R)} & 変換前の座標(その2) (入力)\\
{\tt TX} & {\tt (R)} & 変換後の座標(その1) (出力)\\
{\tt TY} & {\tt (R)} & 変換後の座標(その2) (出力)
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item 予め {\tt G2SCTR} で初期化しておかないとエラーを発生する。
\item {\tt G2SCTR} で設定した {\tt UXA, UYA} の範囲外の入力に対しては、 警告を出しつつ、外挿を行う。
\end{enumerate}
\end{enumerate}
\subsection{G2ICTR}
\label{gt2dlib.sub.g2ictr}
\begin{enumerate}
\item 機能
\begin{quote}
{\tt G2FCTR} (2次元の座標変換) の逆変換を行う.
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2ICTR(TX, TY, UX, UY)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt TX} & {\tt (R)} & 逆変換前の座標(その1) (入力)\\
{\tt TY} & {\tt (R)} & 逆変換前の座標(その2) (入力)\\
{\tt UX} & {\tt (R)} & 逆変換後の座標(その1) (出力)\\
{\tt UY} & {\tt (R)} & 逆変換後の座標(その2) (出力)
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item 予め {\tt G2SCTR} で初期化しておかないとエラーを発生する。
\item {\tt G2SCTR} で設定した {\tt TXA, TYA} の範囲外の入力に対しては、 エラーを発生する。
\end{enumerate}
\end{enumerate}
\subsection{G2QCTR}
\label{gt2dlib.sub.g2qctr}
\begin{enumerate}
\item 機能
\begin{quote}
初期化済か否かの問合わせ.なお、初期化せずに {\tt G2FCTR, G2ICTR} を呼べばエラーがでるようになっているので、問合わせは必須ではない。
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt CALL G2QCTR(LINIT)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt LINIT} & {\tt (L)} & 初期化済なら {\tt .TRUE.} まだなら {\tt .FALSE.} を返す。(出力)
\end{tabular}
\end{quote}
\item 備考
\begin{enumerate}
\item {\tt G2SCTR} が既に呼ばれていれば {\tt .TRUE.}
\end{enumerate}
\end{enumerate}
\subsection{LG2INQ}
\label{gt2dlib.sub.lg2inq}
\begin{enumerate}
\item 機能
\begin{quote}
ある点が四辺形の内側にあるか判定する。凸四辺形限定。
\end{quote}
\item 呼び出し方法
\begin{quote}
{\tt LIN = LG2INQ(TX,TY, TX00,TX10,TX01,TX11, TY00,TY10,TY01,TY11)}
\end{quote}
\item パラメーターの説明
\begin{quote}
\begin{tabular}{llp{10cm}}
{\tt TX,TY} & {\tt (R)} & 判定すべき点の座標 (入力) \\
{\tt TX00,TX10,TX01,TX11, TY00,TY10,TY01,TY11} & {\tt (R)} & 四辺形の4隅の座標 (入力)
\end{tabular}
戻り値 (L) 内側または境界上にあれば {\tt .TRUE.} 外側なら {\tt .FALSE.} を返す.
\end{quote}
\item 備考
\begin{enumerate}
\item {\tt G2ICTR} が下請として用いる.
\item 凹四辺形には対応していない。座標変換においては、凹四辺形は多価性のある変換にしか現われない。多価の場合は、逆変換はそもそも一意に決まらないので、利用価値が低い。将来的には、凹四辺形に対応してもよい。
\end{enumerate}
\end{enumerate}
\subsection{下請}
{\tt FUNCTION G2SGRD, FUNCTION G2QGRD}
{\tt G2SCTR} の下請であり、動的な配列確保のため C で書かれている。それ以外に
独立な関数とするべき理由はないので説明は割愛する。
|