%表題   らくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%  \Dchapter{描画の基本(1))}
\Dchapterhead
\label{c:kihon1}

これからの2章では, いくつかの簡単なプログラム例を用いて, GRPH1 の中の
ユーザーインターフェイスパッケージ SGPACK の基本的な機能を説明しましょ
う. まず, この章では, 各種出力プリミティブとその属性について述べ, 次章
では, 座標系・座標変換と出力プリミティブのちょっと進んだ内容について述
べることにします.
\vspace{1em}

出力例の図は縮小されているので線の太さなどの見た目が実際の出力結果と異
なる場合があります. ご注意下さい. FORTRAN プログラムが
dcl-x.x/demo/rakuraku/kihon/ にありますので, 実際に試してみて下さい.

%-----------------------------------------------------------------------
\section{仮想直角座標系(V-座標系)での基本描画}
\label{s:kihon1_v}

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

\Dproginput{kihon1/kihon1.f}
\vspace{1em}

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

第\ref{c:quick}章では {\tt GROPN} だったのが, {\tt SGOPN} になっていま
す. 以下の {\tt SGFRM} や {\tt SGCLS} なども同様ですが, {\tt SGxxx} が
GRPH1 のコントロールルーチンであるのに対して, {\tt GRxxx} はそれぞれに
対応する GRPH2 のコントロールルーチンなのです. {\tt GRxxx} ではいくつ
かの初期化処理も同時に行なっているので, 第\ref{c:quick}章のように
GRPH2 のルーチン(例えば, {\tt QUICK1} では {\tt USGRPH}) を使う場合に
は, こちらを使います. 一方, この章では GRPH1 で閉じたルーチン群で説明
をするので, {\tt SGxxx} を用いています.
\vspace{1em}

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

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

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

\begin{center}
\Depsf[10cm]{kihon1/kihon1_0001.eps}\\
{\bf kihon1.f: frame1}\\
\end{center}

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

%-----------------------------------------------------------------------
\section{ポリラインプリミティブ}

折れ線を描くポリラインプリミティブには, 次の2つの属性があります.
\begin{itemize}
  \item ラインインデクス(折れ線の太さ・色)
  \item ラインタイプ(折れ線の線種)
\end{itemize}
カラーグラフィクスについてはまとめて第\ref{c:color}章で説明しますので,
ここでは線の太さだけが変えられる出力装置を念頭に置いて説明しましょう.
\vspace{1em}

プログラム {\tt KIHON2} では, これらの属性がどのように指定できるかを示
します. 正弦曲線を {\tt SGPLV} ルーチンで描いていますが, 一番上の線が
ラインインデクスが初期値(1)の場合です(24行め). 次からの3本は, 27行めの
{\tt SGSPLI} ルーチンでこの値を4, 6, 8と変えて描いた結果です. ラインイ
ンデクスが大きくなるにつれて, 線が太くなります.
\vspace{1em}

34行めで {\tt SGFRM} ルーチンを呼んで次のフレームを設定し, 今度はライ
ンタイプを変えて描いています. ラインタイプとは, 実線, 破線などの線種で
すが, 1から4までの番号にはあらかじめ次のタイプが決められています. 1:
実線, 2: 破線, 3: 点線, 4: 1点鎖線. 初期値は1で, 単に {\tt SGPLV} ルー
チンを呼ぶと実線で折れ線を描きます. そういえば, frame1 の結果も実線でし
た. 40行めの {\tt SGSPLT} ルーチンでこの値を2, 3, 4と変えて描いた結果
が frame2 です.
\vspace{1em}

ラインタイプには, まだまだいろんな種類があり, ユーザーがそれぞれの好み
の線種を指定することが可能です. それは第\ref{s:kihon2_pl}節で詳しく説
明することにしましょう.

\Dproginput{kihon1/kihon2.f}

\begin{center}
\Depsf[10cm]{kihon1/kihon2_0001.eps}\\
{\bf kihon2.f: frame1}\\
\end{center}

\begin{center}
\Depsf[10cm]{kihon1/kihon2_0002.eps}\\
{\bf kihon2.f: frame2}\\
\end{center}

%-----------------------------------------------------------------------
\section{ポリマーカープリミティブ}

マーカー列を描くポリマーカープリミティブには, 次の3つの属性があります.
\begin{itemize}
  \item マーカータイプ(種類)
  \item マーカーサイズ(大きさ)
  \item マーカーを描く線のラインインデクス
\end{itemize}
プログラム {\tt KIHON3} は, マーカータイプとマーカーサイズの属性を変え
て描く例です.
\vspace{1em}

