第1.2節で扱ったデータを用いて, コンターラインをユーザー の好みで制御することを考えてみましょう(U2D1).
# # u2d1.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.sfloat(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 Frame.new Fig.window=[xmin, xmax, ymin, ymax] Fig.viewport=[0.2, 0.8, 0.2, 0.8] Fig.transnum= 1 Axis.draw Contour.labelfmt = '(F4.1)' Contour.gcla(0.0, 1.4, 0.2) Contour.sclv(-1.0, 3, 4, 'abc', 0.028) Contour.dclv(0.6) Contour.draw(p) Dev.closePROGRAM U2D1
デフォルトではラベル付きの太線が1本おきに引かれますが, これをメジャー
ラインとよびます. このメジャーラインに付いているコンターラベルのフォー
マットは, パラメタlabelfmt で設定できます. 27行めのように, 指定す
るフォーマットを文字型で与えます.
コンターラインの生成ですが, ここでは, Contour.gcla メソッドで等間隔の
コンターレベルを生成します. 最初の2つの引数がコンターレベルの最小値と
最大値で, 28行めの例では負のコンターは描かれません. 最後の引数は刻み
幅ですが, これが負の時にはその絶対値程度の本数のコンターレベルを生成し
ます.
これらのメソッドでは, 等間隔のコンターレベルしか生成されません. もしも,
不等間隔のコンターレベルを指定したい場合や, 特定のコンターレベルを追加
したい場合は, 29行めのように Contour.sclv ルーチンで1本1本のコンターレ
ベルを生成します. 最初の引数がコンターレベルの値で, 残りの4つがコンター
ラインの属性です. 順に, ラインインデクス, ラインタイプ, ラベル, V-座標
系におけるラベルの大きさ, です. 逆に, ある1本のコンターレベルを無効に
するには Contour.dclv メソッドを呼びます. 引数はコンターレベルの値で,
この例では, 0.6の等高線を描いていません. また, すべてのコンターレベル
を無効にするには Contour.iclv メソッドを呼びます.
あとは, 同じ Contour.draw メソッドを呼ぶだけです. このプログラムを実行すると, 次のようなメッセージが出るはずです.
*** MESSAGE (UDCNTR) *** INAPPROPRIATE DATA WILL BE MODIFIED INTERNALLY.Contour.draw では, ある格子点での値がコンターレベルと等しい時に, 格子 点値をわずかにずらして作画し, このようなメッセージを出力します. たいて いの場合, このメッセージを気にする必要はありません.
*** MESSAGE (-CNT.-) *** Z( 1, 1)= -1.00000000 ===> -1.00000119
もう少しコンターラインにこだわってみましょう. 次のプログラム U2D2 では, パラメタを変更することにより, コンターラインをコントロール しています. この例では, パラメタ label を .FALSE. にして, メジャーラインにラベルを付けないようにします. ldash も .FALSE. にして正も負も同じラインタイプでコンター ラインを描くことにします. また, その時のラインタイプを isolid で2(破線)と指定しています. さらに, icycle を4として, 4本に1本 の割合でメジャーラインを引くことにします. 結果は, 正負の区別もつかず, わけのわからない等高線図となってしまいましたが, このような機能もあると いうデモンストレーションです.
# # u2d2.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.sfloat(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 Frame.new Fig.window=[xmin, xmax, ymin, ymax] Fig.viewport=[0.2, 0.8, 0.2, 0.8] Fig.transnum=1 Axis.draw Contour.label = false Contour.ldash = false Contour.isolid = 2 Contour.icycle = 4 Contour.draw(p) Dev.closePROGRAM U2D2