ICTメディア編集2の最終課題:シミュレーションプログラム
この課題は、後期試験に代わる課題とします。必ず、提出するようにしてください。
課題)ボールを,ある速度で投げ上げたとき,どのくらいの距離まで飛ぶのでしょうか.また,同じ速度では,どのくらいの角度で投げると,一番遠くまでボールを飛ばすことができるのでしょうか.
この質問に答えるために,ボールの動きを表示するシミュレーションプログラムを作成することが課題です.

作成プログラム動作画面例
解説)
まず,ボールの動きのシミュレーションプログラムを作成する前に,ボールがどんな動きをするかのモデル(運動方程式)がどうなるかを考えてみます.
ボールの動きは,放物線運動という物理現象となります.
まずは,必要な計算式(放物線運動のモデル)について,見ていきましょう.
初めの速度 v
0 [m/s] ,θ[度(degree)]の角度で,ボールを投げ上げたとき,投げてからt [s(秒)]後のボールの位置は,
ボールの飛距離をx[m]とすると:
(計算符号をきちんと書けば: x = v0
× cosθ × t )
ボールの高さをy[m]とすると:
(計算符号をきちんと書けば: y = v0 × sinθ
× t
- 0.5 × g
× t × t )
の式で求めることができます.
ただしgは重力加速度で
です.
また,ボールが地上に落下するまでの時間を t 0 [s(秒)]とすると,それは,
(計算符号をきちんと書けば: t0 = 2 × v0 × sinθ ÷g)
の式で求められます.
そのため,ボールが地上に落下するまでの飛距離は,この t
0 [s(秒)]後のボールの距離を計算( x の式にt 0の数値を代入し計算)すれば,求められます.
以上の計算式を用いれば,初速度と角度を入力すると,ボールの飛距離を計算することができるはずです.
次にボールの動きをシミュレーションするには,距離と高さを求める計算式の時間 t を,0秒からt 0 秒(上記の式で計算したもの)まで,何秒かごとに時間をたしていきながら,ボールの位置を距離と高さとして計算し,その位置に点や円の図形を描くようにすればよいことになります.
上記の0秒からt0秒まで,ある一定時間ごとに,距離と高さを計算する必要があり,そのための繰り返しの制御文として,For…to...step
Next制御文を使用します.この,For toからNextまでの中に計算式と図形を描く命令などを入力します.
(ヒント)
まず,プログラムを作成していくにあたっては,入力する値は何であるか,出力する値は何であるか,図形として描きたいものは何であるかを決めておく必要があります.また,これらの値を変数として扱うことを考えて変数名を決める必要があります.
これらが決定すると,数値の入力をするためのTextBoxのツールや図形を描くためのPictureBoxやButtonのツールなどでフォームを設計します.例を参考にフォームエディタでツールを配置していきます。
フォームの設計が終われば、次は命令(コード)を書いていくことになります。描画のボタンがクリックされたら、計算とボールの軌跡を表示させたいのですから、描画のボタンをクリックし、そのサブプログラムの中に以下のコードを書いていくことになります。
入力する値はTextBoxを使っているとすれば,それらを自分で決めた変数名(記号として置き換える)に入るように代入式を作ります.
例えば,投げたときの角度の変数名をkとして,TextBoxのツールの名前がTextBox2であったととすると,コードエディタで代入式は,
k = Val(TextBox2.Text)
となります.入力にはさらに初速度があります.これを上の解説と同じようにv0とおいて,同じように代入式を作りましょう.
はじめに,必ず,変数の宣言が必要ですので,使用する変数名を決めておき,Dimで宣言をします.以下に例を示します。使用する変数はすべて使う前に宣言が必要です。
Dim k, v0 As Double
·
ラジアンについて
角度を表す単位で、ふつうは、degree(度)を使いますが、コンピュータは rad(ラジアン)という単位の数値を使います。ですから、角度を入力してもらうときに、度であった単位を、下記の式によってラジアンに変換しなければ、ならなくなるわけです。
・k[度(degree)]を角度の変数と置き、ラジアン単位の角度をr[rad]とすると,その変換式は,
r = k / 180 *
3.141592
となります
· sinθ、cosθ
について
Sin,Cosなどの算術関数は、 Visual
Basicの数値関数としてあらかじめ定義されています。
Math.Sin(x): 角度 x のSin(正弦)の値を算出する。ただし x の単位は,度[degree]ではなく,はラジアン[rad]で与えます。
Math.Cos(x): 角度 x のCos(余弦)の値を算出する。ただし x の単位は,度[degree]ではなく,はラジアン[rad]で与えます。
ということですから、計算式のsinθは、プログラム上では、θは半角の英数字ではないため,r などの変数を代わりに使用して,Math.Sin(r) というふうに書くことになります.また,θの単位はラジアンですから,以下のように角度をラジアンに変換した
r [rad]の値が入るわけです。
(補足)コードエディタ上の一番最初の行に以下の記述を入れると,Math.Sin()は,Sin()と書くことができる.
Imports System.Math
·
落下時刻について
ボールが地上に落下する時刻 t 0 は上記に式で示されています.ただし,g=9.81です.
ですが,これも変数名を同じようにt0とおくと,これまでのsinの解説や角度の変数rなどを使うと以下のような式としてかけます.ここで, q はrとなっています
Visual
Basic.NETの計算式では: g = 9.81
Visual
Basic.NETの計算式では: t0 = 2 * v0 * Math.Sin(r)
/ g
このt0が落下する時刻です.
·
落下距離について
ボールの飛距離をx[m]とすると:
Visual
Basic.NETの計算式では: x = v0 * Math.Cos(r)
* t
(ここで, q はrという記号にしている)
上の式は,時刻tの時のものであるので,これを落下する時刻t0を入れて計算すれば,落下距離が求められるはずです.
第一段階:
ここまでのヒントを用いて,まず,テキストボックス,ボタン,ラベルなどを用いて,初速度と角度の入力と,計算させるボタン,計算結果として落下距離を表示させるプログラムを作成してみますよう.
·
落下するまでのボールの位置について
このt0を落下する時刻の変数としておいていますから,それまでのボールの位置を一定の時間毎に画面に描いていくようにすれば,良いわけです.そこで,ある一定の時間毎の繰り返し処理が必要になるわけですから,前回用いたFor to Next制御文を用います.時間の変数名をtとすると,落下する時刻のt0まででよいわけですから,以下のようなFor文になります.
For t = 0 to t0 step ??
「ボールの位置を計算する式とボールを描く命令」
Next t
stepのところが??となっていますが,これは何秒おきにボールの位置を描くかです.これは,どのくらいの数だけボールの軌跡(動き)を描きたいかによります.たとえば,20点のボールの軌跡を図形として描くには,ボールが地上に落下するまで時刻を
t 0 [s]を点の数で割ったものをFor文のstepに使用すれば,その時間間隔ごとに計算して,ボールを描いてくれることになります.ですから,??の部分(間隔)は,t0/20となります.
ForとNextの間の「ボールの位置を計算する式とボールを描く命令」には,文字通り,まず,ボールの飛距離と高さの計算式が入ります.飛距離をxとして,高さをyとすると,上にあった計算式を参照して,
ボールの飛距離をx[m]とすると:
Visual Basic.NETの計算式では: x = v0 * Math.Cos(r)
* t
(ここで, q はrとなっている)
ボールの高さをy[m]とすると:
Visual Basic.NETの計算式では: y = v0 * Math.Sin(r)
* t - 0.5 * g * t * t
·
図形を描くピクチャーボックスの大きさと初速度 v0 [m/s] の大きさ
ボールの動きを描く範囲は,ピクチャーボックスの大きさで決まりますが,以下の実行例にあるように,初速度が40[m/s]で,角度45[度]で投げ上げたときに,落下距離は163[m]あまりです.そのため,計算で求めた距離や高さの数値をそのまま,図形の座標として,点や円などを描くとするとあまりにも大きさが小さく,画面に小さくしか描くことができません.そこで,計算で求めた距離や高さの値を何倍か(今回は数が大きいので1倍から見て調整してください)してピクチャーボックスの大きさに合わせるようにします.ただし,高さを表す縦軸は下の方向がプラスですから,そのまま図形を描くとお椀型になってしまいます.ですから,ピクチャーボックスのHeightから高さyの値を引き算するようにすれば,山型の図形になります.
この部分の式は描きませんので,前回のプログラムなどを参考に式を作ってみましょう.
初速度を大きくすれば,当然,遠くまで飛ぶことになりますから,今回のシミュレーションのプログラムでは,初速度の入力は40[m/s]までを想定することにして,ピクチャーボックスの大きさを修正して下さい.
·
ボールを,グラフィックスメソッドを用いて描く
ボールの飛距離と高さを上記のヒントにしたがって,大きさを数倍にしたり,数が減るような形に計算させたりしたものを,グラフィックスメソッドでPictureBox上に描いてやれば良いわけです.
例えば,飛距離を修正した変数名をxz,高さを修正した変数名をyzとして円を使って表示すると(点を直接かけないため,小さな円を点として代用)、以下のようになります。
Dim gr As Graphics =
PictureBox1.CreateGraphics()
gr.DrawEllipse(Pens.Red, xz, yz, 1, 1)
もちろん,変数をおかなくても,上記のxとyを直接計算させたものを使って描いてもかまいません.この例のxzとyzには値を入れるための代入式を書かなければなりません。
xz
= x
xzの上記の式はあくまで例です。いくつかの数を足すなどの調整をすると見やすくなります。
yzについては、コンピュータの座標の上下の関係に注意した式が必要になります。考えてみましょう。
注意:DrawEllipseの命令の中の座標を示す変数は、整数である必要があります。そのため、この場合、xzとyzの宣言は以下のようになります。
Dim xz, yz As Integer
(プログラムの実行例)
下記の実行例はあくまで例であるため、同じである必要はありません。

