DCL:らくらくDCL:描画の基本(2):ユーザー座標系(U-座標系)での基本描画
ユーザーが実際のデータをもとに作図する過程を kihon6 のプログラム 例をもとに考えてみましょう. ある地点の年平均気温のデータが1950年から 2000年まであり, およそセ氏16度から19度の範囲内で変動していた(第 2章のロジスティク模型の結果をちょっと細工しただけですが)と しましょう. このデータを元に平均気温の年々変動の折れ線グラフを描こう と思います. x軸を時間軸にとり1950年から2000年まで, y軸には15度から 20度を範囲として, このデータを折れ線で描くことにします.
# kihon6.rb require "narray" require "numru/dcl" include NumRu include Math nmax = 50 x = NArray.sfloat(nmax+1) y = NArray.sfloat(nmax+1) #-- data ---- r = 3.7 x.indgen(1950.0, 1.0) y[0] = 0.5 for n in 0..nmax-1 y[n+1] = r*y[n]*(1-y[n]) end y = -4 * y + 20.0 #-- graph ---- iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i DCL::sgopn iws DCL::sgfrm DCL::grswnd(1950.0, 2000.0, 15.0, 20.0) DCL::grsvpt(0.2, 0.8, 0.2, 0.8) DCL::grstrn(1) DCL::grstrf DCL::usdaxs DCL::sgplu(x, y) DCL::grcls END
PROGRAM KIHON6
ユーザーの使っている座標系(ここでは時間[年]と温度[度])を, ユーザー座標
系(U-座標系)と呼びます. U-座標系でグラフに描きたい範囲を「ウインドウ」
と呼び, それぞれの軸の最小値と最大値で設定します. この例では, ( UXMIN, UXMAX, UYMIN, UYMAX ) = ( 1950, 2000, 15, 20 )で, 25行
めのgrswnd ルーチンで設定しています. このプログラムでは30行めで
GRPH2 の usdaxs ルーチンを用いて座標軸を描くために grxxxx
を使っていることに注意して下さい.
次に, このウインドウをV-座標系のどの範囲に対応させるかを考えて, これを
「ビューポート」と呼びます. ビューポートとは, V-座標系で通常座標軸が描
かれる矩形の領域のことです. ここでは, grsvpt ルーチンを用いて
( VXMIN, VXMAX, VYMIN, VYMAX ) = ( 0.2, 0.8, 0.2, 0.8 ) と
設定しました.
これで, ウインドウとビューポートの四隅は対応させることができましたが,
ウインドウ内の各点をビューポート内の点に対応させる必要があります. これ
を「正規化変換」と呼びます. 線形に対応させるか, 対数をとって対応させる
かなどの任意性がありますから, 具体的に変換メソッド(元関数)を決めなければなりません.
SGPACK(GRPACK) ではいくつかの変換メソッド(元関数)が用意されており, それぞれに変換
メソッド(元関数)番号が付けられています. ここでは, grstrn ルーチンでメソッド(元関数)番号1
を指定しています. これは両軸ともに線形に対応させるもので, 直角一様座標
となります.
このように設定されたパラメータの値は, 変換メソッド(元関数)を確定するルーチンgrstrf を呼ぶことで有効になります. U-座標系で描画するためには, grfrm ルーチンを呼んだ後でかつ描画をはじめる前に変換メソッド(元関数)を確定する必 要があります.
さて, U-座標系での描画ですが, V-座標系での各種描画ルーチンに対応するも のが, すべて用意されています. この例では, U-座標系でのポリラインプリミ ティブ sgplu で折れ線を描いています. 引数の与え方は全く同じで, データx, y がU-座標系の単位で用意されています. V-座標系で の描画ルーチンのメソッド(元サブルーチン)名が v で終っていたのに対して, U-座 標系での描画ルーチンは u で終るところが違っているだけで, 全く同 じ機能になっています.