next up previous
Next: イニシャルセグメントの順番 Up: 連続した等高線を求めるアルゴリズムの概要 Previous: 連続した等高線を求めるアルゴリズムの概要

アルゴリズムの概要

前節では, 四角形の格子を三角形に分割し, 各部分領域における z=f(x,y) の近似値および等高線の求め方について述べた. 部分領域における等高線は, この三角形の辺または頂点を端点とする直線線分となる. したがって, 等高線 z=zc の位置座標として, 連続した等高線を右側が z < zc となるようにたどっていったとき, 等高線が三角形の辺または頂点を次々と横切る点の座標を順番に求めればよい. これらの点を直線で結ぶと近似曲線が得られる.


  
Figure 5: (i,j)番目の格子のフラグとセグメント
\begin{figure}
\begin{center}
\begin{picture}
(180,180)
\par\put(10,10){\circle*...
...or(-2,-1){10}}
\put(107,97){$S_{8,i,j}$ }
\end{picture}\end{center}\end{figure}

三角形の部分領域では 等高線を平面どうしの交線で近似するので,一つの三角形を 同一レベルの等高線が2回以上横切ることはない. そこでFigure: 5のように(i,j)番目の 格子内の4つの三角形に対して $T_{1,i,j},\cdots,T_{4,i,j}$ という 名前の論理型フラグを設ける. このフラグを等高線がすでに三角形を横切った かどうか判断するために使用し, 重複して横切るのをさける. このフラグ名は三角形の識別名 としても用いることとし, 対応する三角形を三角形 Tm,i,j というよう に呼ぶことにする. また, 三角形の辺や頂点を構成する線分や格子点, 格子の中心点に対して S1,i,j,...,S8,i,j という名前をつける. これらは線分と点であるが便宜的にすべてセグメントと呼ぶことにする. これをすべての格子 $(i,j),i=1,\cdots,n_x,j=1,\cdots,n_y$ に対して行う. そしてフラグ Tm,i,j は, 等高線を描きたい格子空間の境界の一つ外側 の部分にも仮想的に設けてそこで true とし, 等高線を描きたい空間の領域に対 してはすべて false を設定する. 等高線を求めるアルゴリズムのアウトラインはつぎのようになる.

1.
Sn,i,j,(n=1,...,8, i=1,...,nx, j=1,...,ny) の 中から適当なイニシャルセグメントを決める. この決め方の順序に関しては 3.2 で説明する.
2.
イニシャルセグメントが等高線の初期点を含むときこれを カレントセグメントとする. 等高線の初期点はその点からまわりに向かって等高線が伸びて行くような 点である. これに関しては 3.3 で説明する. イニシャルセグメントが初期点を含まない場合は 1 に戻る.
3.
カレントセグメントと等高線の交点の座標を計算して出力する. カレントセグメントが頂点の場合はその座標が交点の座標となり, 辺の場合は両端点の座標および関数値から補間する. 計算方法は2.3で述べた.
4.
等高線がカレントセグメントのまわりのどの三角形を横切って どのセグメントに進むのかを判断する. 判断方法は 3.3 で説明する. 横切る三角形に対応するフラグを true に変化させて, 進む先のセグメントにカレントセグメントを移動する. 等高線が三角形の辺に沿って頂点と頂点の間を進む場合は進行方向に対して 右側(z<zc の領域)の三角形のフラグを true にする. そして 3 に戻る.
5.
等高線が次に進むべき三角形やセグメントがなくなれば カレントセグメント上のz=zcの点が終点となる. そして 1 に戻り新しいイニシャルセグメントに対して同様のこと を繰り返す.

ng2d では, サブルーチン ngc0a, ngc0s でフラグ Tm,i,j に対応する 作業用配列を宣言し, 1 のイニシャルセグメントを決定する手続きを担当させる. そして 2 $\sim$ 5 の手続きに相当するサブルーチン ngtcl を呼び出す.



Amane TANAKA
2000-04-23