U-座標系で折れ線を描くルーチンは Plot.draw です. これを使ってポリラ
インプリミティブをもっと深く探ってみましょう(KIHON9, KIHONA). 属性の1つがラインタイプですが, ユーザーの指定により, 多種多
様なラインタイプをつくることができます.
まず, KIHON9 のプログラムですが, 一番上にラインタイプが4の折れ線
(一点鎖線)を描いています. SGRSET ルーチンでポリラインプリミティ
ブに関する実数型内部変数の 'BITLEN' を変更すると, パターンの1サ
イクルの長さを変えることができます. この初期値はV-座標系の単位で0.003
ですが, 倍の0.006に設定し直したのが2本めの折れ線です. ビューポートのと
り方次第で, パターンが間延びしたり, 逆にパターンが潰れて判別できなくなっ
たりすることがありますが, そのようなときには 'BITLEN' を調節しま
しょう.
SGPACK では, 実線, 破線, 点線, および一点鎖線以外のパターンのラインタ
イプも指定できます. 実は, SGSPLT ルーチンの引数に5以上の整数を指
定すると, その2進表現のパターンを指定したものと見なされます. すなわち,
整数の下位16 bit のうち1の部分に線を描き, 0の部分は空白とするようなパ
ターンを設定します. 自分の描きたいパターンに対応する整数を求めるには,
MISC1 の BITLIB パッケージ中のBITPCI ルーチン(47行め)を使うと便
利です. '1111111100100100' のように文字型でビットパターンを与え
ると, それに対応する整数値 ITYPE が返されて, そのラインタイプで
描いた二点鎖線が3本めです.
さらに複雑なパターンを指定したいときには, SGISET で内部変数 'NBITS'を変更することにより, パターンのビット長を32 bitまで長くするこ
とができます. 4本めの折れ線はこれを32 bitにして, 3本めと同様に BITPCI ルーチンで新しいパターンを作っています.
# # kihon9.rb require "narray" require "numru/advanceddcl" include NumRu::AdvancedDCL include NMath nmax = 40 xmin = 0.0 xmax = 4*PI ymin = -1.0 ymax = 1.0 x = NArray.sfloat(nmax+1) y = NArray.sfloat(nmax+1) #-- data --- dt = xmax/nmax x = x.indgen * dt y = sin(x) #-- graph --- Dev.open Frame.new #-- ラインタイプ = 4 (デフォルト) ---- Fig.window=[xmin, xmax, ymin, ymax] Fig.viewport=[0.0, 1.0, 0.7, 0.9] Fig.transnum=1 Plot.linetype=4 Plot.draw(x, y) #-- ラインタイプ = 4 (BITLEN*2) ---- Fig.viewport=[0.0, 1.0, 0.5, 0.7] Plot.set('bitlen', 0.006) Plot.draw(x, y) Plot.bitlen=0.003 #-- ビットパターン ---- Fig.viewport=[0.0, 1.0, 0.3, 0.5] #itype = bitpci('1111111100100100') itype = '0b1111111100100100'.oct Plot.draw(x, y, "linetype"=>itype) #-- ビットパターン(倍長) ---- Fig.viewport=[0.0, 1.0, 0.1, 0.3] Plot.set('nbits', 32) #itype = bitpci('10010010011111000111110001111100') itype = '0b10010010011111000111110001111100'.oct - ('0b1' + "0"*32).oct Plot.draw(x, y, "linetype"=>itype) Dev.close
次のプログラム KIHONA は, ラベルつきの折れ線を描く例です.
Plotのパラメタ lchar を .TRUE. にすると,
ポリラインプリミティブはラベルつき折れ線を描きます. ラベル付き折れ線と
は, 描くべき線分のある長さを1サイクルとして, その一部分に空白域をとり,
そこに指定した文字列を描くものです. 描く文字列は setlabel メ
ソッドで指定します. この例では, まず 'A' のラベルをつけて折れ線を描き
ました.
次に, Plot.nplc メソッドを呼ぶと, 設定されている文字列の最
後の文字の文字番号が1つ増えます. そこで, 2本め, 3本めの折れ線のラベル
が 'B', 'C' と変わります. また, 文字列として 'K=1'
と指定すると, まず 'K=1' というラベルを描き, 次の呼び出しでは
'K=2' というラベルを描きます(4本めと5本め). これらの折れ線では,
パラメタlinetype で線分のラインタイプも変えています.
さらに, ラベル付折れ線に関するパラメータを陽に設定する
と, さまざまな変形が可能です. パラメタ lrot を .TRUE. に
して, irot で回転角を整数値で指定すると, 一定の回転角でラベル
を付けます. これが .FALSE. の場合(初期値)には, 線分に沿ってラベ
ルを描きます. また, ラベルの間隔はパラメタcwl で, ラベルの書
き始めはパラメタffct で, それぞれ調節できます.
# # kihona.rb require "narray" require "numru/advanceddcl" include NumRu::AdvancedDCL include NMath nmax = 40 xmin = 0.0 xmax = 4*PI ymin = -1.0 ymax = 1.0 x = NArray.sfloat(nmax+1) y = NArray.sfloat(nmax+1) #-- data --- dt = xmax/nmax x = x.indgen * dt y = sin(x) #-- graph --- Dev.open Frame.new Plot.lchar=true #-- ラベルつき折れ線 ---- Fig.window=[xmin, xmax, ymin, ymax] Fig.viewport=[0.0, 1.0, 0.9, 1.0] Fig.transnum=1 Plot.setlabel('A') Plot.linetype=1 Plot.draw(x, y) #-- 順序ラベル: A,B,C,... ---- for i in 1..2 vymin = 0.9 - 0.1*i vymax = vymin + 0.1 Fig.viewport=[0.0, 1.0, vymin, vymax] Plot.nplc Plot.draw(x, y) end #-- 順序ラベル: K=1,K=2,... ---- Plot.setlabel('K=1') for i in 3..4 vymin = 0.9 - 0.1*i vymax = vymin + 0.1 Fig.viewport=[0.0, 1.0, vymin, vymax] Plot.linetype=i-1 Plot.draw(x, y) Plot.nplc end Plot.linetype=1 #-- ラベルの文字列の高さ ---- Fig.viewport=[0.0, 1.0, 0.4, 0.5] Plot.spls(0.01) Plot.setlabel('small') Plot.draw(x, y) Plot.spls(0.02) #-- ラベルの角度 ---- Fig.viewport=[0.0, 1.0, 0.3, 0.4] Plot.irot=90 Plot.setlabel('ROT') Plot.draw(x, y, "lrot"=>true) #-- ラベルの間隔 ---- Fig.viewport=[0.0, 1.0, 0.2, 0.3] Plot.setlabel('CWL') Plot.draw(x, y, "cwl"=>5.0) #-- ラベルの書き始め ---- Fig.viewport=[0.0, 1.0, 0.1, 0.2] Plot.ffct= 0.9 Plot.setlabel('FCT') Plot.draw(x, y) Dev.closePROGRAM KIHONA