デバイスとフレーム

図形を描くためには, まずディスプレイやプリンタなど デバイス の準備をする必要がある. その準備をする操作を「オープン」という. そして,最後に描画を終了する時の操作を「クローズ」という. すべての図形は,デバイスをオープンしてからクローズするまでの間に 描かれなければならない. 地球流体電脳ライブラリでは,一度に1つのデバイスをオープンすることがで きる. 同時に2つ以上のデバイスをオープンすることはできないが, オープン時にいくつかのデバイスの中の1つを選択できる.

デバイスに出力される図形が複数ページにわたることがあるが, 地球流体電脳ライブラリでは, ページという言葉の代わりにフレームという言葉を使う. これは, デバイスによってはページという概念のないもの (例えば,巻物のような長い紙に出力するようなデバイス)があったり, 後述のように物理的な1ページの中に複数のフレームを設定することもあるので, 物理的なページと区別するためである.

グラフィックを使うプログラムの形態は次のようになる.

       CALL SGOPN(1)      ! デバイス番号 1 の装置をオープン
       CALL SGFRM         ! フレームを用意
        ........
        ........          ! 1 ページめの描画プログラム
        ........
       CALL SGFRM         ! 改ページ
        ........
        ........          ! 2 ページめの描画プログラム
        ........
       CALL SGFRM
           .
           .
           .
           .
           .
           .
       CALL SGCLS         ! デバイスのクローズ

座標系と変換

本ライブラリで使用する座標系には 4 つのレベルがある. それぞれのレベルには上位レベルから順に U, V, R, W という記号が付けられ, 「U座標系」,「V座標系」,「R座標系」,「W座標系」と いうように呼ばれる(図 参照). この U, V, R, W という文字は,それぞれ次のような名前に由来するが, これらの名前が長いので, 以後は単に 「U座標系」などの用語を使うことにする (さらに UC などとも略記する).

                                                          
  U   ユーザ座標系     User coordinate                    
                                                          
  V   仮想直角座標系   Virtual rectangular coordinate     
                                                          
  R   正規直角座標系   normalized Rectangular             
                       coordinate                         
                                                          
  W   装置座標系       Workstation coordinate             
                                                          

レファレンスマニュアルの引数の説明でも, U座標系の座標値は (UX,UY) というように, 座標系を表す文字をつけて記述してある. (正規直角座標系を N 座標系でなく R 座標系と呼ぶのは, 実変数に関する FORTRAN の規則による.)

1mm

(120,60) (20, 4)(0,0)装置座標} (20, 16)(0,0)正規直角座標} (20, 28)(0,0)仮想直角座標} (20, 40)(0,0)ユーザー座標}

(50, 4)(0,0)WC (50, 14)(0,-1)8} (50, 16)(0,0)RC (50, 26)(0,-1)8} (50, 28)(0,0)VC (50, 32)(0,-1)2} (50, 34)(0,0)(TC) (50, 38)(0,-1)2} (50, 40)(0,0)UC (50, 50)(0,0)2次元座標}

(55, 28)(1,0)10}

(68, 26)(-2,-1)16} (70, 28)(0,0)VC3 (70, 38)(0,-1)8} (70, 40)(0,0)UC3 (70, 50)(0,0)3次元座標}

(95, 10)(0,0)ワークステーション変換} (95, 22)(0,0)透視変換} (95, 34)(0,0)正規化変換}

図1
座標系と変換関数の関係

最も上位の U座標系は普通のX-Y座標から地図投影座標まで多くの座標系を含む. その一つ下位のV座標系には2次元,3次元のそれぞれ1つずつの直角座標系が 定義されており, 多様なU系の座標はすべてこの2種類の座標系に変換される. この変換のことを「正規化変換」 と呼ぶ.

一方, 最も下位の座標系である W 座標系はデバイス固有の座標系で, デバイスによって異なる. これを統一するために,その一つ上位に R 座標系を定義して, すべてこの R 座標系を経由して W座標系に変換される. この変換を「ワークステーション変換」と呼ぶ. R座標系は2次元の直角座標系で, x軸,y軸 ともに定義域は[0,1] である.

