2次元のスカラー場を手早くコンタリングして見たいというときには, 等高線 描画モジュール Contour にあるメソッド draw を1つ呼ぶだけで 十分です. 例題として, 球面調和関数の重ね合わせ の実部を描いてみましょう(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.closePROGRAM QUICK3
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.closePROGRAM QUICK4