3.1 仮想直角座標系(V-座標系)での基本描画

まず最初のプログラム kihon1 を見て下さい.

# kihon1.rb

require "narray"
require "numru/dcl"

include NumRu
include NMath

nmax = 50

x  = NArray.sfloat(nmax+1)
y1 = NArray.sfloat(nmax+1)
y2 = NArray.sfloat(nmax+1)
y3 = NArray.sfloat(nmax+1)

#-- data ----
x = x.indgen * 1.0/nmax
y1 = x**3
y2 = x**2
y3 = sqrt(x)

#-- graph ----
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::sgopn iws
DCL::sgfrm

DCL::slpvpr(1)

DCL::sgplv(x, y1)
DCL::sgpmv(x, y2)
DCL::sgtxv(0.5, 0.5, 'SGTXV')
DCL::sglset('LSOFTF', true)
DCL::sgtnv(x, y3)

DCL::sgcls

program kihon1

図形を描くためには, まずディスプレイやプリンタなど図形出力装置(デバイ ス)の準備をします. この準備をする時の操作を「オープン」といい, sgopn というメソッド(元サブルーチン)を呼びます. ここで, 引数 iws はワークス テーション番号で, 各デバイスに割り当てられた番号です. iws>0 の ときは画面を横長に使い, iws<0 のときは画面を縦長に使って図形出 力は 90度回転して表示します. 14行めのメソッド(元サブルーチン) sgpwsn を呼ぶ と, それぞれの環境で利用可能なワークステーション名のリストが書き出され ます.

2章では gropn だったのが, sgopn になっていま す. 以下の sgfrmsgcls なども同様ですが, sgxxx が GRPH1 のコントロールルーチンであるのに対して, grxxx はそれぞれに 対応する GRPH2 のコントロールルーチンなのです. grxxx ではいくつ かの初期化処理も同時に行なっているので, 第2章のように GRPH2 のルーチン(例えば, quick1 では usgrph) を使う場合に は, こちらを使います. 一方, この章では GRPH1 で閉じたルーチン群で説明 をするので, sgxxx を用いています.

つぎに, sgfrm で新しい作画領域を設定します. DCLではいくつかの座 標系と座標変換が用意されていて, それぞれの座標系で作図ができます. しか し, それらの説明は次章にまわすことにして, ここでは[0,1]×[0,1] の仮想直角座標系(これからV-座標系と略記します)だけを陽に考えま しょう. sgfrm を呼ぶことにより, 各デバイスの作画できる領域に最大 内接するようにこの仮想直角座標系が設定され, この範囲がとりあえず「ビュー ポート」となります. slpvpr ルーチンでこのビューポートの枠を描い ています.

図形を構成する基本要素を出力プリミティブといいます. GRPH1 の出力プリミ ティブには, ポリライン(折れ線), ポリマーカー(マーカー列), テキスト(文 字列), およびトーン(多角形のぬりつぶし)の4つがあり, 補助的に, アロー (矢印)とライン(線分)のサブプリミティブがあります. 結果の図を参照すれば 明らかですが, sgplv ルーチンで3次メソッド(元関数)の折れ線が実線で描かれ, sgpmv ルーチンでは2次メソッド(元関数)が・のマーカー列として描かれます. また, sgtxv ルーチンで文字列 'sgtxv' がビューポートの真ん中に描 かれます. さらに, sgtnv ルーチンでは, $y=\sqrt{x}$y=x で囲 まれた領域が点々でぬりつぶされます. とりあえず, 24行めのメソッド(元サブルーチン)コー ルはこのトーンの「おまじない」と思って下さい. これらのプリミティブには それぞれいくつかの属性があり, それらを陽に指定することにより, 多種多様 な作図が可能となります.

そして, 最後に描画を終了する時の操作を「クローズ」といい, sgcls ルーチンを呼びます. すべての図形は, デバイスをオープンしてからクローズ するまでの間に描かれることになります.

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

デバイスに出力される図形が複数「ページ」にわたることがありますが, DCL では, ページという言葉の代わりに「フレーム」という言葉を使います. これ は, デバイスによってはページという概念のないもの(例えば, 巻物のような 長い紙に出力するようなデバイス) があったり, 後述のように物理的な1ペー ジの中に複数のフレームを設定することもあるからです.