これらの上位2つと下位2つの座標系を結ぶ V座標系から R 座標系への変換は 「透視変換」 と呼ばれる. 透視変換はその名の通り,透視図法すなわち遠近法による変換で, 基本的に3次元のV座標系から 2次元のR座標系への変換である. 2次元のV座標系は,一旦,3次元のV座標系に割り付けられてから透視変換 される. この時2次元のV座標系を割り付ける位置は, 3次元座標の x軸,y軸 または z軸に垂直な任意の平面にとることができる. これにより,2次元的に描いた1枚の図を斜めから眺めたような描写が可能にな る.

初期状態では,2次元V座標系からの透視変換は恒等変換となっているため, 2次元の座標系を普通に使う限り,透視変換を意識する必要はないが, あとで透視変換を使いたくなることも考えて, V座標系とR座標系は使い分けておいた方が良い. すなわち,座標軸などの「図に付随した情報」は, 透視図法で図とともに変換すべき情報なので V 座標系で描画し, SLPACK の描くページ数やパラメタの数値などのように「紙に付随した情報」 は R 座標系で描画すべきである.

なお,地図座標系の正規化変換は, 座標の「回転」と「投影」の2段階で行なわれ, その中間の座標 (U座標系を回転した座標)を T 座標 (Terrestrial coordinate) という. T 座標はx軸の定義域が[-180, 180], y軸の定義域が[-90, 90]の座標系で, この座標系から各地図投影の定義式に従って変換される. 任意の経線を中央経線としたり,横軸法や斜軸法の投影をするためには 投影の前に回転操作が必要となる.

T座標系は正規化変換の際の一時的な作業座標系であるので, これを意識しなければならないことは少いが, 地図座標のクリッピングだけは U座標系ではなくT座標系で行なわれるので, この座標系を意識する必要がある.

2次元正規化変換

座標系の種類

2次元のU座標系には次のような種類があり, ユーザーはその中から関数番号で指定する (略号,または名称から関数番号を返す関数も用意されている). 各座標系は,その種類によって正規化変換に必要なパラメータが異なる.

ユーザー定義座標系はユーザーが必要な変換関数を用意するものである. 詳しくは [here]節 (STPACK) を参照のこと.

地図投影法

地球流体電脳ライブラリでは地図投座標も普通のU座標系の 一つとして扱われる. 地図投影法には実にさまざまな種類があり, すべてを解説するためには1冊の本が必要であるが, ここでは地球流体電脳ライブラリを利用するために知っておくべき基本的事柄 を解説する. なお,地図学の詳しい解説は 野村 正七 著 「地図投影法」 などを参考にさ れたい(ただし,この本は絶版).

地図投影法は基本的に「球面を何らかの方法で2次元平面に投影する」方法で ある. 実際の地球は完全な球面ではなく回転楕円体に近いので, 厳密な地図投影を行なうためには回転楕円体の表面を平面に投影しなければ ならない. しかし,本ライブラリでは回転楕円体からの投影ではなく, 球面からの投影のみをサポートする. なお,投影された図形は投影法によっては3次元的な雰囲気を持つが, 地図投影座標はあくまでも2次元座標であることに注意されたい.

地図投影の多くの図法では幾何学的な方法で球面から平面に投影される. その際の平面の形状によって次のようにいくつかの図法に分類される.

                                                                       
  円筒図法   地球儀をこれに接する円筒の中に位置付け,                  
             何らかの方法で経緯線を円筒に投影して, 展開する図法.     
                                                                       
  円錐図法   地球儀をこれに接する直円錐の中に位置付け,                
             何らかの方法で経緯線を円錐に投影して, 展開する図法.     
                                                                       
  方位図法   地球儀上の一点でこれに接する平面を設定し,                
             何らかの方法で経緯線をこの平面に投影する図法.            
                                                                       
  便宜図法   上記以外の図法.                                          
                                                                       
これらの円筒や円錐の軸,または方位図法における接点からの垂線が 地球の自転軸と一致するものを正軸法, 直交するものを横軸法, 斜めに交わるものを斜軸法と呼ぶ. 一般に,円筒図法は全球の表示に向いており, 円錐図法は中緯度の表示に向いている.

地図投影では球面を平面に投影するため, どうしてもひずみが生じてしまう. そこで,多くの図法では 面積 または 角度 のどちらかが 保存されるように工夫されている. 原理的に,この二つを同時に保存するような投影は不可能である. この様な保存性に関する性質によって次のように分類される.

                                                                       
  正積図法   地図上のどこでも面積関係が正しく表現される図法.          
                                                                       
  正角図法   地図上のどこでも局所的な角度が正しく表現される図法.      
                                                                       
  正距図法   経線, 緯線または方位線上で,長さが正しく表現される        
             図法.                                                    
                                                                       

