これまでの出力プリミティブはすべて線分で構成されていましたが, トーンプ
リミティブは出力装置の能力に応じて, ハードフィルまたはソフトフィルを切
替えて多角形のぬりつぶしを行ないます. ハードフィルでは実際にデバイスに
依存した「領域のぬりつぶし」を行ないますが, ソフトフィルではそこにドッ
トや線分を描くことによって「ぬりつぶし」を実現します.
トーンプリミティブには, トーンパターンという属性があります. トーンパター
ンには色とパターンの2つの情報が含まれていますが, カラーグラフィクスに
ついては第12章で説明しますので, ここではドットや横線, 斜線
などのパターンだけが変えられる出力装置を念頭に置いて説明しましょう.
まず, パターンの種類ですが, 3けたのパターン番号で指定します. 具体的に
は巻末付録のトーンパターンテーブルを参照して下さい. パターン番号の1桁
め(0〜6)は, 次のパターンの種類をあらわします. 0: ドット, 1: 横線,
2: 斜線(右上がり), 3: 縦線, 4: 斜線(左上がり), 5: 格子(縦横), 6: 格子
(斜め). 2桁めは, ドットの大きさや斜線の太さで, 0から5まで値が大きくな
るにつれてドットは大きくなり斜線は太くなります. 3桁めはドットや斜線の
密度で, 0から5まで値が大きくなるにつれて密度が高くなります. ただし3桁
めが0のときは何も描かれません. パターン番号として999を指定するとべたぬ
りとなります. これらの組合せ以外の整数値はパターンが定義されていません.
さて, kihon5 のプログラム例ですが, 27行めで sglset ルーチ
ンを用いてトーンプリミティブに関する論理型内部変数 'LSOFTF' を
.true. としてソフトフィルを選んでいます. そして sgtnv ルー
チンで多角形の内部をぬりつぶします. 引数の与え方は sgplv と似て
いますが, sgtnv では多角形を定義する頂点の座標を与えます. 配列の
最初と最後(ポリラインでは始点と終点)が一致する必要はありません. この例
の左上では6角形をトーンパターンの初期値001(小さく疎なドット)でぬりつぶ
しました. 右上では, sgstnp ルーチンでトーンパターン番号を3に指定
してぬりつぶしています. 003 ですから, 同じ大きさのドットでより密なパター
ンです. 左下は 601 で斜め格子の例です.
sgtnv で指定する多角形は単連結領域である必要はありません. 右下の ように多角形の辺同志が交差する「ねじれた多角形」でも, その図形によって できる閉領域を全てぬりつぶします.
# kihon5.rb require "narray" require "numru/dcl" include NumRu include Math nmax = 40 imax = 4 x = NArray.sfloat(nmax+1, imax) y = NArray.sfloat(nmax+1, imax) xc = NArray[0.25, 0.75, 0.25, 0.75] yc = NArray[0.75, 0.75, 0.25, 0.25] #-- data ---- dt = 2*PI/6 for n in 0..5 for i in 0..imax-2 x[n,i] = 0.2*cos(n*dt) + xc[i] y[n,i] = 0.2*sin(n*dt) + yc[i] end end dt = 4*PI/nmax for n in 0..nmax x[n,imax-1] = 0.4*n/nmax - 0.2 + xc[imax-1] y[n,imax-1] = 0.2*sin(n*dt) + yc[imax-1] end #-- graph ---- iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i DCL::sgopn iws DCL::sglset('LSOFTF', true) DCL::sgfrm #-- default ---- DCL::sgtnv(x[0..5,0], y[0..5,0]) #-- tone pattern ---- DCL::sgstnp(3) DCL::sgtnv(x[0..5,1], y[0..5,1]) DCL::sgstnp(601) DCL::sgtnv(x[0..5,2], y[0..5,2]) #-- twisted polygon ---- DCL::sgtnv(x[true,3], y[true,3]) DCL::sgcls
DCLのしくみ 1
|