4.1.2 ウインドウとビューポート

次のプログラム 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

\resizebox{10cm}{!}{\includegraphics{kihon2/kihon7_001.eps}}
kihon7.f: frame1

\resizebox{10cm}{!}{\includegraphics{kihon2/kihon7_002.eps}}
kihon7.f: frame2

1フレームめが基本形で, まず SLPVPR ルーチンでビューポートの枠を 描き, U-座標系描画ルーチンの SGPLU で円と正三角形を描き, SGTXU で文字列 'SGTXU' を描いています(サブルーチン APLOT).

2フレームめの左上には, 同じ APLOT サブルーチンでビューポートだけ を小さくして描いてみました. ビューポートが小さくなったのに対応して SGPLU で描いた円と三角形は小さくなりましたが, 文字の大きさは1フ レームめと変わりません. U-座標系でのテキストプリミティブでも, 文字の 大きさはV-座標系の単位で指定するので, ビューポートの大きさが変わっても 文字の大きさは変わらないのです.

次に, ウインドウのy軸の範囲を変えてみました(右上). 範囲を40%に狭め たので, 図形は縦に引き延ばされて, 円が楕円になりました. この場合にも, 文字は変わりません.

左下の例では, ウインドウの縦横比を元に戻して, UYMIN=-200, UYMAX=0y軸負方向に平行移動させました. その結果, 設定したビュー ポートをはみ出して図形を描いています.

最後に, 右下の例はウインドウのy軸を逆転させた場合です. UYMIN=0, UYMAX=-200 として, 左下の場合と逆にしました. この 時の三角形を見れば明らかなように, 図形は上下に折り返されています. ただ し, 文字列は正立のままで折り返されません.

下の2つの例のように, 設定したビューポートをはみ出して図形を描く場合, はみ出した部分を描かないようにすることも出来ます. SGLSET ルーチ ンを用いてクリッピングに関する内部変数 'LCLIP'.TRUE. に してやると, ビューポートをはみ出した部分はラインでも文字でも描かれませ ん. 8行めのコメント行をもとに戻せばクリッピングを行ないます.