加速度運動
Last-modified: 2019-01-27 (日) 03:14:59 (1518d)
ボールが壁を跳ね返る様な絵を作ることはできるようになり ました。さて、次は地球上の実際のボールの様に重力の 影響で、奇跡が放物線を描くようにするにはどうしたらいいでしょうか。 運動方程式 †もちろん、基本的には加速度から速度を求め、その速度から 新しい位置を求める、といった計算は行います。 その基礎は、Newtonの運動方程式 力 = 質量 × 加速度 という方程式を解くというものです。 それほど難しい話でもないのですが、ここでは簡単に済ませておきます。 2つの方法 †その上で、この方法には大きく分けると2つのやり方があります。 1つは、グローバルな加速度 (ax, ay)をシミュレーション全体に 定義して、タートルの軌道計算を行う場合にそれを使うというもの。 そして、もう1つは、パッチそれぞれに対して加速度を持たせると いう方法です。 全者の方持たなければならない情報少なく、簡単なのですが、空間内の 加速度が全て同じという状況のシミュレーションしかできないため、 多少柔軟性にかけます。 そこで、このTIPSでは後者のやり方について説明します。 このやり方では、適当な場 を定義して、それに従った物体の運動をシミュレーションしたり、 物体が場の変化を引き起こすような状況を表すモデルが 作成できます。 パッチへの加速度の割り当て †まず、加速度のための変数をパッチに持たせます。 patches-own [ax ay] そして、初期設定として、全てのパッチに加速度を設定します。 ask-patches [ set ax 0 set ay -9.8 ] この場合、地球上の重力加速度 9.8 を下向きにかけた状態を 表したことになります。 運動のための手続き †加速度(ax, ay)をパッチから取得し、適当な時間刻みdtが与えられたとき、 次の様なタートル手続きで、新しい速度、位置の計算ができます。 to tmove let [:dt dt100 * 0.001] let [:ax ax-at xcor ycor] let [:ay ay-at xcor ycor] let [:vx ((dx * v) + (:ax * :dt))] let [:vy ((dy * v) + (:ay * :dt))] let [:angle (atan :vx :vy)] let [:dx v * :dt] set v (sqrt((:vx * :vx) + (:vy * :vy))) seth :angle fd (v * :dx) check-boundary end check-boundary手続きは、設定してある壁にぶつかった 事を判定して跳ね返る処理をしています。 例 †左端から右に向かって平行にタートルがスタートし、放物線 を描きながら運動し、壁にぶつかったら跳ね返る、という プログラムを載せておきます。 initした後や、tmoveを押したあとに pendownすると、奇跡がえらる ので、pdのボタンも用意しておきました。
Counter: 309,
today: 1,
yesterday: 0
|