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

次のプログラム 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) を描いています.

これらは, 個々のルーチンで属性を決めてから 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