(課題提出方法)
提出は、2026年1月16日(金):20時までに、Oh-o! Meijiのレポート提出機能に添付書類にて送付してください。以後の提出は,原則として認めません.
添付としてお送りしていただくファイルは、プロジェクトファイルのフォルダを圧縮して、1つのファイルにしていただいたものになります。
最初に新しいプロジェクトとして、プログラムを作成するときに、プロジェクト名に「各自の名字(加藤であれば、"kato")」を「名前」としていただき、その下の「場所」のところをよく覚えておいてください(例えば、各自自宅のPCにインストールすると「C:\Users\*****\source\repos」:*****はユーザー名など)。わからなくなった場合には、各自の付けたフォルダ名で検索してください。
教室のPCでは、ディスクトップ上の「MyDocs」のアイコンをクリックして開き、差の中の「ドキュメント」を開き、さらにその中の「Visual studio 2022」を開き、さらに「Projects」の中の「****」(プロジェクト名として入れたフォルダ名)があると思います。
このプロジェクトフォルダごと(中身全て)をフォルダの上で右ボタンを押し、メニューの「圧縮先」からZIPファイルを選択して圧縮し、「???.zip」というファイルを作成して、そのファイルを送付してください。
※教室のPCには、圧縮したいフォルダを選択した後に、マウスの右ボタンを押すとプルダウンのメニューに「圧縮」という項目があります。さらに、その中の「zip」を選んでください。そうすると、設定にもよりますが、ディスクトップの画面上に、圧縮した「***.zip」というファイルができていると思います。そのファイルを提出してください。
現在、教室等のPCには圧縮用のソフトである、Lhaplusが入っていませんが、これを用いて圧縮し、その圧縮後の1つのファイル(???.lzh)や(???.zip)を、送付していただいて良いです。
Lhaplus ダウンロード 無料は以下のURLから行ってください。
https://www.lhaplus.org/lhaplus/
Lhaplusを用いた圧縮手順(圧縮)
1.Visual
Basicで、作成したプロジェクトのフォルダを確認し,中身のファイルも確認する。
2.そのフォルダを明治大学の教室および実習室のコンピュータのすべてのプログラムのメニューにあるLhaplusフォルダのLhaplusを立ち上げる(各自のPCにインストールした場合には、それを立ち上げます。).まず,設定画面からアーカイブ変換形式を.lzhとして適用を押し,設定を変えておきます.
3.ディスクトップ画面に,Lhaplusのショートカットアイコンが生成されますので,そのアイコンに,圧縮したいフォルダをドラッグアンドドロップする.すると,×××.lzhというファイルが作られます.
4.その×××.lzhのファイルをレポート機能で送付する。
途中まで作成した方は、メニューのファイルから「すべて保存」で保存してください。作成途中から再開したい場合には、教室のPCでは、ディスクトップ上の「MyDocs」のアイコンをクリックして開き、差の中の「ドキュメント」を開き、さらにその中の「Visual studio 2022」を開き、さらに「Projects」の中の「****」(プロジェクト名として入れたフォルダ名)をさらに開いて、同じ名前で、拡張子にslnのついた「****.sln」のファイルをダブルクリックし、Visual studio
2022で開けば、途中から続けて作業を開始できます。
質問は、随時shin.kato@aist.go.jpで受け付けます。
加藤のページへ | ICTメディア編集U | 12月19日講義資料の先頭ページへ