地形情報処理プログラムの作成手順

1) C:\CGの下にMapというディレクトリを作成する. (コンピュータ上ではC:\CG\MAPとして扱われる)
2) http://www.myu.ac.jp/makanae/に接続し,今回のコンピュータグラフィックスの資料の中から
  5740.SEM 及び 6040.SEM を作成したディレクトリの下にダウンロードする.
3) とりあえず読み込みのプログラムを作成する.
  ここでは読み込まれた内容を確認するために,print文を作成する.
 a)新規プロジェクトで標準.EXEを選択する.
 b)CommandButtonコントロールをForm1上に配置する(Command1).
 c)以下のようなコードを作成する.

 Option Explicit   '変数宣言を強要する.宣言していない変数は使えない.
  Private Sub Command1_Click()
    Dim buf As String
    Open "C:\CG\Map\6040.SEM" For Input As #1
    Input #1, buf
    Print buf
  End Sub

  これで最初に読み込まれた1行が表示されるはずである.

4)次に1行目のデータ(ヘッダ)部分から必要なデータを読み込むため,以下のコードを追加する.
  処理に必要となる横方向のデータ数,縦方向のデータ数を読み込むため,以下のデータを記載する.

    Option Explicit
    Private Sub Command1_Click()
         Dim buf As String
        Dim Xsize As Integer, Ysize As Integer   '変数を定義する.

          Open "C:\CG\Map\6040.SEM" For Input As #1
          Input #1, buf
 '         Print buf                  ' 'をつけて注釈文にするか削除.処理を行なわない.

          Xsize=Val(Mid$(buf,24,3))  '変数Bufの中の何文字目(半角)から何文字,
                                           '読み込みなさいという意味
        Ysize=Val(Mid$(buf,27,3))  'さらにVal関数で数値化する.
        Print Xsize, Ysize  '正しく読めているかを確認する
    End Sub

5)とりあえずデータを読み込んでみる.

    Option Explicit
    Private Sub Command1_Click()
        Dim buf As String
        Dim Xsize As Integer, Ysize As Integer
       Dim n as Integer     'nを変数として定義
 
        Open "C:\CG\Map\6040.SEM" For Input As #1
        Input #1, buf

        Xsize=Val(Mid$(buf,24 ,3 ))
        Ysize=Val(Mid$(Buf,27 , 3))
' 削除       Print Xsize, Ysize
 
       For n = 0 to Ysize-1
            Input #1, buf
        Next
     End Sub

6)高度を格納するための配列を定義し,読み込んだデータの中にその配列を入力する.

    Option Explicit
   Dim Altitude() As Single  '動的変数(変数の要素数を後から指定できる.)
                  'プロシージャの外で定義する.
    Private Sub Command1_Click()
        Dim buf As String
        Dim Xsize, Ysize As Integer
      Dim m As Integer, n as Integer     'mも変数定義に加える

        Open "C:\CG\Map\6040.SEM" For Input As #1
        Input #1, buf

        Xsize=Val(Mid$(buf, 24 ,3 ))
        Ysize=Val(Mid$(buf, 27, 3 ))

       Redim Altitude(Xsize-1, Ysize-1)   '配列数がわかったところで,配列を再定義 
 
     For n = 0 To Ysize-1
            Input #1, buf
            For m = 0 To Xsize-1
                Altitude(m,n) = Val(Mid$(Buf, m*5+10, 5)) /10  'VAL関数で読みこんだデータを数値化                           '高度は0.1m単位で入っている(小数点無し)なので10で割り,m単位にする.
            Next
        Next
     End Sub

7)高度の最大値を得るために,以下のコードを追加しておく.
    Option Explicit
    Dim Altitude() As Single
    Private Sub Command1_Click()
        Dim buf As String
        Dim Xsize, Ysize As Integer
      Dim m, n as Integer
     Dim max As Single  '最大値を格納する変数maxを倍精度浮動小数点型として定義する.

        Open "C:\CG\Map\6040.SEM" For Input As #1
        Input #1, buf

        Xsize=Val(Mid$(buf, 24 ,3 ))
        Ysize=Val(Mid$(buf, 27, 3 ))

       Redim Altitude(Xsize-1, Ysize-1)
 
     For n = 0 To Ysize-1
            Input #1, buf
            For m = 0 To Xsize-1
                Altitude(m,n) = Val(Mid$(Buf, m*5+10, 5))/10  'VAL関数で読みこんだデータを数値化
                                              '高度は0.1m単位で入っている(小数点無し)なので10で割り,m単位にする.
             If Altitude(m,n) > max Then max = Altitude(m,n)
                                                                    'これまでの最大だったら最大値として保持
           Next
        Next
       Print max '最大値の確認
    End Sub

