ICTメディア編集U 2025年12月19日
グラフィックスを用いたシミュレーションプログラム練習
(繰り返し処理:For・・・To・・・Next)
間隔や期限の決められた繰り返し処理
Visual Basicにおいて,シミュレーションプログラムなどで、計算式の一部の値を徐々に一定の間隔で変化させて、その結果を表示させたい場合があります。例えば、あるものの動きが計算式で表されていたとし,時間を変化させてどのように動きが変化するのかを見たい場合などがあげられます。
Visual Basicでは連続した動きを表すには,タイマー関数と呼ばれる時間で画面表示をコントロールするようなものもありますが,今回は,繰り返しの終了する時点(期限が決められている)がわかっていることから,For …to… Nextという制御命令を用いることとします.この命令も計算式の数値を徐々に変化させて計算を行う繰り返しの処理となります.
以下に、この繰り返し処理について解説していきます。プログラムでは、非常に良く用いられる処理ですので、使い方を良く覚えてください。
For … To …Next制御命令による繰り返し処理
繰り返しの回数が決まっている場合や数値が一定の値ずつ変化する場合には、For …To…Next制御命令を使うと便利です。
For 変数名 = 初期値 To 最終値 [Step 増分]
ステートメントブロック
Next [変数名]
1. 変数の値を初期値から最終値を越えない範囲で増分ずつ変えながら For ステートメントと Next ステートメント間のブロックのステートメントを繰り返し実行します。
2. 変数の値が最終値を越えたときには繰り返しを終わり、Next ステートメントの次の行のステートメントを実行します。
3. 増分が1のときには、「Step 1」を省略できます。
4. For とNext は1対1で対応しなければならない。
5.
Next の後の変数は、For ステートメントの変数と同じものとします。For
ステートメントに対応するNext ステートメントが明らかなときには、Next ステートメントの変数名は省略できます。
演 習
サインカーブ(正弦関数)の変化を,グラフィックスを用いて画面に描くシミュレーションプログラムを作成しましょう.
サインカーブとは、正弦関数y=sinxのグラフで、yの値は、xの値(角度)によって−1から1までの間の数となり、xの値が360度,(2π[rad];π:円周率、3.141592)増える毎に同じ形を繰り返す曲線の波形です。
sin(0) = 0, sin(90) =1,
sin(180) = 0, sin(270) =
-1, sin(360) = 0
シミュレーションを行う範囲は、角度を0から4π(rad:ラジアン、角度の単位、180度=πrad)まで変えて、サインカーブを描くものとします。
角度を徐々に変えていくには、すでに解説した繰り返し処理(For…To…Next)を用います。
以下に作成の手順をそのまま解説していきます。
作成手順
1.
Visual
Basic 2017(もしくは2019など各自インストールしたソフト)を立ち上げ,
新しいプロジェクトを開きます(名前は「SinCurve」).
2.
フォームのサイズを幅450, 高さ280にします.フォームのプロパティウインドウでTextを「Sinカーブ」にしておきましょう.

3.
フォーム上にPictureBoxをLocationを10, 10で,サイズを幅420, 高さ200のを設定して作成します。
PictureBoxのプロパティで「BackColor」を白色にします。
PictureBoxのプロパティウインドウのLocation,Sizeを使って図形を描く範囲を指定します。

3つのコマンドボタン「描画」(Button1に割り当てる)、「消去」( Button2に割り当てる)、「終了」( Button3に割り当てる)を作成してください。
3つのコマンドボタンを配置し、 それぞれのButtonのプロパティで、「Text」を変えます。

