グラフィックス座標

画面上のピクセル位置を記述する座標系には,物理座標ビューポート座標,およびウィンドウ座標の 3 つがあります。3 つの座標系のいずれでも,X 座標が Y 座標の前に指定されます。

物理座標

物理座標は,ウィンドウのクライアント領域内のピクセルを参照する整数です。基本設定では,番号は 1 ではなく 0 から始まります。640 個のピクセルがある場合,0 ~ 639 の番号が付けられます。

プログラムが SETWINDOWCONFIG を呼び出して,640 個の水平ピクセルと 480 個の垂直ピクセルを含んでいるクライアント領域を設定したとします。個々のピクセルは,次図に示すように,X 軸と Y 軸を基準とする位置によって参照されます。

物理座標

左上隅が原点です。原点の X および Y 座標はつねに (0, 0) です。

物理座標は個々のピクセルを直接参照するので,整数として表されます。つまり,ウィンドウのクライアント領域は 1 ピクセルよりも小さい単位で表示することはできません。ピクセル位置を参照する変数を使用するときには,整数として宣言するか,グラフィックス関数に渡すときに型変換ルーチンを使用します。次に例を示します。

	ISTATUS = LINETO( INT2(REAL_x), INT2(REAL_y))

プログラムがウィンドウの基本の大きさを使用する場合,ビューポート (描画領域) は 640x480 です。SETVIEWORG はビューポート原点を変更します。この際には,新しい原点の X と Y の物理座標を表す 2 つの整数を渡します。また,ルーチンが前の原点の物理座標を格納する xycoord 構造型の変数も渡します。たとえば,次の行はビューポート原点を物理位置 (50,100) に移動します。

	TYPE (xycoord) origin
	CALL SETVIEWORG(INT2(50), INT2(100), origin)

画面上での結果を次図に示します。

SETVIEWORG によって変更された原点座標

ピクセル数は変更されていませんが,点を参照するために使われる座標が変更されています。X 軸は 0 ~ 639 ではなく -50 ~ +589 の範囲に,Y 軸は値 -100 ~ +379 の範囲になっています。

ビューポート座標を使用するすべてのグラフィックス・ルーチンは,MOVETOLINETORECTANGLEELLIPSEPOLYGONARC,および PIE を含めて,新しい原点の影響を受けます。たとえば,ビューポート原点を再配置した後に RECTANGLE を呼び出し,値 (0,0) と (40, 40) を渡すと,矩形の左上隅は,画面の左端から 50 ピクセル,上端から 100 ピクセルの位置に表示されます。画面の左上隅には表示されません。

SETCLIPRGN は,クリッピング領域と呼ばれる不可視の矩形領域を画面上に作成します。プログラマはクリッピング領域には描画を行えますが,この領域外に描画しようとすると,その試みは失敗します。クリッピング領域外には何も表示されません。

基本クリッピング領域は画面全体を覆います。QuickWin ライブラリーは画面外への描画の試みをすべて無視します。

クリッピング領域を変更するには SETCLIPRGN を呼び出します。たとえば,画面の解像度が 320x200 ピクセルだったとします。(0,0) から (319, 199) に,つまり左上隅から右下隅に向けて斜めの線を描画すると,画面は次図のようになります。

全画面に描画された線

次のように入力して,クリッピング領域を作成したとします。

	CALL SETCLIPRGN(INT2(10), INT2(10), INT2(309), INT2(189))

このクリッピング領域が有効になっていると,同じ LINETO コマンドは次図のような線を画面上に描画します。

クリッピング領域中に描画された線

ダッシュ線は,クリッピング領域の外側の境界を示しており,実際に画面上に出力されるわけではありません。

ビューポート座標

ビューポートは,画面上に表示される領域のことで,ウィンドウのクライアント領域の一部でしかない場合があります。ビューポート座標は,現在のビューポート内のピクセルを表します。SETVIEWPORT は,物理的なクライアント領域中に新しいビューポートを設定します。標準のビューポートには 2 つの特徴があります。

SETVIEWPORTSETVIEWORGSETCLIPRGN の組み合わせと同じ効果を持っています。SETCLIPRGN と同じように,画面の限定された領域を指定した後に,ビューポート原点を領域の左上隅に設定します。

ウィンドウ座標

クライアント領域とビューポート上の座標を参照する関数は整数値を必要とします。しかし,多くのアプリケーションは,周波数,粘度,質量などを表現するために浮動小数点値を必要とします。SETWINDOW を使うと,画面をほぼ任意の大きさに調整することができます。さらに,ウィンドウ関連の関数は倍精度値を受け付けます。

ウィンドウ座標は現在のビューポートを境界として使用します。ウィンドウは現在のビューポート上に重ねられます。ウィンドウ座標で,ウィンドウの境界を越えて (つまりビューポートの外に) 描画されたグラフィックスは表示されません。

たとえば,-50 ~ +450 の範囲にある火星の 12 ヵ月の平均温度をグラフにするには,プログラムに次の行を追加します。

	status = SETWINDOW(.TRUE., 1.0D0, -50.0D0, 12.0D0, 450.0D0)

第 1 引数は invert フラグで,最も小さい Y 値を左下の隅に置きます。その後に,X と Y 座標の最小値と最大値が指定されます。小数点は,これらが浮動小数点値であることを示しています。画面の新たな構造を次図に示します。

ウィンドウ座標

1 月と 12 月は,画面の左端と右端にプロットされます。このようなアプリケーションでは,X 軸に 0.0 から 13.0 までの値を持たせることで,両端に空白が追加され,見栄えがよくなります。

次に SETPIXEL_W を使って点をプロットしたり,LINETO_W を使って線を描画したりすると,値は設定されたウィンドウに合わせて自動的に拡大縮小されます。

浮動小数点値でウィンドウ座標を使用方法

  1. SETWINDOWCONFIG を使ってグラフィックス・モードを設定します。

  2. SETVIEWPORT を使ってビューポート領域を作成します。画面全体を使用する場合,この手順は不要です。

  3. SETWINDOW を使って実座標ウィンドウを作成します。この際には,LOGICALinvert フラグと,X および Y 座標の最小値と最大値を表す 4 つの DOUBLE PRECISION を渡します。

  4. RECTANGLE_W は,これに似たルーチンを使ってグラフィックス形状を描画します。RECTANGLE (ビューポート・ルーチン) と RECTANGLE_W (矩形を描画するためのウィンドウ・ルーチン) を間違えないようにしてください。すべてのウィンドウ関数名は,下線と文字 W (_W) で終わります。

実座標系を使うと,柔軟性と,装置からの独立性が得られます。たとえば,グラフを作成するデータ形式に応じて,軸を小さい範囲 (151.25 ~ 151.45 など) や,大きい範囲 (-50000.0 ~ +80000.0 など) に設定することができます。さらに,ウィンドウ座標を変更することで,図形の拡大縮小や回転といった効果を作り出すことができます。また,ウィンドウ座標により,図形がコンピュータのハードウェアに依存しなくなります。ビューポートへの出力は,実際の画面解像度からは独立しています。