本ライブラリでは以下のような地図投影がサポートされる.

ハンメル図法は地図学上, ランベルト正積方位図法の変種として方位図法に分類されるが, その形状や用途はむしろ円筒図法に近いので, ここでは便宜的に円筒図法に分類する. これらの図法すべてについて,正軸法,横軸方, 斜軸法が可能である.

なお,普通の地図投影法には含まれないが, 正射図法の変形として人工衛星から眺めたような投影法 (Satellite View) もサポートされている. 普通の正射図法は地球儀を無限遠から眺めたような投影になっているが, これを有限の位置から眺めたような投影に変形したものである.

正規変換パラメタ

上記のU座標を2次元V座標に変換する 正規化変換に必要なパラメータには以下のものがある. これらはGRPH1の内部変数を管理するルーチン SGpGET/SGpSETにより 一つずつ設定/参照できるが, 同種のパラメータをまとめて設定するユーティリティーも用意されている.

ビューポート
( VXMIN, VXMAX, VYMIN, VYMAX )
ビューポートを指定するパラメタは,すべての変換に共通で必須である. ビューポートとは,通常座標軸が描かれる矩形の枠である. クリッピングをするように指定すると,この枠からはみ出した部分は 描画されない. ビューポートを指定するには,その左下と右上の角のVCにおける座標値 を指定する.

これらのパラメータは SGSVPT/SGQVPT によって 設定/参照できる.

ウインドウ
( UXMIN, UXMAX, UYMIN, UYMAX )
ウインドウは直角直線座標系を設定するのに必要なパラメタである. これは,ビューポートに対応する座標値を UC の値で指定する.

地図投影座標系の場合には, GRPH1 の範囲ではこの情報を必要としないが, GRPH2 のパッケージが「注目している緯度経度範囲」という意味で 参照する場合がある. この場合には,一般にビューポートとウインドウは一致しない.

これらのパラメータは SGSWND/SGQWND によって 設定/参照できる.

相似変換パラメタ
( SIMFAC, VXOFF, VYOFF )
直交曲線座標系および地図投影変換の場合の, 相似変換(拡大縮小と原点移動)のパラメタ. 直交曲線座標系の関数は MATH1/CTRLIB, 地図投影座標系の関数は MATH1/MAPLIB の関数によって 定義されている. GRPH1 では,これらの関数が返す値に,SIMFAC を掛けて VC の値に変換し, 原点をビューポートの中心から (VXOFF, VYOFF) 平行移動した位置に 設定する.

これらのパラメータは SGSSIM/SGQSIM によって 設定/参照できる.

地図座標回転パラメタ
( PLX, PLY, PLROT )
地図投影変換は常に経度範囲[-180° , 180° ] 緯度範囲[ -90° , 90 ° ] に対して行なわれるので, 任意の視点からの投影を行なうためには, 地図投影を行なう前に緯度経度座標を回転させておく必要がある. (PLX, PLY) は投影座標 (TC) の極をおく経度・緯度(UC)を 指定し,PLROT は投影座標の極の回りの回転角を指定する.

これらのパラメタと,一般に3次元の回転角を指定するのに使われる 「オイラーの角 (θ,φ,ψ)」 との関係は, θ = π/2 - PLY, φ = PLX, ψ=PLROT である. (オイラーの角の意味については,数学辞典などを参照のこと.)

これらのパラメータは SGSMPL/SGQMPL によって 設定/参照できる.

実際の操作としては, UC と TC(投影座標)が一致している状態を初期状態として,

  1. 北極を中心として TC を φ 回転させる.
    (経度 PLX の経線を中央経線とする)
  2. TC の北極を中央経線の方向に θ 回転させる.
    (経度・緯度 (PLX, PLY) の地点を,TC の北極とする)
  3. TC の北極の回りに, ψ 回転させる.
    (経度PLX の経線と,TC の中央経線のなす角を PLROT とする.)
となる.

