今度は, 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::grcls
    
program u2d3    
