4.2 もっとポリライン

U-座標系で折れ線を描くルーチンは SGPLU です. これを使ってポリラ インプリミティブをもっと深く探ってみましょう(KIHON9, KIHONA). 属性の1つがラインタイプですが, ユーザーの指定により, 多種多 様なラインタイプをつくることができます.

まず, KIHON9 のプログラムですが, 一番上にラインタイプが4の折れ線 (一点鎖線)を描いています. SGRSET ルーチンでポリラインプリミティ ブに関する実数型内部変数の 'BITLEN' を変更すると, パターンの1サ イクルの長さを変えることができます. この初期値はV-座標系の単位で0.003 ですが, 倍の0.006に設定し直したのが2本めの折れ線です. ビューポートのと り方次第で, パターンが間延びしたり, 逆にパターンが潰れて判別できなくなっ たりすることがありますが, そのようなときには 'BITLEN' を調節しま しょう.

SGPACK では, 実線, 破線, 点線, および一点鎖線以外のパターンのラインタ イプも指定できます. 実は, SGSPLT ルーチンの引数に5以上の整数を指 定すると, その2進表現のパターンを指定したものと見なされます. すなわち, 整数の下位16 bit のうち1の部分に線を描き, 0の部分は空白とするようなパ ターンを設定します. 自分の描きたいパターンに対応する整数を求めるには, MISC1 の BITLIB パッケージ中のBITPCI ルーチン(47行め)を使うと便 利です. '1111111100100100' のように文字型でビットパターンを与え ると, それに対応する整数値 ITYPE が返されて, そのラインタイプで 描いた二点鎖線が3本めです.

さらに複雑なパターンを指定したいときには, SGISET で内部変数 'NBITS'を変更することにより, パターンのビット長を32 bitまで長くするこ とができます. 4本めの折れ線はこれを32 bitにして, 3本めと同様に BITPCI ルーチンで新しいパターンを作っています.

      PROGRAM KIHON9

      PARAMETER( NMAX=40 )
      PARAMETER( PI=3.14159 )
      PARAMETER( XMIN=0., XMAX=4*PI, YMIN=-1., YMAX=1. )
      REAL X(0:NMAX), Y(0:NMAX)

      DT = XMAX/NMAX
      DO 10 N=0,NMAX
        X(N) = N*DT
        Y(N) = SIN(X(N))
   10 CONTINUE

      WRITE(*,*) ' WORKSTATION ID (I)  ? ;'
      CALL SGPWSN
      READ (*,*) IWS

      CALL SGOPN( IWS )
      CALL SGFRM

*--  ラインタイプ = 4 (デフォルト) ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.7,  0.9 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGSPLT( 4 )
      CALL SGPLU( NMAX+1, X, Y )

*--  ラインタイプ = 4 (BITLEN*2) ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.5,  0.7 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGRSET( 'BITLEN', 0.006 )
      CALL SGPLU( NMAX+1, X, Y )

      CALL SGRSET( 'BITLEN', 0.003 )

*--  ビットパターン ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.3,  0.5 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL BITPCI( '1111111100100100', ITYPE )
      CALL SGSPLT( ITYPE )
      CALL SGPLU( NMAX+1, X, Y )

*--  ビットパターン(倍長) ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.1,  0.3 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGISET( 'NBITS', 32 )
      CALL BITPCI( '10010010011111000111110001111100', ITYPE )
      CALL SGSPLT( ITYPE )
      CALL SGPLU( NMAX+1, X, Y )

      CALL SGCLS

      END

PROGRAM KIHON9

 

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

次のプログラム KIHONA は, ラベルつきの折れ線を描く例です.

SGLSET ルーチンで内部変数 'LCHAR'.TRUE. にすると, ポリラインプリミティブはラベルつき折れ線を描きます. ラベル付き折れ線と は, 描くべき線分のある長さを1サイクルとして, その一部分に空白域をとり, そこに指定した文字列を描くものです. 描く文字列は SGSPLC ルーチン で指定します. この例では, まず 'A' のラベルをつけて折れ線を描き ました.

次に, 42行めで SGNPLC ルーチンを呼ぶと, 設定されている文字列の最 後の文字の文字番号が1つ増えます. そこで, 2本め, 3本めの折れ線のラベル が 'B', 'C' と変わります. また, 文字列として 'K=1' と指定すると, まず 'K=1' というラベルを描き, 次の呼び出しでは 'K=2' というラベルを描きます(4本めと5本め). これらの折れ線では, SGSPLT ルーチンで線分のラインタイプも変えています.

