今度は, 2次元のベクトル場を手早く矢印で描きたいというときの例題です.
次のプログラム u2d3 は簡単な変形場を描くものですが, メソッド(元サブルーチン)
ugvect 1つを呼ぶだけで十分です. 前節の等高線図の場合と同様に, お
まかせの座標軸を描画したあとで ugvect ルーチンを呼んでベクトル場
を描いています.
この例でも, 等間隔の格子点を設定して, それぞれの格子点でのベクトルを矢 印で表現します. おまかせ描画のときには, ベクトルの長さが格子点間隔を越 えないようにスケーリングファクターが決定され, それを乗じてベクトルが描 かれます. この場合, x 成分とy 成分のスケーリングファクターは同じに なっていて, 図の下部マージンにはその値が表示されています.
u (実数型) ベクトルのx 成分を与える mu×nyの2次元配列. 作画には nx× nyの部分を使う. mu (整数型) 配列 uの第1次元整合寸法. v (実数型) ベクトルのy 成分を与える mv× nyの2次元配列. 作画には nx× nyの部分を使う. mv (整数型) 配列 vの第1次元整合寸法. nx (整数型) 作画に使う配列 u, vの第1次元寸法. ny (整数型) 作画に使う配列 u, vの第2次元寸法.
# u2d3.rb require "narray" require "numru/dcl" include NumRu include Math nx = 21 ny = 21 xmin = -1.0 xmax = 1.0 ymin = -1.0 ymax = 1.0 dx = (xmax-xmin)/(nx-1) dy = (ymax-ymin)/(ny-1) u = NArray.sfloat(nx, ny) v = NArray.sfloat(nx, ny) #-- data ---- xi = xmin + NArray.sfloat(nx).indgen! * dx yj = ymin + NArray.sfloat(ny).indgen! * dy for j in 0..ny-1; u[true,j] = xi; end for i in 0..nx-1; v[i,true] = -yj; end #-- graph ---- iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i DCL::gropn iws DCL::grfrm DCL::grswnd(xmin, xmax, ymin, ymax) DCL::uspfit DCL::grstrf DCL::ussttl('X', 'km', 'Y', 'km') DCL::usdaxs DCL::ugvect(u, v) DCL::grclsprogram u2d3