DCL:らくらくDCL:描画の基本(2):ユーザー座標系(U-座標系)での基本描画
次のプログラム KIHON7 では, U-座標系でのポリラインやテキストプリ ミティブの出力結果が, ウインドウとビューポートの設定の仕方によってどの ようになるかを示しましょう.
PROGRAM KIHON7 WRITE(*,*) ' WORKSTATION ID (I) ? ;' CALL SGPWSN READ (*,*) IWS CALL SGOPN( IWS ) C CALL SGLSET( 'LCLIP', .TRUE. ) *-- frame 1 ---- CALL SGFRM * XMIN, XMAX, YMIN, YMAX CALL SGSWND( -100., 100., -100., 100. ) CALL SGSVPT( 0.0, 1.0, 0.0, 1.0 ) CALL SGSTRN( 1 ) CALL SGSTRF CALL APLOT *-- frame 2 ---- CALL SGFRM *-- 左上 ---- XMIN, XMAX, YMIN, YMAX CALL SGSWND( -100., 100., -100., 100. ) CALL SGSVPT( 0.1, 0.4, 0.6, 0.9 ) CALL SGSTRN( 1 ) CALL SGSTRF CALL APLOT *-- 右上 ---- XMIN, XMAX, YMIN, YMAX CALL SGSWND( -100., 100., -40., 40. ) CALL SGSVPT( 0.6, 0.9, 0.6, 0.9 ) CALL SGSTRN( 1 ) CALL SGSTRF CALL APLOT *-- 左下 ---- XMIN, XMAX, YMIN, YMAX CALL SGSWND( -100., 100., -200., 0. ) CALL SGSVPT( 0.1, 0.4, 0.1, 0.4 ) CALL SGSTRN( 1 ) CALL SGSTRF CALL APLOT *-- 右下 ---- XMIN, XMAX, YMIN, YMAX CALL SGSWND( -100., 100., 0., -200. ) CALL SGSVPT( 0.6, 0.9, 0.1, 0.4 ) CALL SGSTRN( 1 ) CALL SGSTRF CALL APLOT CALL SGCLS END *----------------------------------------------------------------------- SUBROUTINE APLOT PARAMETER( NMAX=40 ) REAL X(0:NMAX), Y(0:NMAX) CALL SLPVPR( 1 ) *-- 円形 ---- DT = 2.*3.14159 / NMAX DO 10 N=0,NMAX X(N) = 40.*SIN(N*DT) Y(N) = 40.*COS(N*DT) 10 CONTINUE CALL SGPLU( NMAX+1, X, Y ) *-- 三角形 ---- DT = 2.*3.14159 / 3 DO 20 N=0,3 X(N) = 40.*SIN(N*DT) Y(N) = 40.*COS(N*DT) 20 CONTINUE CALL SGPLU( 4, X, Y ) *-- 文字列 ---- CALL SGTXU( 0., 0., 'SGTXU' ) RETURN END
PROGRAM KIHON7
1フレームめが基本形で, まず SLPVPR ルーチンでビューポートの枠を
描き, U-座標系描画ルーチンの SGPLU で円と正三角形を描き, SGTXU で文字列 'SGTXU' を描いています(サブルーチン APLOT).
2フレームめの左上には, 同じ APLOT サブルーチンでビューポートだけ
を小さくして描いてみました. ビューポートが小さくなったのに対応して
SGPLU で描いた円と三角形は小さくなりましたが, 文字の大きさは1フ
レームめと変わりません. U-座標系でのテキストプリミティブでも, 文字の
大きさはV-座標系の単位で指定するので, ビューポートの大きさが変わっても
文字の大きさは変わらないのです.
次に, ウインドウのy軸の範囲を変えてみました(右上). 範囲を40%に狭め
たので, 図形は縦に引き延ばされて, 円が楕円になりました. この場合にも,
文字は変わりません.
左下の例では, ウインドウの縦横比を元に戻して, UYMIN=-200, UYMAX=0 と y軸負方向に平行移動させました. その結果, 設定したビュー
ポートをはみ出して図形を描いています.
最後に, 右下の例はウインドウのy軸を逆転させた場合です.
UYMIN=0, UYMAX=-200 として, 左下の場合と逆にしました. この
時の三角形を見れば明らかなように, 図形は上下に折り返されています. ただ
し, 文字列は正立のままで折り返されません.
下の2つの例のように, 設定したビューポートをはみ出して図形を描く場合, はみ出した部分を描かないようにすることも出来ます. SGLSET ルーチ ンを用いてクリッピングに関する内部変数 'LCLIP' を.TRUE. に してやると, ビューポートをはみ出した部分はラインでも文字でも描かれませ ん. 8行めのコメント行をもとに戻せばクリッピングを行ないます.