Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2000年05月07日] [更新 2001年07月22日] PC-9801 目次
   
PC-9801
プロッタ制御ライブラリ Ver.4.0
動作確認等 掲載の図は,PC-9821 Np + MSDOS 6.2 での実行結果
Plcont.zip [970 KB] (Ver. 4.0 - ライブラリ説明書同梱)







概要


このライブラリは MS FORTRAN 用として,主に科学技術計算の結果のグラフを作成するために開発したもので,画面の出力とプロッタへの出力のプログラムを同じコードで済むようにしてあります.出力先は番号で指定します.プロッタ制御コマンドは HP-GL を使用しています.
また,実験曲線を作成しやすい様に,ペンの制御の他,等方目盛や対数目盛のスケーリング,座標軸の作成などもサポートしています.各々のサブルーチンに対してテストプログラム (ソースリストのみ) を用意してあります. ライブラリの開発には,
  • Microsoft (R) FORTRAN Optimizing Compiler Version 5.10
  • Micorsoft (R) Macro Assembler Version 6.00AD
を用いました.このライブラリを利用するには,CRT 画面制御ライブラリも必要です.なお, ライブラリの説明文書は,今回 PDF 文書にしました.別途ダウンロードして下さい.
ライブラリでは,画面をいくつかの領域に分けて使用します.下図の右側がメニュー等を表示する領域,中央の白い部分(背景は黒にもできます)がプロット面で,ここを用紙に見立ててグラフを作成します.最下行には,いろいろなコメント等を表示します.


プロッタ制御ライブラリで使用する画面




座標軸の作成例


座標軸の作成の例を下図に示します.ここでは,座標軸の両端の値をメニュー形式で設定しています.プロッタ制御ライブラリではこの他にも,X, Y 軸単独に座標軸を作成したり,逆向きの座標軸や目盛数値を軸の上下左右に付けることも出来ます.もちろん,目盛数字の大きさも任意に設定できますし,目盛線と目盛数値を付ける位置も比較的自由にできます.


図2 座標軸の作成例 テストプログラム PTEST030 の実行画面


下のリストは,上の図を描画したプログラムのコードです.ここで使用している一部の変数とサブルーチンは次の様な役割をしています.つまり,実際には 
  • VIEWPORT と NLAXES
を使用するだけで座標軸が出来てしまうわけです.

CSIZE 文字のサイズ.プロット面
(最初の画像の白い領域の縦の長さ) のパーセント値で指定する
SETAXES 上の図の右下の様な,作成する座標軸の上限と下限の座標値を入力するためのメニューを表示する
VIEWPORT プロット面 (最初の画像の白い領域) のどの位置に座標軸を描画するかを,縦の長さが 100 の暫定スケール値で指定する
NLAXES VIEWPORT で指定した領域に座標値を設定し,座標軸を描画する.上の図の場合は,横軸(X軸)が等分目盛で,縦軸 (Y 軸) が対数軸となっている
このサブルーチン実行後,ペンの移動はこの座標値で指定する.ただし,対数軸の場合はその対数値を用いる


上の画面を実行したプログラムのリスト
       PROGRAM PTEST030

       CSIZE=2.2
       XMIN=0.0
       XMAX=100.0
       YMIN=1.0
       YMAX=1000.0

       ICONT=0
   100 CALL SETAXES(XMIN,XMAX,YMIN,YMAX,ICONT)
       IF (ICONT.EQ.16#1B00) GOTO 999
       IF (ICONT.EQ.16#004E) GOTO 999
       IF ((YMIN.LE.0.0).OR.(YMAX.LE.0.0)) THEN
         CALL TDISPM(20,62,'不適当な座標設定値',2,0)
         CALL TBEEP(1500)
         CALL TDISPM(20,62,' ',7,0)
         GOTO 100
       END IF

       XI=ABS(XMAX-XMIN)/10.0
       CALL GCLEAR
       CALL VIEWPORT(30.0,120.0,15.0,95.0)
       CALL NLAXES(XMIN,XMAX,XI,2,YMIN,YMAX,10,CSIZE,2)
       GOTO 100

   999 CALL TESTEND(IRET)
       IF (IRET.EQ.1) GOTO 100
       END