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

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

#
# kihon1.rb

require "narray"
require "numru/advanceddcl"

include NumRu::AdvancedDCL
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 ----
Dev.open
Frame.new

Frame.pvpr(1)

Plot.vdraw(x, y1)
Mark.vdraw(x, y2)
Text.vdraw(0.5, 0.5, 'SGTXV')
Tone.lsoftf=true
Tone.vfill(x, y3)

Dev.close

PROGRAM KIHON1



図形を描くためには, まずディスプレイやプリンタなど図形出力装置(デバイ ス)の準備をします. この準備をする時の操作を「オープン」といい, Dev.open というメソッドを呼びます. ここで, 引数 は各デバイス の名前です. 2番目の引数がfalseもしくは指定しない ときは画面を横長に使い, true<0 のときは画面を縦長に使って図形出 力は 90度回転して表示します.

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

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

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

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

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