2.5 トーンプリミティブ

これまでの出力プリミティブはすべて線分で構成されていましたが, トーンプ リミティブは出力装置の能力に応じて, ハードフィルまたはソフトフィルを切 替えて多角形のぬりつぶしを行ないます. ハードフィルでは実際にデバイスに 依存した「領域のぬりつぶし」を行ないますが, ソフトフィルではそこにドッ トや線分を描くことによって「ぬりつぶし」を実現します.

トーンプリミティブには, トーンパターンという属性があります. トーンパター ンには色とパターンの2つの情報が含まれていますが, カラーグラフィクスに ついては第11章で説明しますので, ここではドットや横線, 斜線 などのパターンだけが変えられる出力装置を念頭に置いて説明しましょう.

まず, パターンの種類ですが, 3けたのパターン番号で指定します. 具体的に は巻末付録のトーンパターンテーブルを参照して下さい. パターン番号の1桁 め(0〜6)は, 次のパターンの種類をあらわします. 0: ドット, 1: 横線, 2: 斜線(右上がり), 3: 縦線, 4: 斜線(左上がり), 5: 格子(縦横), 6: 格子 (斜め). 2桁めは, ドットの大きさや斜線の太さで, 0から5まで値が大きくな るにつれてドットは大きくなり斜線は太くなります. 3桁めはドットや斜線の 密度で, 0から5まで値が大きくなるにつれて密度が高くなります. ただし3桁 めが0のときは何も描かれません. パターン番号として999を指定するとべたぬ りとなります. これらの組合せ以外の整数値はパターンが定義されていません.

さて, KIHON5 のプログラム例ですが, Tone.lsoftf= メ ソッドを用いてToneモジュールのパラメタlsoftf.TRUE. としてソフトフィルを選んでいます. そして Tone.vfill メソッドで多角形の内部をぬりつぶします. 引数の与え方は Plot.vdraw と似て いますが, Tone.vfill では多角形を定義する頂点の座標を与えます. 配列の 最初と最後(ポリラインでは始点と終点)が一致する必要はありません. この例 の左上では6角形をトーンパターンの初期値001(小さく疎なドット)でぬりつぶ しました. 右上では, Tone.tonepat= メソッドでトーンパターン番号を3に指定 してぬりつぶしています. 003 ですから, 同じ大きさのドットでより密なパター ンです. 左下は 601 で斜め格子の例です.

Tone.vfill で指定する多角形は単連結領域である必要はありません. 右下の ように多角形の辺同志が交差する「ねじれた多角形」でも, その図形によって できる閉領域を全てぬりつぶします.

 

#
# kihon5.rb

require "narray"
require "numru/advanceddcl"

include NumRu::AdvancedDCL
include NMath

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 ----
Dev.open

Tone.lsoftf=true
Frame.new

#-- default ----
Tone.vfill(x[0..5,0], y[0..5,0])

#-- tone pattern ----
Tone.tonepat=3
Tone.vfill(x[0..5,1], y[0..5,1])

Tone.tonepat=601
Tone.vfill(x[0..5,2], y[0..5,2])

#-- twisted polygon ----
Tone.vfill(x[true,3], y[true,3])

Dev.close
PROGRAM KIHON5

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