地図/基礎/Canvas と数学

角度とベクトル — 進む向きと、跳ね返り

向きは角度(ラジアン)で持つ。cos a が横の進み具合、sin a が縦の進み具合。角度をひとつ持てば、(cos a, sin a) で「その向きへ一歩」が書ける。

角度を少しずつ増やして螺旋に動かしつつ、箱の中で壁に当たったら跳ね返す。横の壁に当たったら横の速度の符号を反転、縦の壁なら縦の符号を反転。片方の成分だけ向きを裏返すと、鏡のように跳ね返る。

跳ね返りで「めり込んだら戻す」も一緒にやっている。壁を越えた分を Math.min / Math.max で押し戻してから符号を反転する。位置を直さないと、毎フレーム壁の外で符号が反転しつづけて点が震える。位置を直してから向きを裏返す順番になる。背景は毎フレーム薄く塗っていて、点の通った跡が尾になって残る。

角度から向きへの (cos a, sin a) の逆向き、向きから角度を求めるのが Math.atan2(dy, dx)。普通の atan だと象限が潰れて 0..π しか出ないが、atan2dydx の符号を見て -π..π の全周を返す。ある点から別の点へ向かう角度を出すときに使う。ベクトルを「長さ1」に揃える正規化は dx/len, dy/lenlen = Math.hypot(dx, dy))で、向きだけ欲しいときに使う。