TC から VC への変換は上記の相似変換パラメタによって 決められる. その際地図投影のタイプによって VC 原点に投影される TC の 値が異なる.

                                  
  図   法    原点に投影される     
             TC                   
                                  
  円筒図法   (0, 0)               
                                  
  方位図法   (90, 0)              
                                  
  円錐図法   円錐の頂点           
                                  

原点に投影されるこれら TC の値は,オイラーの角を (0, 0, 0) と したとき,すなわち (PLX,PLY,PLROT) = (0, 90, 0) と した場合に対応する.

通常の円筒図法や円錐図法(正軸法)で, 経度λの経線を中央経線とするには, (PLX, PLY, PLROT) =(λ,90., 0) とする.

方位図法において,経度・緯度 (λ,φ) を中心とした 地図を描くには, (PLX, PLY) =(λ,φ) とし, 必要に応じて PLROT を指定する PLROT = 0 の時, 必ずUCの南極が原点の下になる.

横軸法の円筒図法などでは,(PLX,PLY)として赤道上の点を 指定する. PLROT = 0 の時, UCの南極が中央経線上に投影される. 例えば,北極海,大西洋,南極環海を一つながりの海として 横軸法で表すには,(PLX, PLY, PLROT) = (60., 0., -90.) とする.

標準緯度
( STLAT1, STLAT2 )
円錐図法の投影では上記のパラメタ以外に, 標準緯度が必要である. ランベルト正角円錐図法は標準緯線が二つあるので, STLAT2 も指定しなければならないが, その他の円錐図法は STLAT1 の値のみを使う.

これらのパラメータは SGRGET/SGRSET によって 設定/参照できる.

衛星軌道半径
( RSAT )
正射図法は本来,無限遠から地球を眺めたような投影法であるが, オプションとして有限の位置にいる衛星から眺めたような投影 (Satellite View) が可能である. 正射図法でこのオプションを選択するには, RSAT を 1 以上の値に設定する. RSAT は,地球半径を 1 とした時の「衛星の軌道半径」である.

これらのパラメータは SGRGET/SGRSET によって 設定/参照できる.

U座標系の設定

U座標系で描画するためには, SGFRM を呼んだ後でかつ描画をはじめる前に 変換関数を決めるパラメータを指定しておかなければならない. 指定すべきパラメータは座標系によって異なるが, 主要なパラメタはすべて SGpGET/SGpSETによって管理されている. ただし,SGpGET/SGpSETは単に掲示版の役目をしているだけなので, 設定したパラメタの値は,変換関数を確定するルーチン SGSTRF を呼ぶことで有効になる. 変換関数のパラメタを1つ1つ設定するのは面倒なので, まとめてパラメタを設定するルーチンが用意されており, 普通はそちらを使ってパラメタの設定を行なう.

具体的に変換パラメタを設定するにはSGFRM のあとで次のように コーディングする.

直角座標系

       CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
       CALL SGSWND(UXMIN, UXMAX, UYMIN, UYMAX)
       CALL SGSTRN(ITR)
       CALL SGSTRF

直交座標系

       CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
       CALL SGSSIM(SIMFAC, XOFF, YOFF)
       CALL SGSTRN(ITR)
       CALL SGSTRF

地図座標系

       CALL SGSVPT(VXMIN, VXMAX, VYMIN, VYMAX)
       CALL SGSSIM(SIMFAC, XOFF, YOFF)
       CALL SGSMPL(PLX, PLY, PLROT)
       CALL SGSTRN(ITR)
       CALL SGSTRF
円錐投影の場合は,これ以外に SGRSET によって標準緯線の緯度 (STLAT1, STLAT2) を与えておく必要がある.

これらのパラメタは 変換関数を確定するルーチン SGSTRF が 呼ばれる前であれば,どのような順番で指定しても構わない. 変換関数名または略号を指定して,変換関数番号を返す関数も用意されている.

3次元正規化変換

座標系の種類

3次元のユーザー座標系 (UC) は次のような種類があり, ユーザーはその中から関数番号によって 1 つを選択する.

                   
  番号             
                   
  1      直角座標  
                   
  2      円筒座標  
                   
  3      球座標    
                   

3 次元座標系は2 次元座標系と異なり対数軸のしていは関数番号ではなく, 対数スイッチ(後述)によって指定する.

3次元正規変換パラメタ