ラベルの文字列の高さは, SGSPLS ルーチンで指定できます. 初期値は V-座標系の単位で0.02ですが, 6本めの例ではこれを0.01として小さめのラベ ルにしています. さらに, ラベル付折れ線に関するパラメータを陽に設定する と, さまざまな変形が可能です. 内部変数 'LROT'.TRUE. に して, 'IROT' で回転角を整数値で指定すると, 一定の回転角でラベル を付けます. これが .FALSE. の場合(初期値)には, 線分に沿ってラベ ルを描きます. また, ラベルの間隔は内部変数 'CWL' で, ラベルの書 き始めは内部変数 'FFCT' で, それぞれ調節できます.

      PROGRAM KIHONA

      PARAMETER( NMAX=40 )
      PARAMETER( PI=3.14159 )
      PARAMETER( XMIN=0., XMAX=4*PI, YMIN=-1., YMAX=1. )
      REAL X(0:NMAX), Y(0:NMAX)

      DT = XMAX/NMAX
      DO 10 N=0,NMAX
        X(N) = N*DT
        Y(N) = SIN(X(N))
   10 CONTINUE

      WRITE(*,*) ' WORKSTATION ID (I)  ? ;'
      CALL SGPWSN
      READ (*,*) IWS

      CALL SGOPN( IWS )
      CALL SGFRM

      CALL SGLSET( 'LCHAR', .TRUE. )

*-- ラベルつき折れ線 ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.9,  1.0 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGSPLC( 'A' )
      CALL SGSPLT( 1 )
      CALL SGPLU( NMAX+1, X, Y )

*-- 順序ラベル: A,B,C,... ----
      DO 20 I=1,2
        VYMIN = 0.9 - 0.1*I
        VYMAX = VYMIN + 0.1
        CALL SGSWND( XMIN, XMAX,  YMIN,  YMAX )
        CALL SGSVPT(   0.,   1., VYMIN, VYMAX )
        CALL SGSTRN( 1 )
        CALL SGSTRF

        CALL SGNPLC
        CALL SGPLU( NMAX+1, X, Y )
   20 CONTINUE

*-- 順序ラベル: K=1,K=2,... ----
      CALL SGSPLC( 'K=1' )

      DO 30 I=3,4
        VYMIN = 0.9 - 0.1*I
        VYMAX = VYMIN + 0.1
        CALL SGSWND( XMIN, XMAX,  YMIN,  YMAX )
        CALL SGSVPT(   0.,   1., VYMIN, VYMAX )
        CALL SGSTRN( 1 )
        CALL SGSTRF

        CALL SGSPLT( I-1 )
        CALL SGPLU( NMAX+1, X, Y )
        CALL SGNPLC
   30 CONTINUE

        CALL SGSPLT( 1 )

*--  ラベルの文字列の高さ ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.4,  0.5 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGSPLS( 0.01 )
      CALL SGSPLC( 'small' )
      CALL SGPLU( NMAX+1, X, Y )

      CALL SGSPLS( 0.02 )

*--  ラベルの角度 ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.3,  0.4 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGLSET( 'LROT', .TRUE. )
      CALL SGISET( 'IROT', 90 )
      CALL SGSPLC( 'ROT' )
      CALL SGPLU( NMAX+1, X, Y )

      CALL SGLSET( 'LROT', .FALSE. )

*--  ラベルの間隔 ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.2,  0.3 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGRSET( 'CWL', 5. )
      CALL SGSPLC( 'CWL' )
      CALL SGPLU( NMAX+1, X, Y )

      CALL SGRSET( 'CWL', 30. )

*--  ラベルの書き始め ----
      CALL SGSWND( XMIN, XMAX, YMIN, YMAX )
      CALL SGSVPT(   0.,   1.,  0.1,  0.2 )
      CALL SGSTRN( 1 )
      CALL SGSTRF

      CALL SGRSET( 'FFCT', 0.9 )
      CALL SGSPLC( 'FCT' )
      CALL SGPLU( NMAX+1, X, Y )

      CALL SGCLS

      END
PROGRAM KIHONA

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