1.2 とりあえず等高線図

2次元のスカラー場を手早くコンタリングして見たいというときには, 等高線 描画モジュール Contour にあるメソッド draw を1つ呼ぶだけで 十分です. 例題として, 球面調和関数の重ね合わせ $ P^{1}_{2}(\sin \phi)\exp (i \lambda) - P_{2}(\sin \phi) $ の実部を描いてみましょう(QUICK3).

#
# quick3.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.draw(p)

Dev.close

PROGRAM QUICK3

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

Contour.draw は等高線図を描くだけで, 枠や座標軸を描いてくれませんから, この例ではまず, いくつかの「おまじない」(Fig.window=, Fig.viewport=, Fig.transnum=)で座標系を決め, Axis.draw を使っておまかせの座標軸を描画したのちに, Contour.draw を呼ん で等高線図を描いています.

Contour.draw の引数は, P が作画しようとする場を与える2次元 配列です.

この例のように Contour.draw だけを呼ぶ場合には, 等間隔の格子点を設定し てコンタリングを行ないます. つまり, 座標軸の目盛に関係なく, P(0,0) が左下隅, P(nx-1,ny-1) が右上隅にくるような等間隔の格子点座 標が設定されます. また, コンターレベルも自動的に決定されて, 図の下にそ のコンター間隔が表示されます.

折れ線を描いたり文字列を描いたりする機能の他にも, 多角形閉領域のぬりつぶしを行なう機能があります. Tone.draw はこれに対応するトーンぬりつぶしのメソッドですが, QUICK3 の例で Tone.draw メソッドを1つ呼ぶだけで, とりあえ ず負の領域に斜線のハッチをつけることができます(QUICK4). ここで UETONE を呼ぶのが31行めで, 座標軸やコンターを描くよりも前である ことに注意しておきましょう. これらの順序を変えると, 出力装置によっては 結果が異なります. それまでに描いた部分がぬりつぶされ消されてしまうこと があるのです. この点については, 第2.5節, 第 9.1節で詳しく説明します.

Contour や Tone の諸機能を使うことによって, 高度な等高線図が 描けるようになります. カラーグラフィクスが利用できる環境では, このよう な等高線図を色の塗り分け(カラー グラデーション)で表現することも可能に なります. これらは, 第8, 9, 11章で説 明することにしましょう.

#
# quick4.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

Tone.draw(p)
Axis.draw
Contour.draw(p)

Dev.close
PROGRAM QUICK4





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