プログラム KIHONC で, いろいろな矢印や線分を描いてみましょう. U-座標系での矢印描画は, SGLAU ルーチンで行ないます. 引数は, (X1,Y1) が始点の座標, (X2,Y2) が終点の座標です. 線分の終点から 対称な2本の線分を付け加えて矢じり部分とします. 最初の例のように, デフォ ルトでは, 本体部分が長くなるのに比例して矢じり部分も大きくなります.
PROGRAM KIHONC
WRITE(*,*) ' WORKSTATION ID (I) ? ;'
CALL SGPWSN
READ (*,*) IWS
CALL SGOPN( IWS )
CALL SGFRM
CALL SGSWND( 0.0, 10.0, 0.0, 10.0 )
CALL SGSVPT( 0.0, 1.0, 0.0, 1.0 )
CALL SGSTRN( 1 )
CALL SGSTRF
*-- デフォルト ----
Y1 = 9.0
DO 10 I=1,8
X1 = I
X2 = X1 + 0.1*I
Y2 = Y1 + 0.1*I
CALL SGLAU( X1, Y1, X2, Y2 )
10 CONTINUE
*-- 線分のラインタイプ ----
Y1 = 8.0
Y2 = 8.6
DO 20 I=1,4
X1 = 2*I - 1
X2 = X1 + 0.6
CALL SGSLAT( I )
CALL SGLAU( X1, Y1, X2, Y2 )
20 CONTINUE
CALL SGSLAT( 1 )
*-- 線分のラインインデクス ----
Y1 = 7.0
Y2 = 7.6
DO 30 I=1,4
X1 = 2*I
X2 = X1 + 0.6
CALL SGSLAI( I )
CALL SGLAU( X1, Y1, X2, Y2 )
30 CONTINUE
CALL SGSLAI( 1 )
*-- 矢じり部分の長さ ----
CALL SGLSET( 'LPROP', .FALSE. )
CALL SGRSET( 'CONST', 0.03 )
Y1 = 6.0
DO 40 I=1,8
X1 = I
X2 = X1 + 0.1*I
Y2 = Y1 + 0.1*I
CALL SGLAU( X1, Y1, X2, Y2 )
40 CONTINUE
CALL SGLSET( 'LPROP', .TRUE. )
*-- 矢じり部分の角度 ----
Y1 = 5.0
Y2 = 5.6
DO 50 I=1,8
X1 = I
X2 = X1 + 0.6
CALL SGRSET( 'ANGLE', 10.0*I )
CALL SGLAU( X1, Y1, X2, Y2 )
50 CONTINUE
*-- 矢じり部分のぬりつぶし ----
CALL SGLSET( 'LSOFTF', .TRUE. )
CALL SGLSET( 'LATONE', .TRUE. )
CALL SGISET( 'IATONE', 655 )
Y1 = 4.0
Y2 = 4.6
DO 60 I=1,8
X1 = I
X2 = X1 + 0.6
CALL SGRSET( 'ANGLE', 10.*I )
CALL SGLAU( X1, Y1, X2, Y2 )
60 CONTINUE
*-- ラインサブプリミティブ ----
*-- デフォルト ----
CALL SGLNU( 0., 3., 10., 3. )
*-- 線分のラインインデクス ----
Y1 = 0.5
Y2 = 2.5
DO 70 I=1,4
X1 = 2*I - 1
X2 = X1 + 2.0
CALL SGSLNI( I )
CALL SGLNU( X1, Y1, X2, Y2 )
70 CONTINUE
CALL SGCLS
END
SGSLAT ルーチンでは矢印を描く線分のラインタイプを, SGSLAI
ルーチンではそのラインインデクスを設定できます(2番めと3番め). また,ア
ローサブプリミティブに関する内部変数を設定し直すことにより, 矢じり部分
の形状を変えることもできます. 4番めの例では, 内部変数 'LPROP' を
.FALSE. として矢じり部分の長さが一定値となるようにし, その長さを
内部変数 'CONST' で陽に与えました. さらに, 矢じり部分の線分と本
体部分の線分のなす角を変化させたり(5番め), 矢じり部分を定義する三角形
の領域を塗りつぶしたり(6番め)することにより, 多種多様な矢印が可能です.
最後に, U-座標系での線分描画は, SGLNU ルーチンで同様に行ないます. しかし, これはアローサブプリミティブの特殊な場合(矢じり部分がない場合) と考えられますので, 将来的には削除されるかも知れません.
|