上記の3次元U座標を3次元V座標に変換する 正規化変換に必要なパラメータには以下のものがある. これらはGRPH1の内部変数を管理するルーチンSGpGET/SGpSETにより 一つずつ設定/参照できるが, 同種のパラメータをまとめて設定するユーティリティーが SCPACK の中に用意されている.

ビューポート
( VXMIN3, VXMAX3, VYMIN3, VYMAX3, VZMIN3, VZMAX3 )
直角直線座標 (ITR=1) の変換に必要なパラメタで, ウィンドのパラメタと共に指定する. 2次元のビューポートと異なり クリッピングの範囲とは関係がない.

これらのパラメータは SCSVPT/SCQVPT によって 設定/参照できる.

ウインドウ
( UXMIN3, UXMAX3, UYMIN3, UYMAX3, UZMIN3, UZMAX3 )
ITR=1 の時, ビューポートに対応する座標値を UC の値で指定する.

これらのパラメータは SCSWND/SCQWND によって 設定/参照できる.

対数スイッチ
( LXLOG3, LYLOG3, LZLOG3 )
ITR=1 の時, それぞれの軸を対数にしたいときに,.TRUE. にする.

これらのパラメータは SCSLOG/SCQLOG によって 設定/参照できる.

相似変換パラメタ
( SIMFAC3, VXORG3, VYORG3, VZORG3)
円筒座標と球座標の時に指定する 相似変換(拡大縮小と原点移動)のパラメタ. 座標原点を(VXORG3, VYORG3, VZORG3) に設定する.

これらのパラメータは SCSORG/SCQORG によって 設定/参照できる.

座標系の設定

3次元のU座標系で描画するためには,2次元座標系と同様 SGFRM を呼んだ後でかつ描画をはじめる前に 変換関数を決めるパラメータを指定しておかなければならない. これらのパラメタの値は,変換関数を確定するルーチン SCSTRF を呼ぶことで有効になる. 3次元のパラメタは2次元のパラメタとは独立である.

主要なパラメタはすべて SGpGET/SGpSETによって管理されているが, 変換関数のパラメタを1つ1つ設定するのは面倒なので, まとめてパラメタを設定するルーチンが用意されており, 普通はそちらを使ってパラメタの設定を行なう.

具体的に変換パラメタを設定するにはSGFRM のあとで次のように コーディングする.

直角座標系

       CALL SCSVPT(VXMIN3, VXMAX3, VYMIN3, VYMAX3, VZMIN3, VZMAX3)
       CALL SCSWND(UXMIN3, UXMAX3, UYMIN3, UYMAX3, UZMIN3, UZMAX3)
       CALL SCSTRN(ITR3)
       CALL SCSTRF

円筒座標,球座標

       CALL SCSORG(SFAC3, VXORG3, VYORG3, VZORG3)
       CALL SCSTRN(ITR3)
       CALL SCSTRF

透視変換

透視変換とは,任意の視点から3次元空間を眺めて遠近感を出す変換である. 電能ライブラリにおいては,3次元V座標系から2次元R座標系への変換を指す.

一般に,この変換では3次元空間上の平行線は投影された2次元平面上では 平行にならない. 視点を無限遠に持っていけば,平行線は平行線に投影されるが, そのように投影された図形はかえって不自然に感じられる.

透視変換を行なうには,「視点」「焦点中心」を設定 しなければならない. 視点とは読んで字の通り3次元空間を眺める位置であり, カメラのレンズの位置であると思えば良い. これに対して,焦点中心はカメラのフィルム上の焦点ではなく, 注目している点,すなわち視点から「見つめる点」である. この視点と焦点中心を結ぶ線が「視線」 である.

透視変換によって 3次元図形の各点は, その点と視点を結ぶ線が 「投影面」と交わる点に投影される. 地球流体電脳ライブラリでは, 投影面は焦点中心を通り,視線に垂直な面である.

2次元座標系の場合,2次元のV座標系を3次元のV座標系の1平面に割り付ける ことで,透視変換が可能になる. この際に割り付けることができる平面は,3次元 X, Y, Z 座標軸のいずれかに 垂直な平面であり,斜めの面に割り付けることはできない. (斜めに見るには視点を動かせば良い)

変換パラメタ

