9.1 トーンパターンを指定する

1.2節の例のように, ただ負の領域に斜線のハッチをつける だけでは芸がありません. Tone を活用すれば, トーンをつけるレベルやパ ターンを指定することができるようになります(U2D5).

トーンの指定は, 必要なレベルの分だけ Tone.stlv ルーチンを呼ぶことに よっておこないます. 最初の2つの引数によってぬりわけるレベルの 下限値と上限値を指定し, 最後の引数でトーンパターン番号を指定します. Tone.stln というメソッドを用いれ ば, 複数の塗り分けるレベルとパターンを配列で一度に指定することもできま す. また, Contour.gcla, Contour.gclb メソッドと同様のトーンレベル生成 メソッド Tone.gtla, Tone.gtlb もあります.

この例も, 第1.2節と同じようにコンターとの重ね書きをおこ なっていますが, プログラム構成で異なるところがあります. それは, パラメ タ lsoftf.TRUE. として, ソフ トフィルを指定しているために, 座標軸の描画やコンタリングのあとで Tone.draw メソッドを呼んでも問題ないということです. Tone のハッチング は トーンプリミティブを用いていますが, トーンプリミティブは出 力装置の能力に応じてハードフィルとソフトフィルとを切替えることができま す. ハードフィルによるぬりわけを行なう場合, 出力装置によっては先に描か れた図形が消えてしまうことがあるので, QUICK4 のプログラム例では, Tone.draw を最初に呼んでいるわけです. しかし, この例ではソフトフィ ルを指定したので, 描く順番を気にしなくてもよいわけです.

#
# u2d5.rb

require "narray"
require "numru/advanceddcl"
include NumRu::AdvancedDCL
include NMath


nx = 37
ny = 37
xmin = 0
xmax = 360
ymin = -90
ymax = 90
drad = PI/180
p = NArray.new(Float, nx, ny)

#-- data ---
for j in 0..ny-1
  for i in 0..nx-1
    alon = (xmin + (xmax-xmin)*i/(nx-1)) * drad
    alat = (ymin + (ymax-ymin)*j/(ny-1)) * drad
    slat = sin(alat)
    p[i,j] = 3*sqrt(1-slat**2)*slat*cos(alon) - 0.5*(3*slat**2-1)
  end
end

#-- graph ---
Dev.open

Tone.lsoftf =  true
Frame.new

Fig.window=[xmin, xmax, ymin, ymax]
Fig.viewport=[0.2, 0.8, 0.2, 0.8]
Fig.transnum=1

for k in -5..3
  tlev1 = 0.4*k
  tlev2 = tlev1 + 0.4
  if (k <= -1)
    ipat = 600 + (k+1).abs
  else
    ipat =  30 + k
  end
  Tone.stlv(tlev1, tlev2, ipat)
end

Axis.draw
Contour.gclb(p, 0.4)
Contour.draw(p)
Tone.draw(p)

Dev.close

PROGRAM U2D5

\resizebox{10cm}{!}{\includegraphics{u2d2/u2d5.eps}}
u2d5.rb: frame1