3.2 基本概念(2): 折れ線(軌跡図)

次のプログラム step1 では, uulin メソッド(元サブルーチン)を用いて4種類 の折れ線を一枚の図に重ね書きしてみましょう. まず, usspntルーチン を4回呼んで xy0, y1, y2, y3 のデータ のなかから xy の最大値と最小値を見つけ, 「おまかせ」で正規化変 換を確定して, 座標軸も描きます.

さて, 折れ線の描画ですが, 折れ線には, 線種と線の太さの2つの属性があり ます. uuslntuuslni のメソッド(元サブルーチン)でこれらの属性を変更 でき, uulin ルーチンで折れ線を描きます. 属性を陽に変更しなければ, それぞれの初期値(デフォルト)がそのまま使われます.

このプログラム例では, まず初期値のまま (X,Y0) の折れ線を描き, 次 に少し線を太くして, 破線で (X,Y1) を, 点線で (X,Y2) を, そ して1点鎖線で (X,Y3) を描いています.

これらは, 個々のルーチンで属性を決めてから uulin で折れ線を描く, 「根回し型」のルーチン群です. これに対して, ひとつのメソッド(元サブルーチン)で属性 も同時に指定して折れ線を描く, 「上意下達型」のルーチン uulinz も 用意されています. 好みの方を使って下さい.

 

 

\resizebox{10cm}{!}{\includegraphics{step/step1.eps}}


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