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コントロールを貼り付け,エンボスのルーチンを追加する(ソースコードを参照し,自分で考えながら,
やってみること)