GKSによる2次元グラフィックス

GKSについて

次の形で発表した文章をもとに書き直したものです。

=== GKSとは ===

GKSはGraphical Kernel Systemの略で、ISO(国際標準化機構)で1985年に制定 された、2次元グラフィックスの操作の標準(ISO, 1985)である。Fortranから使う 場合はサブルーチン群の形となり、そのサブルーチンの名前や引き数についても 規定されている(ISO, 1988)。

グラフィックスのプログラムライブラリは、長い間、それぞれの装置を操作しや すいように、装置や計算機の機種に依存した形で発展してきた。その主要なもの のひとつに、Calcomp社のプロッタルーチンがある。これは、XYプロッタのペンを 移動して線を引く、という発想に立っており、PLOTという単純なサブルーチンの上 にほとんどの操作が成り立っている。現実の図形出力装置として、ディスプレイ 装置や、レーザビームプリンタをはじめとするドットプリンタ類がXYプロッタより もよく使われるようになっても、プロッタルーチンは多少拡張されながら使い続け られてきた。しかし、不満も生じてきた。一つは、長さの単位が紙の上のcm単位 (あるいはインチ単位)を基本としており、拡大・縮小したり、画面の一部にはめ こんだりする方法がしっかり規定されていないことである。もう一つは、プロッタ ルーチンは図形を線で構成するために、ドットパタンの模様による多角形領域の 塗りつぶしなどは表現できないことである。

プロッタルーチンのほか、各種のグラフィックディスプレイやフィルムレコーダ などにはそれぞれの機能に合わせたライブラリが開発されたが、同じ図形を出すの でも装置ごとにプログラムを書きかえるのはめんどうである。そこで装置になる べく依存しない標準が必要だということになった。アメリカから提案されたCORE という標準案もあったが、ISOではまず2次元グラフィックスに限って標準化する ことになり、ドイツの提案によるGKSが採用された。その後、3次元グラフィックス に関してPHIGSという標準が作られた。PHIGSはアメリカの提案であるが、GKSと なるべく共通の概念を使うように配慮されている。

GKSはラスターに相当する「セル配列 (cell array)」というものも出力基本要素 に数えているが、ラスターの入力を規定していないなど、画像処理のためには不じゅ うぶんである。GKSは線画を基本とする体系、いわばプロッタルーチンが進化したも のと言えよう。ただし「ペンの現在位置」という概念を使わない点ではプロッタ ルーチンと大きく違う。

GKSの解説書としては、鈴木(1991)が入門むきでわかりやすい。これは東北大学 大型計算機センターの広報にのせられた解説をもとにしたもので、多少、NECの大 型計算機のGKSライブラリACOS-GKSに依存した記述がある。川合(1985)は、GKSその ものの説明は簡単な付録だけであるが、全体としてGKSと調和する概念を使ってコン ピュータグラフィックスを論じている教科書である。森(1991)は、等値線(コン ター)をかくプログラムなどを実際に動く形で実現してみせたもので、GKSを応用 した例文として有益である。しかし、GKSとCalcomp型プロッタルーチンの概念が 入り混じっているため、わかりにくい面もある。Enderleほか(1987)は、GKSを提案 したドイツの研究者グループによる、GKSの機能のそれぞれに立ち入った解説書で ある。

=== GKSの基本出力要素 ===

GKSでは図形出力と入力ができるが、ここでは出力に限って述べる。

図形出力は大きく、「点」「線」「面」の出力があると考えられる。

GKSでは、線の基本要素として、折れ線(polyline)を採用した。 2点を結ぶ線分を基本としたほうがすなおなように思われるが、折れ線を基本と したのは、装置に伝える情報を節約するという実用上の配慮もあると思われる。 線分ごとに両端を伝えるよりは折れ線のほうが座標値の指定も少なくてすむし、 線の種類(実線か破線か)や色、太さなどの属性情報も一連の折れ線の間は変わら ないので伝えなくてよいからである。Fortranの呼び出し形式としては、

      CALL GPL (n, x, y)
ただし
         INTEGER n        点の個数
         REAL    x(n)     各点のx座標
         REAL    y(n)     各点のy座標
である。

点に相当するものとしては、無限小の点ではなく、有限の大きさをもつ「マー カー」を考えている。ただし、マーカーの種別番号1は点(のような形のマーカー) である。この場合も、同じ種別、色、大きさのマーカーを続けてかく場合を想定 して、マーカー列(polymarker)を基本要素として採用した。Fortranでは

      CALL GPM (n, x, y)
となる。引き数の意味は GPL の場合と同様である。

面というのは、線分の集まりで囲まれた多角形の領域を、色で塗りつぶしたり、 線分によるハッチングでうめたり、ドットパタンでタイリングしたりする需要で ある。GKSではfill areaと呼んでいる。Fortranでは

      CALL GFA (n, x, y)
である。与えられた始点と終点が同じでない場合は、その2点を結んだ多角形を考 える。なお、塗りつぶしの様式指定(ルーチン名 GSFAIS)をしない場合の標準値 としては、中空になるので、様式指定は必ず必要と考えたほうがよい。また、ライ ブラリの実現上のつごうで、Nには上限があることが多い。