視点
( XEYE3, YEYE3, ZEYE3 )
3次元空間上での視点. この位置にカメラを構えていると思えば良い.
焦点中心
( XOBJ3, YOBJ3, ZOBJ3 )
3次元空間内で視線を向ける目標点. カメラを向ける被写体の位置と思えば良い. なお,焦点中心を通り,視線(視点と焦点中心を結ぶ線)に垂直な面が 投影面となる. すなわち,3次元空間上の点(X,Y,Z) は,その点と視点を通る線が 投影面と交わる点に投影される.
画角
( ANGLE3 )
視点からこの角度で見える投影面上の長さが, 正規直角座標系の単位長さとなる.
傾き
( TILT3 )
Z 軸の傾き.カメラの光軸回りの傾きに相当する. この角度が0 の時, 3次元空間のZ軸は正規直角座標のY軸に並行にな る. 視線がZ 軸と平行な場合には,Y 軸が基準になる.
オフセット
( XOFF3, YOFF3 )
正規直角座標系に投影された焦点中心の位置を, 中心からの位置で指定する. 通常この値は (0,0) で良い.
2次元平面位置
( IXC3, IYC3, SEC3 )
2次元平面を3次元空間のどこに位置付けるか指定する. IXC3, IYC3 はそれぞれ2次元平面のX座標,Y座標に対応する 3次元座標を (1,2,3) の数字で指定するもので, 数字はそれぞれ X座標,Y座標,Z座標に対応する. これらの数値に負の値を指定すると,正負を逆に割り当てる. SEC3 は残りの座標の座標値である.

透視変換の設定

透視変換のパラメタも SGFRM を呼んだ後でかつ描画をはじめる前に 変換関数を決めるパラメータを指定しておく. これらのパラメタの値は,変換関数を確定するルーチン SCSPRJ を呼ぶことで有効になる. 透視変換のパラメタは,2次元およおよび3次元正規化変換と独立である.

主要なパラメタはすべて SGpGET/SGpSETによって管理されているが, まとめてパラメタを設定するルーチンがSCPACK に用意されており, 普通はそちらを使ってパラメタの設定を行なう.

具体的に変換パラメタを設定するにはSGFRM のあとで次のように コーディングする.

       CALL SCSEYE(XEYE3, YEYE3, ZEYE3)
       CALL SCSOBJ(XOBJ3, YOBJ3, ZOBJ3)
       CALL SCSPRJ

そのほかのパラメタは必要に応じて SGpSETで指定する.

なお,2次元平面を3次元平面に割り付けるには, SCSPRJ の前に,

       CALL SCSPLN( IXC3, IYC3, SEC3)
を呼ぶ. これにより,2次元平面上の描画ルーチンを 3次元空間内の平面上で使うことができるようになる.

出力プリミティブ

図形を構成する基本要素を出力プリミティブという. GRPH1 の出力プリミティブには次のものがある.

このほか,補助的に次のプリミティブがある.

これら6つのプリミティブのうち,トーンプリミティブ以外の5つは すべて線分で構成される. 線分にはラインインデクスとラインタイプ呼ばれる属性がある. また,トーンには,トーンパターン番号という属性がある. これらの属性は,以下のように定義されている.

GRPH1 で扱う座標系には曲線座標系も含まれるので, 線分やトーンの境界を指定する座標点の間を直線で つなぐと不都合が起こる場合がある. そこで,座標点の間をいくつかに分割して,補間する機能がある. さらに, すべてのプリミティブはある境界でのクリッピングの対象となる.

ラインインデクス

GRPH1 で描かれる線分の太さと色はラインインデクスと呼ばれる 3桁の整数(nnm)で指定される. 線の太さと色のうちどちらか一方しか変えられないような デバイスに出力する場合でも, ラインインデクスの異なる2本の線が識別できるようにするため, ラインインデクスは次のような規則にしたがって太さと色に対応づけられる.

線の太さと色が両方変えられるようなシステムでは, 上位2桁(nn=0- 99)が色番号,下位1桁(m=0- 9)が線の太さを表す. 色番号は,1から5 までは標準的に

                                       
  1:   白または黒(フォアグラウンド)  
                                       
  2:   赤                              
                                       
  3:   緑                              
                                       
  4:   青                              
                                       
  5:   黄                              
                                       

と決められているが, それより大きな番号に関しては colormap ファイルの定義による. またm: 1(細)→ 9(太)となっている. 線の太さだけが変えられるような出力装置では, m=0のときに限ってnnをmとして読みかえる. また,線の色だけがかえられるような出力装置では, nn=0のときに限ってmをnnとして読みかえる. したがって線の太さと色を明示したいとき以外は, 1桁のラインインデクスを指定しておけば, とりあえず装置に固有な方法によって線分は識別可能となる.

