Speakedraw(4) – 追跡せよ(私の足跡?)


関数move内で進行方向が変わったときにオブジェクトの軌跡を辿る線を描きます。と言っても始点に想定される壁の位置から終点と想定される反対側の壁の位置を結ぶ線です。壁に当たる以外にもオブジェクト同士が接触した時にも描くのでちょっと面白く描かれる時もあります。(オブジェクト接触時は想定外の振る舞いもありますがこれも偶然の産物ということで。)

まずは関数setFromToです。
進行方向と逆に向かって壁に接触するところを始点として設定して
進行方向に向かって壁に接触するところを終点とします。

続いて実際に始点と終点を算出する関数getCanvasEdgeです。
現時点のXY座標と角度から壁に接触する座標を取得します。

動作するプログラムはこちらです。
ちょっと図解もしておきます。


って、これじゃわからないっすかね。。。
この関数は初めはもっとわかりやすいコーディングをしていたのですが、重複箇所が多かったのでかなりの作り変えました。コード自体は当初より1/3くらいになったと思います。始点と終点も別にしていたのですが、よくよく考えたら始点を求めるには進行方向と逆に進んだことにすればいいことが判明したのでそれだけでもかなりすっきりした気分です。図を何度も書いててひっくり返して見てたら「あれぇ~~!」と思った次第です。。

関数calcAdjacentでは対辺と角度から底辺を求めます。
まずは斜辺の長さを求めてから底辺を算出しています。

関数calcOppositeでは底辺と角度から対辺を求めます。
まずは斜辺の長さを求めてから対辺を算出しています。

求めた始点と終点から線を描画します。

という感じです。
線を描くのはなんとなく思いついたのですが、三角関数とプログラミングを改めてエライ真剣に学習する羽目になりました。
しかしながら偶然の産物もあって面白い動きをしてくれるようになりました。