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

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

トーンの指定は, 必要なレベルの分だけ uestlv ルーチンを呼ぶことに よっておこないます(37行め). 最初の2つの引数によってぬりわけるレベルの 下限値と上限値を指定し, 最後の引数でトーンパターン番号を指定します. トー ンパターンは巻末付録を御覧下さい. uestln というルーチンを用いれ ば, 複数の塗り分けるレベルとパターンを配列で一度に指定することもできま す. また, udgcla, udgclb ルーチンと同様のトーンレベル生成 ルーチン uegtla, uegtlb もあります.

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

# u2d5.rb


require "narray"
require "numru/dcl"
include NumRu
include Math


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 ---
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws

DCL::sglset('LSOFTF', true)
DCL::grfrm

DCL::grswnd(xmin, xmax, ymin, ymax)
DCL::grsvpt(0.2, 0.8, 0.2, 0.8)
DCL::grstrn(1)
DCL::grstrf

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
  DCL::uestlv(tlev1, tlev2, ipat)
end

DCL::usdaxs
DCL::udgclb(p, 0.4)
DCL::udcntr(p)
DCL::uetone(p)

DCL::grcls

program u2d5

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