8)高度を色に置きかえるための係数を計算する.
    Option Explicit
   Dim Altitude() As Single
    Private Sub Command1_Click()
        Dim buf As String
        Dim Xsize As Integer, Ysize As Integer
      Dim m As Integer, n As Integer
     Dim max As Single
       Dim colorScale As Single 'カラースケールのための変数を設定する.
 

        Open "C:\CG\Map\6040.SEM" For Input As #1
        Input #1, buf

        Xsize=Val(Mid$(buf, 24 ,3 ))
        Ysize=Val(Mid$(buf, 27, 3 ))

       Redim Altitude(Xsize-1, Ysize-1)
 
     For n = 0 To Ysize-1
            Input #1, buf
            For m = 0 To Xsize-1
                Altitude(m,n) = Val(Mid$(Buf, m*5+10, 5))/10
            If Altitude(m,n) > max Then max = Altitude(m,n)
           Next
        Next
 '削除        Print max
      colorScale = 255/max  '図幅内の最高値が255になるような係数を計算する.
      print colorScale  '確認する
    End Sub
 

9)配列に読み込んだ色をPicture1に出力する.
 そのため,PictureBoxコントロールをPicture1としてForm1上に配置し,
  Picture1のScaleModeプロパティを ピクセルに変更する.

    Option Explicit
   Dim Altitude() As Single
    Private Sub Command1_Click()
        Dim buf As String
        Dim Xsize As Integer, Ysize As Integer
        Dim m As Integer, n As Integer
        Dim max As Single
        Dim colorScale As Single 'カラースケールのための変数を設定する.
        Dim h As Single

        Open "C:\CG\Map\6040.SEM" For Input As #1
        Input #1, buf

        Xsize=Val(Mid$(buf, 24 ,3 ))
        Ysize=Val(Mid$(buf, 27, 3 ))

        ReDim Altitude(Xsize-1, Ysize-1)  '配列数がわかったところで,配列を再定義
 
        For n = 0 To Ysize-1
            Input #1, buf
            For m = 0 To Xsize-1
                Altitude(m,n) = Val(Mid$(buf, m*5+10, 5))/10
            If Altitude(m,n) > max Then max = Altitude(m,n)
            Next
        Next
 
        colorScale = 255/max  '図幅内の最高値が255になるような係数を計算する.
'削除       print colorScale
 
        For n = 0 To Ysize-1
            For m = 0 To Xsize -1
                h = Altitude(m, n)  'いちいち打ち込むのが面倒なので簡単な変数に置きかえる.
                Picture1.Pset (m, n), RGB(h*colorScale, h*colorScale, h*colorScale)
            Next
        Next
  End Sub
 
10) 9)を実行するとエラーになる.
  それは海に対して高度が-9999が入っており,RGB関数は負の値を受け付けないためで
  ある.
  そこでIf文を用いて負の場合の色を設定する(海以外にも負の値となる場合がある).

    Option Explicit
   Dim Altitude() As Single
    Private Sub Command1_Click()
        Dim buf As String
        Dim Xsize As Integer, Ysize As Integer
        Dim m As Integer, n As Integer
        Dim max As Single
        Dim colorScale As Single
        Dim h As Single

        Open "C:\CG\Map\6040.SEM" For Input As #1
        Input #1, buf
'       Print buf 

        Xsize=Val(Mid$(buf, 24 ,3 ))
        Ysize=Val(Mid$(buf, 27, 3 ))
'        Print Xsize, Ysize

        ReDim Altitude(Xsize-1, Ysize-1) 
 
        For n = 0 To Ysize-1
            Input #1, buf
            For m = 0 To Xsize-1
                Altitude(m,n) = Val(Mid$(buf, m*5+10, 5))/10
            If Altitude(m,n) > max Then max = Altitude(m,n)
            Next
        Next
 '     Print max
 
        colorScale = 255/max
'       print colorScale
 
        For n = 0 To Ysize-1
            For m = 0 To Xsize -1
                h = Altitude(m, n)
                If h < 0 Then
                    Picture1.Pset(m,n), RGB(0,0,255)    '海を青にする
                Else
                    Picture1.Pset (m, n), RGB(h*colorScale, h*colorScale, h*colorScale)
                End If
            Next
        Next
  End Sub

基本的なプログラムが完成したら,次にインターフェースを整備する(例えばファイル名を任意に設定できる
ようにするなど).
 
10)Picture2コントロールを貼り付け,エンボスのルーチンを追加する(ソースコードを参照し,自分で考えながら,
  やってみること)