第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::grclsprogram u2d5