ラインタイプ

ラインタイプとは,実線, 破線などの線種である. 1から4までの番号にはあらかじめ以下のタイプが決められている.

                
  1:   実線     
                
  2:   破線     
                
  3:   点線     
                
  4:   1点鎖線  
                

その他の0以外の整数は下位Nビット (Nは内部変数'NBITS'で決まる値. 初期値は16; [here]節参照) のビットパターンを用いて線種が設定される. たとえばN=16でITYPE = Z'0000F0F0' (16進定数)のとき, '4bits ON 4bits OFF 4bits ON 4bits OFF' のような破線が設定される. 1ビット当たりの長さは内部変数'BITLEN'が決める. ラインタイプの作画例は[here]節参照.

トーン番号

トーンパターン番号には色の情報と, パターンの情報が両方含まれており, 下位3桁がパターン番号,それより上位の桁は色を指定する. 色を指定しない (3桁の番号だけ指定)場合は, フォアグラウンド(色番号1) と解釈される.

パターン番号の最上位桁は,パターンの種類をあらわす.

                         
  0:   ドット            
                         
  1:   横線              
                         
  2:   斜線(右上がり)  
                         
  3:   縦線              
                         
  4:   斜線(左上がり)  
                         
  5:   格子(縦横)      
                         
  6:   格子(斜め)      
                         

2桁めは,ドットの大きさや斜線の太さを0から5の間で指定する. 値が大きくなるにつれてドットは大きくなり斜線は太くなる. 最下位桁はドットや斜線の密度を0から5の間で指定する. 値が大きくなるにつれてドットや斜線の密度があがる. ただし0のときは何も描かれない.

パターン番号として999を指定するとべたぬりとなる.

カラーの端末やカラーのプリンターでは,色を指定したべた塗りによる塗りわ けがしばしばおこなわれる.このプログラムをカラーがサポートされない環境 で実行しても,それなりな見わけがつくようにドットによる塗りわけとして表 現するようなオプションも用意されている.

これらの組合せ以外の整数値はパターンが定義されていない. トーンパターンテーブルについては [here]- [here]節を参照のこと.

補間とクリッピング

補間機能には次の2つがある.

線形補間:
ユーザ座標系で線形的に補間する. すべての座標系で指定可能であるが, 通常の直角一様座標 (ITR=1) で指定しても意味はない. 曲線座標系の座標軸や,地図座標の緯度線を描く時などに使われる.
大円補間:
地図投影座標(TC)で,始点と終点を通る大円上で補間す る.これは地図投影関数のみ有効.
地図投影関数の場合には,TC において特異点は必ず極になっているので, 大円補間を指定することにより,特異点付近での線分がより適切に描けるよう になる.

この機能に関するSGpGET/SGpSETのパラメタは以下の通り.

                                                                        
  LLNINT     (L)   線形補間を行なうかどうか指定するフラグ               
                   (省略値.FALSE.).                                    
                                                                        
  LGCINT     (L)   大円補間を行なうかどうか指定するフラグ               
                   (省略値.TRUE.).                                     
                                                                        
  RDX,       (R)   補間間隔.                                           
  RDY              1セグメントの長さがこれらの値を越えないように        
                   補間される(省略値 (5., 5.)).                        
                                                                        

クリッピングは次の場所で行なわれる.

それぞれのクリッピングは,その座標系の座標軸に平行な線で囲まれる矩形領 域に対して行なわれる. したがって,地図投影の際に極を移動する回転を行なうと, TC におけるクリッピング境界はは経緯線に一致しなくなる.

この機能に関するSGpGET/SGpSETのパラメタは以下の通り.

                                                                        
  LCLIP                        (L)   ビューポートでのクリッピングを     
                                     行なうかどうか指定するフラグ       
                                     (省略値.FALSE.).                  
                                                                        
  VXMIN, VXMAX, VYMIN,         (R)   ビューポート. 通常 SGSVPT         
  VYMAX                              により設定される.                 
                                                                        
  TXMIN, TXMAX, TYMIN,         (R)   TC におけるクリッピング境界        
  TYMAX                              (省略値は -180.0, +180.0,         
                                     -90.0, +90.0).                     
                                                                        
  IRMOD                        (I)   トーンの境界線をクリッピングした   
                                     時に,                             
                                     右回りに接続するか,左回りに接続   
                                     するか 指定するパラメタ. (        
                                     [here] 参照) (省略値0).          
                                                                        

