次のプログラムは〇をx方向に往復運動をするものだった。
float x, y, dx; void setup(){ size(400,400); x = 0; y = height / 2; dx = 2; } void draw(){ fill(0); rect(0,0,width,height); fill(255); circle(x, y, 20); if( x < 0 || x > width ) { dx = -dx; } x = x + dx; }
次のスケッチは、物理法則をそれなりに模擬する。 初速度20m/s、角度thで投げ上げられた物体の位置を計算し、それを表示する。x, y, vx, vyは物体の位置と速度のx, y成分、dtは1フレーム当たりの経過時間を表す。
Setupでは、thに投げ上げの角度を代入し、フレームレートをfpsで設定し、1フレーム当たりの経過時間をfpsの逆数として計算している。drawでは、1mを10ピクセルとして物体を〇として描く。appliMatrix(...)はそのための座標変換である。そして、xにvx*dt、yにvy*dtを加え、vyに-g*dtを加える。本当はdt秒の間にvyが変化しているので、「yにvy*dtを加える」ことが妥当かどうか怪しいが、ここでは深く問わないことにする。(dtが小さければ誤差も小さい)
float x, y, vx, vy, dt; void setup(){ size(800,300); x = 0; y = 0; float th = 75; vx = 20 * cos(radians(th)); vy = 20 * sin(radians(th)); float fps = 120; frameRate(fps); dt = 1.0 / fps; } void draw(){ fill(0); rect(0, 0, width, height); applyMatrix( 10, 0, 5, 0, -10, height-5 ); fill(255); circle(x, y, 2); x = x + vx * dt; y = y + vy * dt; vy = vy - 9.8 * dt; }
物体が地面で弾性的に跳ね返るようにするには、drawの最後の行に、
if( y<0 ){ y=0; vy = -vy; }
を加えればよい。