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