次にU座標系で線分を描いてみよう.
U座標系で線分を描くには,SGFRMを実行したあとで
変換関数を定義する以下の4つのルーチンを呼ぶ:
SGSWND(SG Set WiNDow),
SGSVPT(SG Set ViewPorT),
SGSTRN(SG Set TRansformation Number),
SGSTRF(SG Set Transformation Function).
SGSTRFは
必ず最後に呼ばなければならない.
ここではU座標系の (0-1)×(0-1) の空間(ウインドウ)を
V座標系の (0-1)×(0-1) の空間(ビューポート)に投影するように
変換関数を定義しているので,
恒等変換となり, V座標系とU座標系は等しくなる.
(実は, SGFRMを実行した段階で, この恒等変換が定義されているので,
作画例の1ページ目については,SGSWNDなどによって
変換関数を改めて指定しなくても同じ結果になる.)
ここで, ウインドウとはU座標系上に描く図形のうち我々が実際に見たい領域であり,
ビューポートはその見たい領域を投影するV座標系上の領域である.
このウインドウとビューポートという言葉は今後よくでてくるので
よく覚えておいてほしい.
また, SGSTRNの引数は変換関数番号で,
1ならば線形座標, 4ならば両対数座標というように座標系のタイプを指定する.
変換関数に関する以上の情報はSGSTRFを呼んではじめて有効になる.
そのあとに呼んでいる SLPVPRはビューポートの枠を描く
SLPACK のサブルーチンである
(GRPH1/SLPACK参照).
前出の SGSLNIによりラインインデクスを設定して,
SGLNUと SGLNZUを使って実際の線分を描画する
(このほかにR座標系で作画するルーチンもあるが, ここでは述べない).
それぞれ, 根回し型と上意下達型のルーチンである.
ここで, SGLNZUで指定したラインインデクスは,
SGLNUのラインインデクスへ影響を及ぼさないことに
注意していただきたい.
SGFRMにより改ページをして,
新しいページの左上に前のページと同じ図形を描いてみる.
ウインドウとビューポートの設定に関しては,
SGSVPTによるビューポートの指定のみが前のページのものと異なる.
ウインドウ, ビューポート, 変換関数番号に関する情報はすべて
SGPACK の内部変数管理ルーチン
SGpGET/SGpSET
(SG Parameter GET/SET)が保持している.
(以下でも同様の表記をするが, 一般にpはR/I/L/Cのどれかで,
それぞれ, 実数, 整数, 論理変数, 文字変数用のルーチンに対応することを
あらわす. )
したがって, 変更部分のみを指定した上で, SGSTRFによって
変換関数を確定してやればよい
(その意味では, この部分に関する SGSWNDの指定も実際にはいらない).
その結果,左上に前のページと同じ図形が縮小されて描かれる.
その右側には SGSWNDのウインドウ指定で,
UYMIN > UYMAXとし上下逆さまのウインドウを表示してみた.
ウインドウとはU座標系上の我々が見たい部分であると書いたが,
SGSWNDで小さなウインドウを指定して図形の一部だけ表示させようとしても,
これだけでは作画しようとする図形がビューポートをはみ出してしまう.
ビューポートをはみ出す部分を描かないようにするためには
SGLSETによって, クリッピングを制御する内部変数
'LCLIP'を.TRUE.にしてやればよい.