次に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 の内部変数管理ルーチン
SG
pGET/
SG
pSET
(SG Parameter GET/SET)
が保持している.
(以下でも同様の表記をするが, 一般にpはR/I/L/C
のどれかで,
それぞれ, 実数, 整数, 論理変数, 文字変数用のルーチンに対応することを
あらわす. )
したがって, 変更部分のみを指定した上で, SGSTRF
によって
変換関数を確定してやればよい
(その意味では, この部分に関する SGSWND
の指定も実際にはいらない).
その結果,左上に前のページと同じ図形が縮小されて描かれる.
その右側には SGSWND
のウインドウ指定で,
UYMIN > UYMAX
とし上下逆さまのウインドウを表示してみた.
ウインドウとはU座標系上の我々が見たい部分であると書いたが,
SGSWND
で小さなウインドウを指定して図形の一部だけ表示させようとしても,
これだけでは作画しようとする図形がビューポートをはみ出してしまう.
ビューポートをはみ出す部分を描かないようにするためには
SGLSET
によって, クリッピングを制御する内部変数
'LCLIP'
を.TRUE.
にしてやればよい.