4.
各コマンドをクリックし、以下のコードを書き込んでください。
3つのコマンドボタンをクリックし、 それぞれのButtonをクリック時のサブプログラムの動作コードを書き込みます。
注意:以下のプログラムをコピーした場合で、コメント文「’以下の文章....」が2行以上にわたる場合は、必ず、2行目以降のコメント文の始まりに「’」を入れてください。以下のプログラムで緑の文字はコメントです.プログラムには影響しない文字を入れることができます.
Private Sub
Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'描画を行うコマンドボタンをクリックしたときのサブプログラム
Dim pai, r As Double 'πと角度の変数宣言
Dim x, y As Integer '描画するxとy座標の変数の宣言
Dim gr As Graphics
= PictureBox1.CreateGraphics 'グラフィックオブジェクトを作成する
Dim p As New Pen(Color.Red,
2) ' 線の太さを2,色を赤に指定する
pai =
3.14159 'πを定義する
gr.DrawLine(Pens.Black, 20, 100, CInt(pai * 4 * 30 + 20),
100) ' (20,100)から(pai*4*30+20,100)まで直線を引く。
'x方向は座標軸に合わせるため30倍する.
'CInt()は初めて出てきましたが,括弧の中の数値を整数にする関数です.DrawLineが整数しか受け付けないためです.
For r = 0 To 4 * pai Step pai / 90
'角度 r を0から4πラジアン(720度)まで、π/90(2度)づつ変える
x =
r * 30 + 20 'x座標を30倍し、見やすくするために右に20シフト(平行移動)する
y =
-50 * Math.Sin(r) + 100 'y座標を計算する。パソコンの y座標は、上が0で下が正の値なっている。
'そのため、負号を付けて、正負を反転し、さらに100を加えて下にシフトする
gr.DrawEllipse(p, x, y, 1, 1) '上記で計算したx、y座標に円の命令で点を描く
Next r '繰り返し制御の折り返し
End Sub
Private Sub
Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
'消去を行うコマンドボタンをクリックしたときのサブプログラム
PictureBox1.Image = Nothing
End Sub
Private Sub
Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
'終了を行うコマンドボタンをクリックしたときのサブプログラム
End
End Sub

(解説)
コメント(「’」の後の文)としてプログラム中に各行のコードについて解説がされています。
サイン(Sin)などの算術関数は、 Visual Basicの数値関数としてあらかじめ定義されています。
Math.Sin(x):xのSin(正弦)の値を算出します。xはラジアンで与えます。
補足:コードエディタ上の一番最初の行に以下の記述を入れると,Math.Sin()は,Sin()と書くことができる.
Imports System.Math
サインカーブを描くには、角度 r を変えながら、その都度Sinの値を計算して、y座標を求めます。x座標は角度 r となします。
しかし、角度 r は0から4π(約12.6)、Sinの値は最大で±1であり、座標(10, 10)- (420, 200)と比べて非常に小さいので、x座標は30倍、y座標(振幅)は50倍しています。
また、パソコンの座標は、数学で用いる座標系と異なり、下の方が正の大きくなる座標であるため、負号を付けて正負を反転し、さらに100を加えて下にシフト(移動)しています。
〔補足〕
ここでFor to nextの部分で、Sinカーブを描く部分をまずは、直線を描くようにして見ましょう
For r = 0 To 360 Step 10 ' r を0から360
まで、10 づつ変える
x =
r + 20 'x座標をrの値とし、見やすくするために右に20シフト(平行移動)する
y =
0.2 * r + 100 'y座標を計算する。パソコンの y座標は、上が0で下が正の値なっている。
'次に、0.2に負号を付けて、正負を反転し、さらに100を加えて下にシフトしてみましょう
gr.DrawEllipse(p, x, y, 1, 1) '上記で計算したx、y座標に円の命令で点を描く
Next r '繰り返し制御の折り返し
5.
実行してみましょう。
描画、消去、終了の各ボタンをクリックし、動作の確認を行いましょう。

書き込んだコードの座標や数値を変えることによって、どのようなことが起こるか試し、座標や数値が何を示しているのかを確認しましょう。
6. ”すべてを保存” で保存してください。
演習課題
先ほど、グラフィックを付加した、サイコロのプログラムの繰り返し部分を、For to
next文をもちいて、ある程度の時間が来たら、サイコロが止まるようにしてみましょう。時間は、ランダム関数Rnd()で、不定にすることも考えてみましょう