DCLで使用する座標系には 4 つのレベルがある. それぞれのレベルは上位レベルから順に「ユーザー座標系」, 「正規座標系」, 「透視座標系」, 「装置座標系」というように呼ばれる.
最も上位のユーザー座標系はユーザーが定義する座標系で、 X-Y座標や地図投影座標などが含まれる。 その一つ下位の正規座標系には2次元, 3次元のそれぞれ1つずつの直角座標系が定義されており, どの軸も定義域は[0,1] である。 多様なユーザー座標はすべてこの2種類の座標系に変換される. この変換のことを「正規変換」 と呼ぶ.
次に「透視変換」と呼ばれる変換によって、正規座標系は透視座標系に変換される。 透視座標系は図の形式にも出力デバイスにもよらない、共通の座標系である。 2次元の直角座標系で, x軸, y軸 ともに定義域は[0,1] になっている。 2次元の正規座標系からの透視変換は、通常は恒等変換である。 3次元の正規座標系からの透視変換は、透視図法すなわち遠近法による変換がおこなわれる。
最も下位の座標系である装置座標系はデバイス固有の座標系で, デバイスによって異なる.
これを統一するために, その一つ上位に透視座標系を定義して,
すべてこの透視座標系を経由して装置座標系に変換される.
この変換を「ワークステーション変換」と呼ぶ. 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座標系とR座標系は使い分けておいた方が良い.
すなわち, 座標軸などの「図に付随した情報」は,
透視図法で図とともに変換すべき情報なので V
座標系で描画し, SLPACK
の描くページ数やパラメタの数値などのように「紙に付随した情報」は
R 座標系で描画すべきである.
なお, 地図座標系の正規化変換は,
座標の「回転」と「投影」の2段階で行なわれ,
その中間の座標 (U座標系を回転した座標) を T 座標
(Terrestrial coordinate) という. T 座標はx軸の定義域が
[-180, 180], y軸の定義域が[-90, 90]の座標系で,
この座標系から各地図投影の定義式に従って変換される.
任意の経線を中央経線としたり,
横軸法や斜軸法の投影をするためには投影の前に回転操作が必要となる.
T座標系は正規化変換の際の一時的な作業座標系であるので, これを意識しなければならないことは少いが, 地図座標のクリッピングだけは U座標系ではなくT座標系で行なわれるので, この座標系を意識する必要がある.
program sample_2d03 use dcl integer,parameter :: nx=18, ny=18 real,parameter :: xmin= 0, xmax=360, dx1=20, dx2=60 real,parameter :: ymin=-90, ymax=+90, dy1=10, dy2=30 real,parameter :: pi=3.141592, drad=pi/180, dz=0.05, dp=0.2 real,dimension(0:nx,0:ny) :: p do j = 0, ny do i = 0, nx alon = ( xmin + (xmax-xmin) * i/nx ) * drad alat = ( ymin + (ymax-ymin) * j/ny ) * drad slat = sin(alat) p(i,j) = cos(alon) * (1-slat**2) * sin(2*pi*slat) + dz end do end do call DclOpenGraphics() ! rmiss = DclGetReal( 'GLOBAL:rmiss' ) call DclGetParm( 'GLOBAL:rmiss', rmiss ) call DclSetParm( 'GRAPH:LSOFTF', .false. ) call DclNewFrame call DclSetWindow( xmin, xmax, ymin, ymax ) call DclSetViewPort( 0.2, 0.8, 0.2, 0.8 ) call DclSetTransNumber( DCL_UNI_UNI ) call DclSetTransFunction call DclSetShadeLevel( rmiss, -dp, 201 ) call DclSetShadeLevel( dp, dp*2, 401 ) call DclSetShadeLevel( dp*2, rmiss, 402 ) call DclShadeContour( p ) call DclDrawAxis( 'bt', dx2, dx1 ) call DclDrawTitle( 'b', 'LONGITUDE', 0.0 ) call DclDrawAxis( 'lr', dy2, dy1 ) call DclDrawTitle( 'l', 'LATITUDE', 0.0 ) call DclSetContourLevel( p, dp ) call DclDrawContour( p ) call DclCloseGraphics end program |
![]() |
DclSetShadeLevel (UEGTLA,UEGTLB, UESTLV,UESTLN) |
ぬりわけレベルを設定する. |
DclClearShadeLevel (UEITLV) |
ぬりわけレベルを無効にする. |
DclShadeContourEx (UETONF) |
image 機能を使って2次元等値線図を色でぬりわける. |
* 括弧の中は、対応するf77インターフェイス名.