4.4 DOSのグラフィックス画面エミュレータ

目次のページ; 前のページ; 次の章のページ

 ハードウェアとしてのグラフィックス装置は種々ありますので、描き出す装置を考えてプログラミングをしなければなりませんが、描き出す画像をモニタするのがグラフィックス用(子)ウインドウです。このウインドウも、数有るグラフィックス装置の一つと位置付け、そこに表示させることを当面の目的にします。プリンタもグラフィックス装置として利用できますが、モニタのハードコピーを取る装置として使う方が扱い易くなります。モニタをグラフィックス装置として利用するときの特徴は、ウインドウの寸法をそのスクリーンの範囲で自由に変更できるようにプログラミングできることです。しかし、固定画面寸法で表示させるよりも、プログラミングは多少複雑になります。

 グラフィックス装置は、その装置固有の作画領域の寸法があります。DOSの場合、それはCRTモニタの解像度640×480の画面です(N88-Basicでは640×400が採用されます)。この解像度は一種の寸法単位と解釈します。この全体寸法の中に、部分的にビューポートの枠組みを指定し、そのなかにグラフィックスの方で言うウインドウ座標系を割り付けます。VB_Graphicsでプログラミングする場合、グラフィックスウインドウ(子)を作画装置に割り当てます。その上に一つのビューポートを定義しますが、これは、フォームにピクチャーボックスを載せることで行わせます。ビューポートは、完成させる画像としての1単位と考えるとよいでしょう。通常は、写真と同じように横:縦に或アスペクト比を持たせます。このアスペクト比は種々考えられます。JISの用紙寸法の系列では1:0.7、35ミリカメラは3:2、N88-Basicのモニタ画面は1.6:1、標準テレビは4:3、のような系列です。真四角な画面1:1も実用されますが、縦長で使う例は滅多にありません。

 VB_Graphics では、デフォルトのビューポートはアスペクト比を定数Gaspect0 = 0.75(4:3)に設定してあります。そのため、1:1のアスペクト比を予定した画面は、天地が欠ける場合があります。アスペクト比は、MAPPING メニューからWindow サブメニューで作業画面を呼び出して変更することができます。

 グラフィックスウインドウのフォーム上に、ビューポートとして考えたアスペクト比 Gaspect0 を持ったピクチャーボックスを最大に接する様に左上詰めで載せます。このとき、asp と Gaspect0 との大小関係で、フォームに右か下かに余白がでます。ピクチャーボックスの背景色を白とし、フォームの背景色を灰色にしましたので、有効なピクチャーボックスの寸法と配置とが分ります。この割り付けを等方性変換(Isotropic)と言い、画像は相似形で作画されます。しかし、このピクチャーボックスをゴム板のようにフォームの全領域に引き伸して貼付ける方法も利用できます。これは、異方性変換 (Anisotropic) と言います。ウィンドウの寸法を変えると、その縦横比に追随して図形が変形します。この切り替えは、MAPPING メニューの Viewport サブメニューで選べます。

 次いで、このピクチャーボックス(ビューポート)にグラフィックスのWindow座標系を貼付けます。これがウインドウ・ビューポート変換です。この決め方は二種類の原理が利用されます。一つは、ウインドウが視野に収める世界座標の範囲、もう一つが座標軸の向きの定義です。普通のカメラを使って写真を撮るのは、グラフィックスの方では中心投影になり、三次元座標をフィルム上の二次元座標に変換します。平面図形を撮影する場合も、壁に描いた図形に対してカメラを垂直に向けて撮影すると考えます。カメラの場合には、画面の中心がレンズの光軸になり、被写体を中心で捉えるのが基本です。平面図形の或範囲を視野に納めたいとき、その平面図系の中心座標と、図形の横幅の三つ(wx、wy、ww)を、図形の方の世界座標で与えるのが VB_Graphics のウインドウの定義法です。このウインドウは矩形の領域になりますので、常識的なウインドウ定義は、矩形の対角線位置の座標で定義し、パラメータを四つ使いますが、VB_Graphics では三つです。縦の寸法は、上で説明したアスペクト比 Gaspect0 から計算します。

 VBのツールでは、グラフィックス座標軸の正負の向きを定義して、図形を左右・上下反転させて表示させることができます。これは MAPPING メニューの Rotate サブメニューで選べます。先のウインドウの定義で、パラメータを三つにしておいたのは、この対応を考慮したことも一つの理由です。これらの画面定義のすべては、次ページに示すプロシージャDpwindに集約しました。これは、標準モジュールVBGsub1.bas に組み込んでありますが、フォームのデザインを指定する CgraphicsG.frm フォームモジュールと対に使うようにしたプロトタイプです。

Public Sub Dpwind(xx, yy, ww)
    Dim asp, pwidth, pheight, ppwidth, ppheight, wh
    FormGraphic.ScaleMode = 1
    FormGraphic.Picture1.ScaleMode = 1
    pwidth = FormGraphic.Width
    pheight = FormGraphic.Height - FormGraphic.Command3.Height
    ppwidth = pwidth
    ppheight = pheight
    asp = pheight / pwidth
    FormGraphic.Picture1.Top = 0
    FormGraphic.Picture1.Left = 0
    If Isotropic = 1 Then
        If asp > Gaspect0 Then
            ppheight = pwidth * Gaspect0
            FormGraphic.Picture1.Top = 0
        Else
            ppwidth = pheight / Gaspect0
            FormGraphic.Picture1.Left = 0
        End If
    End If
    FormGraphic.Picture1.Width = ppwidth
    FormGraphic.Picture1.Height = ppheight
    xpwidth = FormGraphic.Picture1.Width / Screen.TwipsPerPixelX
    ypheight = FormGraphic.Picture1.Height / Screen.TwipsPerPixelY
    wh = Gaspect0 * ww      'height of graphic window
'
    Select Case Irotate
        Case 1 'Normal
            FormGraphic.Picture1.ScaleWidth = ww
            FormGraphic.Picture1.ScaleHeight = -wh
            FormGraphic.Picture1.ScaleLeft = xx - ww / 2
            FormGraphic.Picture1.ScaleTop = yy + wh / 2
        Case 2 'BottomUp
            FormGraphic.Picture1.ScaleWidth = ww
            FormGraphic.Picture1.ScaleHeight = wh
            FormGraphic.Picture1.ScaleLeft = xx - ww / 2
            FormGraphic.Picture1.ScaleTop = yy - wh / 2
        Case 3 'LeftToRight
            FormGraphic.Picture1.ScaleWidth = -ww
            FormGraphic.Picture1.ScaleHeight = -wh
            FormGraphic.Picture1.ScaleLeft = xx + ww / 2
            FormGraphic.Picture1.ScaleTop = yy + wh / 2
        Case 4 'TurnOver
            FormGraphic.Picture1.ScaleWidth = -ww
            FormGraphic.Picture1.ScaleHeight = wh
            FormGraphic.Picture1.ScaleLeft = xx + ww / 2
            FormGraphic.Picture1.ScaleTop = yy - wh / 2
    End Select
'
    xsleft = FormGraphic.Picture1.ScaleLeft
    ystop = FormGraphic.Picture1.ScaleTop
    xswidth = FormGraphic.Picture1.ScaleWidth
    ysheight = FormGraphic.Picture1.ScaleHeight
End Sub

次の章のページ