3.5 トーンプリミティブ

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

トーンプリミティブには, トーンパターンという属性があります. トーンパター ンには色とパターンの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

PROGRAM KIHON5

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

 

 

DCLのしくみ 1

SGPACKルーチンの名付け方

SGPACKの各出力プリミティブを定義するメソッド(元サブルーチン)名の名付け方は以下のようになっています.

  1. 先頭の2文字はすべてsgで始まる.
  2. 属性を設定/参照する場合, 3文字目はs (set)/ q (query)である.
  3. 各プリミティブの名前がそれに続く.それぞれ,
    • pl : ポリラインプリミティブ.
    • pm : ポリマーカープリミティブ.
    • tx : テキストプリミティブ.
    • tn : トーンプリミティブ.
    • la : アローサブプリミティブ.
    • ln : ラインサブプリミティブ.
  4. プリミティブを定義(出力)するルーチンについて,属性を同時に指定する 場合はzが続く.
  5. さらにプリミティブをどこに定義するかによって, u (U-座標系で定義する), v (V-座標系で定義する) またはr (R-座標系で定義する)が続く.
  6. プリミティブの属性を設定/参照する場合, 6文字目はその属性を示す.
    • t : ラインタイプ,マーカータイプ.
    • i : ラインインデクス.
    • s : マーカーサイズ,文字の高さ.
    • r : 文字列の回転角.
    • c : 文字列のセンタリングオプション.
    • p : トーンパターン.