ビューポートにおけるクリッピングは 'LCLIP' によって ON/OFF できるが,他のクリッピングは常におこなうようになっている. 正射図法で TC におけるクリッピング境界を省略値のまま使うと, 裏側の線分なども描くことになる. 表側だけを描くためには'TYMIN' を 0 にする.

トーンのクリッピングに関する注意

地球流体電脳ライブラリのトーンは通常(クリッピングされなければ) 指定された境界線が交わっていても,その図形の内側が塗りつぶされる. 正確には,ソフトフィルは Even Odd Rule にしたがって塗りつぶしが行われ, ハードフィルは機種依存であるが,できるだけソフトフィルに近い規則で 塗りつぶされる様になっている.

旧バージョンではハードフィルはクリッピングの対象になっていなかったが, DCL ver.5 からハードフィルもソフト的にクリッピング できるようになった. すなわち,トーンのクリッピングはハードウェアが行うのではなく, 指定された領域とクリッピング範囲が重なる部分を指定する境界点を生成して, そのデータをトーンルーチンに渡すようになっている. このクリップされた境界線を求めるアルゴリズムは, 境界線の向きが決まっていることを前提としている. ここで,境界線の向きとは境界線を指定する点列を, 時計回りに指定するか,反時計回りに指定するかということを言う. このアルゴリズムは旧来のトーンの塗りつぶし規則と整合性が悪いが, 地図上 (T 座標系)では境界線の向きがわからないと内側と外側を 判断することができない.

具体的にはトーンをクリッピングする手順は次のようになる.

  1. 境界線をクリップして,いくつかの線分に分割する.
  2. 切断された線分を接続しなおし,閉じた境界を生成する. IRMODE=0 の時, 反時計回り; IRMODE=1 の時, 時計回り に接続する.
  3. 生成された境界線に対して旧来の規則にしたがって塗りつぶしを行う.
クリッピングされない領域に関しては,旧来の規則がそのまま適用され, IRMODE は何の意味ももたない. つまり,IRMODE を適当に指定することで, 境界線の外側を塗りつぶすことができるわけではない.

したがって, 境界線が交わるような図形を塗りつぶす時に, クリッピングを行うのは危険である. クリッピングを行う時は,安全のために

境界線の向きを決めて,小さな単純な図形にする
様にしていただきたい.

なお,図形の外側を塗りつぶしたい時には, その図形が確実にクリッピングされるように領域を2分割し, クリッピング領域(ビューポート)を設定しなおして, 2度トーンルーチンを呼ぶ.

レイアウト

R座標系はx軸,y軸ともに0 から 1の値をとり, 描画範囲は 1:1 の縦横比を持つ. これに対して,実際のデバイスの縦横比はいろいろである. 描画範囲とデバイスの縦横比が一致しない時には, 通常 SGFRM が呼ばれた段階で, デバイスの中央に描画範囲が最大内接するように ワークステーション変換が設定される.

しかし,デバイスの描画領域をいっぱいに使いたかったり, 逆に,図の回りに適当なマージンをとりたい場合もある. そのような時には,GRPH1/SLPACK を使う. SLPACK は基本的にワークステーション変換を設定するもので, 描画範囲の縦横比を変える以外に, マージンにタイトルなどの文字列を書いたり 1枚の紙に複数のフレームを並べたりする機能がある. この様な機能をレイアウト機能と呼ぶ.

このレイアウト機能を使うには,デバイスをオープンした後で SGFRM を呼ぶ前に,適切な設定を行なう. 例えば,

       CALL SGOPN(IWS)
       CALL SGDIV('S', 4, 3)  ! 1ページを 4x3 に分割する.
       CALL SGFRM
       ..........

CALL SGFRM ..........

CALL SGCLS

とすることで,1ページに12枚のフレームを設定することができる.


Back to Main


Latex Source


地球流体電脳倶楽部 : 95/6/9 (Version 5.0)

NUMAGUTI Atusi <a1n@gfdl.gov>
Last Modified: Thu Aug 31 13:04:50 EDT 1995