画面上へ線の描画

SINE プログラムは,次のサブルーチン drawlines を呼び出します。このサブルーチンは,画面の外周に沿って矩形を描画し,画面を 4 分割する 3 つの水平線を描画します (SINE プログラムの出力図を参照)。

!	DRAWLINES:このサブルーチンは,矩形と線を描画します。
	SUBROUTINE drawlines( )
	  USE DFLIB
	  EXTERNAL		newx, newy
	  INTEGER(2)		status, newx, newy, maxx, maxy
	  TYPE (xycoord)	xy
	  COMMON		maxx, maxy
!	  矩形を描画します。
	  status = RECTANGLE( $GBORDER, INT2(0), INT2(0), maxx, maxy )
	  CALL SETVIEWORG( INT2(0), newy( INT2( 500 ) ), xy )
!	  これは,新しい X 軸の原点を 0,Y 軸の原点を 500 に設定します。
!	  線を描画します。
	  CALL MOVETO( INT2(0), INT2(0), xy )
	  status = LINETO( newx( INT2( 1000 )), INT2(0))
	  CALL SETLINESTYLE( INT2( #AA3C ))
	  CALL MOVETO( INT2(0), newy( INT2( -250 )), xy )
	  status = LINETO(newx( INT2( 1000 )),newy( INT2( -250 )))
	  CALL SETLINESTYLE( INT2( #8888 ))
	  CALL MOVETO(INT2(0), newy( INT2( 250 )), xy )
	  status = LINETO( newx( INT2( 1000 )),newy( INT2( 250 ) ) )
	END

RECTANGLE の第 1 引数は塗り潰しフラグで,$GBORDER または $GFILLINTERIOR です。4 つの線からなる矩形 (現在の線種の境界のみ) を描画したい場合は $GBORDER を,(現在の色と塗り潰しパターンで) 塗り潰された矩形を描画したい場合は $GFILLINTERIOR を選択します。色と塗り潰しパターンの選択については,「色の追加」と「形状の追加」で説明しています。

RECTANGLEの第 2 および第 3 引数は,矩形の左上隅の X および Y 座標です。第 4 および第 5 引数は,右下隅の座標です。2 つの隅の座標は (0,0) と (maxx, maxy) なので,RECTANGLE の呼び出しは画面全体を覆うことになります。

プログラムは SETVIEWORG を呼び出すことで,ビューポート原点の位置を変更しています。原点を 1000x1000 のビューポート中の (0,500) にリセットしているため,ビューポートは画面の左上の (0, -500) から画面の右下の (1000, 500) までの範囲となります。

	CALL SETVIEWORG( INT2(0), newy( INT2( 500 ) ), xy )

このように座標を変更することで,ビューポート座標はプログラマの望む任意の次元に変更することができます。ビューポートと SETVIEWORG ルーチンについては,「座標系について」でより詳しく説明しています。

SETLINESTYLE の呼び出しは,線種を実線からダッシュに変更しています。16 個のビットは,ルーチンに対して,どのようなパターンを使うかを指示しています。"1" は塗り潰されたピクセルを,"0" は空のピクセルを示します。したがって,1111 1111 1111 1111 は実線を表します。ダッシュは 1111 1111 0000 0000 (長いダッシュ) や 1111 0000 1111 0000 (短いダッシュ) として指定することができます。ここでは 0 と 1 の任意の組み合わせを選ぶことができます。入力としては任意の基底を使った任意の INTEGER(2) 値が使用できますが,2 進または 16 進の数値の方が,線種のパターンとして理解しやすいでしょう。

この例の 16 進数の #AA3C は,2 進数の 1010 1010 0011 1100 に相当します。10 進数の 43580 を指定しても同じ結果が得られます。

線を描画するときには,まず適切な線種を設定します。その後,線を開始したい場所に移動し,線が終了する点を渡して LINETO を呼び出します。drawlines サブルーチンは次のコードを使用します。

	CALL SETLINESTYLE(INT2( #AA3C ) )
	CALL MOVETO( INT2(0), newy( INT2( -250 ) ), xy )
	dummy = LINETO( newx( INT2( 1000 )), newy( INT2( -250 )))

MOVETO は画面上の点に仮想のピクセル・カーソルを置き (画面には何も表示されません),LINETO は線を描画します。プログラムは,SETVIEWORG を呼び出したときにビューポート原点を変更しており,Y 軸の初期範囲である 0 ~ 1000 は -500 ~ +500 という範囲に対応するようになっています。このため,LINETO の Y 座標の値として指定された負の値 -250 は,画面の上半分の中央に水平の線を描画し,Y 座標の値として指定された値 250 は,画面の下半分の中央に水平の線を描画します。