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

等値線による塗り分け

等値線が、空間的に連続分布する量の表現であるとすれば、 ふたつの等値線にはさまれた領域は、そのふたつの値の間の値をもっている。 したがって、等値線でかこまれた領域を、その値に従って塗り分けることに よって、分布する量の情報を伝えることができる。情報量は等値線だけによる 場合と変わらないはずであるが、他の量を重ねる必要がない場合には、 塗り分けをしたほうが人間にはわかりやすいことが多い。 (地形図では「段彩」という。)

多角形領域を一定の色あるいは模様で塗りつぶすGKSのfill area機能 (Fortranのサブルーチン名はGFA)を使って、等値線による塗り分けの プログラムを作ることができる。

森(1991)の本には、GKSを使った塗り分けの例文がある。

塩野ほか(1988a)の「基礎編」では、 格子点データをもとにした塗りわけのBasicによる例文がある。 このうち「色塗りコンターマップ」を、GKSを使うように書きなおしたのが、 filcmain.f [link] (メインプログラム)、 fillc4.f [link] (作業の主要部)である。 なお、凡例となる色の帯を表示するために、 legbar.f [link] を使っている。 実行結果は、次の図になる。

このアルゴリズムは、「今注目している等値線レベルよりも高いところに 色を塗る」ということを各レベルごとに行なっている。 等値線と格子線の交わる位置を求める部分は、 前の、等値線をひくプログラムと同じである。 交点が2つの場合は、それを結んだ線の両側の多角形、 4つの場合は、隅の3角形2つか、中央の6角形かのうちで、 値が高いほうを選んで塗る。

この方法では、 同じ場所を何度も塗りなおすことになっている。 塗り直しを避けたい場合は、塗るべき多角形の頂点の集合を どこかに記憶しておいて、逐次修正していけばよいが、 場合わけをよく考える必要がある。 森(1991)では、1つのマス目を一周する間の等値線と格子線との交点 を記録し、等値線レベルではさまれた区間に対応する多角形をそれぞれ 構成して塗っている。 データ構造として、頂点を逐次挿入できるような、リンクリスト形式を 採用するとよいかもしれない。 (森先生の本では配列ですませているが、そのいくつかは 他の配列への添字をしまっておくものである。)

なお、見る人間に情報を伝えるためには、 配色について、視覚効果を考えるべきではあるが、 ここでは、色が相互に区別できることだけをめざし、 NCAR Graphicsが標準でそなえている8色をそのまま使った。 ただし、となりあった区間が近い色になることと、 地形図で低地を緑色で表わす習慣に合わせることだけは考慮した。 GKS規格では、色番号と実際の色の対応は決められていないので、 GKS準拠のライブラリであっても、NCAR以外のものを使って同じ 色を出そうとすると、色番号をつけなおす必要がある。 ただし、GKSライブラリがset color representation (Fortranのルーチン名 GSCR)の機能をもっていれば、それを使って 色番号と色(red, green, blueのそれぞれの明るさで指定)との 対応を指定することができる。

格子点データで面を塗り分ける場合、必ずしも等値線で囲むのでは なく、格子点のまわりの長方形をその値に対応する色で塗ってしまえば よい場合もある。このほうがプログラムはずっと簡単であり、 もし画面に比べて格子間隔がじゅうぶん細かい場合は、 等値線で塗り分けるのとほぼ同じ効果を簡単にあげることができる。 塩野ほか(1988a)の「色分けマップ」の例文を翻訳したものが、 tilemain.f [link] (メインプログラム)、 tile4.f [link] (作業の主要部)である。 比較してみてほしい。

いずれも、vnullという変数があり、 格子点の「高さ」の値が vnull 以上だった場合は、データ欠損の印と みなして、その部分には線をひいたり色を塗ったりしないようにしてある。 (塩野ほか、1988aでは、「vnullよりも大きい場合は...」という設定に なっているが、少し変更した。) [等値線(コンター): 実例による説明]の記事でのべた 等値線をかくプログラムでも、同様にvnullを有効にした。

ここまでの例文は、チベット高原付近を切り出した標高データを使ったものである。 世界全体の標高データを使うように変更したメインプログラム filcglob.f [link]tileglob.f [link] も作った。

参考文献


1996-12-10, 2000-06-12, 2005-08-10, 2020-08-17
増田 耕一< (MASUDA Kooiti)
[GKS教材の目次へ]