GKSではこのほかに、文字列(text)を基本要素としている。文字の実現方法は 装置によって違う。XYプロッタでは線から構成するが、ディスプレイ装置では 点の集まりとして定義されていることも多い。そこで、ユーザープログラムが 装置に依存するどあいを小さくするために、文字を線や点とは別の基本要素と 考えるわけである。GKSの標準のFortranインタフェースでは、

      CALL GTX (px, py, string)
      REAL          px       文字列の基準点のx座標
      REAL          py       文字列の基準点のy座標
      CHARACTER*(*) string   文字列
である。 基準点が文字列の中でどのような位置に来るかは、属性指定ルーチンの一つGSTXAL (set text alignment)であらかじめ指定しておく。

このほか前にちょっとふれたセル配列(cell array, GCA)が基本要素であるが、 筆者がまだ使ったことがないので説明は省略する。

=== 座標系 ===

図形出力装置の座標系はまちまちである。多くの装置では長さはディジタル化 されているが、1辺のドット数は、たとえば1024、4096、640など、まちまちであ る。このような装置座標系に合わせてプログラムを書いてしまうと、違う装置用 に変更しにくい。

GKSでは、装置の画面を抽象化して、1辺が1の正方形を考える。x座標は0(左) から1(右)まで、y座標も0(下)から1(上)までの値をとる。これを正規化装置 座標(NDC, normalized device coordinate)と呼んでいる。出力される図形の情報 は、いったんNDCに変換されてから、実際の装置座標(DC)に変換される。ユーザ プログラムは、多くの場合、NDCさえ知っていれば、DCは知らなくてもよい。いい かえれば、画面の大きさに相対的な長さで作図するわけである。

ただし、実際の画面は正方形ではない。画面をいっぱいに使おうとする場合や、 画面の中で図がかかれる場所を制御したい場合は、NDCとDCとの関係(ワークス テーション変換)を自分で指定してやる必要がある。使うルーチンはGSWKWN (set workstation window)とGSWKVP(set workstation viewport)である。

一方、GKSでは、NDCよりも一段ユーザ側の座標系を考える。これを世界座標(WC, world coordinate)という。GKSの基本要素の入出力は、このWC座標系で行なわれ る。WCとNDCの関係づけを、正規化変換といい、WC側の「ウィンドウ」とNDC側の 「ビューポート」を同一視することによって指定する。使うルーチンはGSWN(set window)とGSVP(set viewport)である。正規化変換は、x、yそれぞれについて1次 式、つまり伸縮・平行移動である。残念ながら2次以上の多項式や、指数・対数・ 逆数などの変換はできない。また、多くの地図投影法のように、xとyの両方の関数 になるような座標変換もできない。1次変換のうちでも、増減の方向が逆になるよう な変換をしてはいけないことになっている。したがって、GKSの世界座標はユーザ 側の座標に関する需要を満たしてくれるとは限らない。

正規化変換は複数定義しておくことができ、ルーチンGSELNTによって選択される。 正規化変換 0 番は常に定義されており、これはWCをNDCと等しいとするものである。 つまり、積極的にウィンドウ・ビューポートの指定をしない場合は、NDCで作図して いると考えることができる。

=== 開始と終了 ===

GKSは、複数の装置を、あるいは同時に、あるいは交互に使うことができるように 設計されている。その便利さの反面、始め・終わりの指定はややめんどうである。

GKSでの図形処理開始の手続きは次のようになる。

      CALL GOPKS (ierrf, ibuf)            --  Open GKS
      CALL GOPWK (iwkid, iconid, iwktyp)  --  Open workstation
      CALL GACWK (iwkid)                  --  Activate workstation
また、終わりかたは、上の逆順に対応して、
      CALL GDAWK (iwkid)                  --  Deactivate workstation
      CALL GCLWK (iwkid)                  --  Close workstation
      CALL GCLKS                          --  Close GKS
である。

装置を複数使う場合は、iwkid (workstation ID)を1, 2, ...と変えて、それぞれ GOPWKを呼ぶ。これは装置を使う予約であって、GACWKを呼ぶまでは実際の出力はし ない。これはたとえば、プリンタを休ませておいて(deactivate)画面で処理を進め、 完成したところでプリンタ出力を再開する(activate)などということを可能にする ためのものである。装置が1つだけのときは、休ませる必要はないので、3つの ルーチンをたてつづけに呼ぶことになる。 これらのルーチンの引き数は、GKS準拠であってもライブラリごとに意味が少し ずつ違う。

この授業では、作図の開始と終了に関しては、

      CALL opngks    ... 作図開始
      CALL clsgks    ... 作図終了
ですませることにする。 opngks, clsgksは、GKS標準のルーチン名ではなく、NCAR Graphicsという GKSを応用するプログラムライブラリのルーチン名である。引き数はない。 それぞれ、上に述べた3つずつのGKSルーチンを適当な引き数の値で呼ぶ ものである。

=== 色について ===

GKSでは、基本要素の種類別に属性値が指定でき、出力のときに使われる。色も属性 のひとつだから、polyline, polymarker, fill area, textのそれぞれに対して、 GSPLCI, GSPMCI, GSFACI, GSTXCI(set polyline color indexなど)で、あらかじめ 指定しておくことになる。

これらのルーチンで指定するのは色の番号(インデクス)である。色の番号と実際の 色の対応は、GKS標準では、GSCR(set color representation)で指定することが できるが、GSCRを呼ばない場合の関係は決められていない。この対応関係は、テスト プログラムで確認する必要がある。

=== 参考文献 ===


2000-04-23; 2005-08-10
増田 耕一
[目次へ]