線分をひく

描画準備と終了:

最初のDclOpenGraphicsと最後のDclCloseGraphicsは, それぞれ初期化および終了処理をおこなうルーチンで, この2つの間でグラフィックの各ルーチンを呼ぶことができる. DclOpenGraphicsを実行した後, 実際の描画をはじめる前に, もう一つのルーチンDclNewFrameを実行しなければならない. これは作画領域を設定するもので, 1枚の白紙を用意すると考えていただければよい. 改ページをし,新たな作画領域を設定するときにもこのルーチンを使う.

なお, DclOpenGraphicsの引数には出力デバイス番号を指定する. 引数を省略すれば使用可能なデバイス名を標準出力に書き出すようになっている. このプログラム例のように書いておくと, 普段使い慣れていないシステムでコンパイル・実行するときにも, デバイス名のリストが出力されるので便利である.

線分描画(正規座標系):

まず, 描画可能な範囲がどのように設定されているかについて簡単に述べておく. 作画例のコーナーマークで示される長方形領域は, ふつう出力画面あるいは出力用紙の四隅に描かれ, その出力装置の最大作画領域を示す. しかし, 一般にこの長方形領域の縦・横比は1でないことが多いので, 標準的なオプション設定のもとでは, コーナーマークで示される長方形 領域に最大内接するような正方形領域を [ 0, 1 ] x [ 0, 1 ] とするように 描画範囲が設定される (ここで単位は透視座標系であるが, 透視変換を用いていなければ正規座標系と 等しい). 最大作画領域をいっぱいに使うことも可能で, そのような例についてはレイアウトの解説を参照されたい.

さて, 実際の線分を描画するのがDclDrawLineNormalizedである. 線分の色と太さを指定するラインインデクスを指定できる. ラインインデクスは3桁の整数(nnm)で, 上位2桁(nn)が色番号, 下位1桁(m)が線の太さである. ただし, どんなディバイスでも色と太さの両方が変えられるとは 限らないので, 色または太さしか変えられないようなディバイスでは 色と太さのインデクスを読みかえる. たとえば,太さの変えられないようなディバイスで1桁の数字(太さ)を 指定していも, それは色のインデクスとして読みかえられ線分の色が変わる. 詳しくはラインインデクスの解説を参照されたい.

線分属性としてラインインデクスの他に, 実線, 点線等といったラインタイプが指定できる. 点線や破線のパターンの1サイクルの長さは 正規座標系で指定されている. したがって, 小さな図を描画すると図の 大きさに比べてパターンが長すぎるため, 線分部分と空白部分の バランスが悪くなることがある. それとは逆に, ディスプレイ等に点線や破線を表示した場合, ディスプレイの分解能が悪いと, パターンが潰れて判別できなくなることもある. そのようなときにはDclSetParmで内部変数LINE_BIT_LENGTH を変更すると, パターンのサイクル長を変えることができる.

ユーザー座標系で線分を描く:

ユーザー座標系で線分を描くには, DclNewFrameを実行したあとで 変換関数を定義する以下の4つのルーチンを呼ぶ: DclSetWindow, DclSetViewPort, DclSetTransNumber, DclSetTransFunction. このうち最初の3つを呼ぶ順番は任意であるが, DclSetTransFunctionは 必ず最後に呼ばなければならない. ここではユーザー座標系の [ 0, 360 ] x [ -90, 90 ] の空間(ウインドウ)を 正規座標系の [ 0, 1 ] x [ 0, 1 ] の空間(ビューポート)に投影するように 変換関数を定義している. ここで, ウインドウとはユーザー座標系上に描く図形のうち我々が実際に見たい領域であり, ビューポートはその見たい領域を投影する正規座標系上の領域である. このウインドウとビューポートという言葉はよくでてくるのでよく覚えておいてほしい. また, DclSetTransNumberの引数は変換関数番号で, 1ならば線形座標, 4ならば両対数座標というように座標系のタイプを指定する. 省略時には1になる. 変換関数に関する以上の情報はDclSetTransFunctionを呼んではじめて有効になる.

クリッピング:

ウインドウとはユーザー座標系上の我々が見たい部分であると書いたが, DclSetWindowで小さなウインドウを指定して図形の一部だけ表示させようとしても, これだけでは作画しようとする図形がビューポートをはみ出してしまう. ビューポートをはみ出す部分を描かないようにするためには DclSetParmによって, クリッピングを制御する内部変数 ENABLE_CLIPPING.TRUE.にしてやればよい.

line.f90
program line

  use dcl

    call DclOpenGraphics
    call DclNewFrame

! 正規座標系で線分を描く
    call DclDrawLineNormalized( (/0.1,0.9/),(/0.9,0.9/) )
    call DclDrawLineNormalized( (/0.1,0.5,0.9/),(/0.8,0.75,0.8/),index=3 )

! ユーザー座標系で線分を描く
!                       xmin, xmax, ymin, ymax
    call DclSetWindow  (  0., 360., -90.,  90. )
    call DclSetViewPort( 0.1,  0.9,  0.2,  0.7 )
    call DclSetTransFunction

    call DclDrawViewPortFrame(1) ! ビューポートの枠を描く

    call DclDrawLine( (/-40.,160./), (/45.,-45./), type=2 )
    call DclDrawLine( (/-40.,160./), (/-45.,45./), type=2 )

    call DclSetParm('ENABLE_CLIPPING',.true.) ! クリッピング制御する
    call DclDrawLine( (/200.,400./), (/45.,-45./), index=21 )
    call DclDrawLine( (/200.,400./), (/-45.,45./), index=21 )

    call DclCloseGraphics

end program



関連リンク

DclDrawLine
(SGPLU,SGPLZU)
ユーザー座標系で折れ線を描く.
DclDrawLineNormalized
(SGPLV,SGPLZV)
正規座標系で折れ線を描く.
DclDrawLineProjected
(SGPLR,SGPLZR)
透視座標系で折れ線を描く.
DclSetLineType
(SGSPLT)
折れ線のラインタイプを設定する.
DclSetLineIndex
(SGSPLI)
折れ線のラインインデクスの設定する.

* 括弧の中は、対応するf77インターフェイス名.