8.1 コンターラインをコントロール

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.close

PROGRAM U2D1

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

デフォルトではラベル付きの太線が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.
*** MESSAGE (-CNT.-) *** Z( 1, 1)= -1.00000000 ===> -1.00000119
Contour.draw では, ある格子点での値がコンターレベルと等しい時に, 格子 点値をわずかにずらして作画し, このようなメッセージを出力します. たいて いの場合, このメッセージを気にする必要はありません.



もう少しコンターラインにこだわってみましょう. 次のプログラム 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.close

PROGRAM U2D2

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