File: gt2dlib.tex

package info (click to toggle)
dcl 7.5.2-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 21,172 kB
  • sloc: fortran: 48,440; f90: 12,803; ansic: 6,566; makefile: 4,747; ruby: 184; sh: 153
file content (281 lines) | stat: -rw-r--r-- 12,774 bytes parent folder | download | duplicates (10)
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 で書かれている。それ以外に
独立な関数とするべき理由はないので説明は割愛する。