次のプログラム step1 では, uulin メソッド(元サブルーチン)を用いて4種類
の折れ線を一枚の図に重ね書きしてみましょう. まず, usspntルーチン
を4回呼んで x と y0, y1, y2, y3 のデータ
のなかから x と y の最大値と最小値を見つけ, 「おまかせ」で正規化変
換を確定して, 座標軸も描きます.
さて, 折れ線の描画ですが, 折れ線には, 線種と線の太さの2つの属性があり
ます. uuslnt と uuslni のメソッド(元サブルーチン)でこれらの属性を変更
でき, uulin ルーチンで折れ線を描きます. 属性を陽に変更しなければ,
それぞれの初期値(デフォルト)がそのまま使われます.
このプログラム例では, まず初期値のまま (X,Y0) の折れ線を描き, 次 に少し線を太くして, 破線で (X,Y1) を, 点線で (X,Y2) を, そ して1点鎖線で (X,Y3) を描いています.
n (整数型) データ数. x, y (実数型) 折れ線を結ぶ点の(x,y)座標値 を与える配列.
itype (整数型) 折れ線の線種. 1:実線, 2:破線, 3:点線, 4:1点鎖線. (初期値は1)
index (整数型) 折れ線の太さ. 1から大きくなるにつれて太くなる. (初期値は1)
これらは, 個々のルーチンで属性を決めてから uulin で折れ線を描く, 「根回し型」のルーチン群です. これに対して, ひとつのメソッド(元サブルーチン)で属性 も同時に指定して折れ線を描く, 「上意下達型」のルーチン uulinz も 用意されています. 好みの方を使って下さい.
step1.rb: frame1
# step1.rb
require "narray"
require "numru/dcl"
include NumRu
include NMath
nmax = 201
imax = 5
len_2 = 5
ix = 0
iy0 = 1
iy1 = 2
iy2 = 3
iy3 = 4
z1 = NArray.sfloat(nmax, len_2)
a = []
#-- data ----
for m in 1..imax
tm = (2*m - 1)*PI
a[m-1] = (-1.0)**m * 2/tm
end
idx = NArray.sfloat(nmax).indgen!
z1[true,ix] = 1.0*idx/(nmax-1)
tn = 2*PI*z1[true,ix]
z1[ ( (tn>=(PI/2)) & (tn<(PI*3/2)) ).where, iy0] = 1.0
z1[true,iy1] = 0.5 + a[0]*cos(tn)
z1[true,iy2] = 0.5
z1[true,iy3] = 0.5
for k in 1..imax
tk = 2*k - 1
tc = a[k-1]*cos(tk*tn)
z1[true,iy2] = z1[true,iy2] +
if (k <= 3) then tc else 0 end
z1[true,iy3] = z1[true,iy3] + tc
end
#-- graph ----
iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws
DCL::grfrm
x = z1[true,ix]
y0 = z1[true,iy0]
y1 = z1[true,iy1]
y2 = z1[true,iy2]
y3 = z1[true,iy3]
DCL::usspnt(x, y0)
DCL::usspnt(x, y1)
DCL::usspnt(x, y2)
DCL::usspnt(x, y3)
DCL::uspfit
DCL::grstrf
DCL::ussttl('FREQUENCY', '/DAY', 'RESPONSE', '')
DCL::usdaxs
DCL::uulin(x, y0)
DCL::uuslnt(2)
DCL::uuslni(3)
DCL::uulin(x, y1)
DCL::uuslnt(3)
DCL::uulin(x, y2)
DCL::uuslnt(4)
DCL::uulin(x, y3)
DCL::grcls
program step1