まず最初のフレームですが, 第\ref{s:kihon1_v}節で見たように, 単に {\tt
SGPMV} ルーチンを呼ぶと初期値である・のマーカー列が描かれます.  28行め
の {\tt SGSPMT} ルーチンでマーカータイプを2から7まで変えると, $+$,
$\ast$, $\circ$ と順に異なるマーカー列が上から下へと描かれていきます.
巻末付録のフォントテーブルにあるマーク・記号・文字などには, それぞれ
DCL文字番号が与えられていますが, ここでは {\tt SGSPMT} で与えるDCL文字
番号に対応するマーカー列が描かれているのです. たとえば{\tt ITYPE=152}
のとき, $\alpha $ のマーカー列を描きます.
\vspace{1em}

次のフレームではマーカーの大きさを変えています. 初期値はV-座標系におけ
る単位で 0.01 です. 2番めからは, {\tt SGSPMS} ルーチンで大きさを
0.005, 0.01, 0.015, $\cdots$, 0.03 と変えた結果です. 塗りつぶしたような
マーカーもどんどん大きくしていくと, いくつかの線分で構成されていること
が見えてきます. このような時には, {\tt SGSPMI} ルーチンで描くマーカー
のラインインデクスを大きくしておくと, 線が太くなって塗りつぶした雰囲気
が出てきます.
\vspace{1em}

\begin{center}
\Depsf[10cm]{kihon1/kihon3_0001.eps}\\
{\bf kihon3.f: frame1}\\
\end{center}

\begin{center}
\Depsf[10cm]{kihon1/kihon3_0002.eps}\\
{\bf kihon3.f: frame2}\\
\end{center}

\Dproginput{kihon1/kihon3.f}

%-----------------------------------------------------------------------
\section{テキストプリミティブ}

文字列を描くテキストプリミティブには, 次のような属性があります.
\begin{itemize}
  \item 文字を描く線のラインインデクス
  \item 文字の大きさ
  \item 文字列のセンタリングオプション
  \item 文字列の回転角
\end{itemize}
プログラム {\tt KIHON4} で, これらの属性を1つずつ順に変えて文字列を書
いてみましょう.
\vspace{1em}

まず, {\tt SGTXV} だけを呼んで, デフォルトで {\tt 'SGTXV'} と書いてみ
ました. ラインインデクスの初期値は1, 文字の大きさの初期値はV-座標系に
おける単位で 0.05 で, 指定した座標に文字列の中心が来ます.
\vspace{1em}

次に, {\tt SGSTXI} ルーチンで文字を描く線のラインインデクスを変えて,
{\tt 'INDEX3'}, {\tt 'INDEX5'} と書いてみました. 大きな値にすると太字
になります. このラインインデクスはポリラインなどのラインインデクスとは
独立に管理されており, 他のラインインデクスに影響を与えたりしません. マー
カーのラインインデクスも同様です.
\vspace{1em}

また, 文字の大きさは {\tt SGSTXS} ルーチンで変えることができます
({\tt 'SMALL'} と {\tt 'LARGE'}).
\vspace{1em}

文字列の位置ですが, 文字列の左端の座標や, 右端の座標で指定することもで
きます. {\tt SGSTXC}で$-1$を指定すると左あわせ({\tt 'LEFT'}), 1で右あわせ
({\tt 'RIGHT'})となります. 初期値は0で, 中央あわせとなっています. この引数は
整数に限られることに注意して下さい.
\vspace{1em}

文字列を回転させるためには, {\tt SGSTXR} ルーチンで回転角を指定します.
単位は度で, 指定した位置を中心に反時計回りに回転します. やはり, このルー
チンでも引数は整数値に限られます。

\Dproginput{kihon1/kihon4.f}
\vspace*{5em}

\begin{center}
\Depsf[10cm]{kihon1/kihon4_0001.eps}\\
{\bf kihon4.f: frame1}\\
\end{center}


%-----------------------------------------------------------------------
\section{トーンプリミティブ}
\label{s:kihon1_ton}

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

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

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

さて, {\tt KIHON5} のプログラム例ですが, 27行めで {\tt SGLSET} ルーチ
ンを用いてトーンプリミティブに関する論理型内部変数 {\tt 'LSOFTF'} を
{\tt .TRUE.} としてソフトフィルを選んでいます. そして {\tt SGTNV} ルー
チンで多角形の内部をぬりつぶします. 引数の与え方は {\tt SGPLV} と似て
いますが, {\tt SGTNV} では多角形を定義する頂点の座標を与えます. 配列の
最初と最後(ポリラインでは始点と終点)が一致する必要はありません. この例
の左上では6角形をトーンパターンの初期値001(小さく疎なドット)でぬりつぶ
しました. 右上では, {\tt SGSTNP} ルーチンでトーンパターン番号を3に指定
してぬりつぶしています. 003 ですから, 同じ大きさのドットでより密なパター
ンです. 左下は 601 で斜め格子の例です.
\vspace{1em}

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

\Dproginput{kihon1/kihon5.f}

\begin{center}
\Depsf[10cm]{kihon1/kihon5_0001.eps}\\
{\bf kihon5.f: frame1}\\
\end{center}
