地図/基礎/Canvas と数学

消さずに、薄く残す

動く点を毎フレーム描く前に、画面をどう扱うかで残像が決まる。三通りある。clearRect で全消しすると最新の点しか残らない。紙の色(paper = tint(238))を不透明で上から塗っても同じく全消しになる。同じ紙色を薄いアルファで塗ると、古い点が一段ずつ沈んで後ろに尾が伸びる。下は同じ速さで動く点を三つの帯に並べ、左から全消し・不透明塗り・薄塗りにしている。薄塗りの帯だけ軌跡が残る。

帯と帯の境目を薄塗りが越えないよう、塗る矩形を帯の幅で区切っている。塗る濃さが尾の長さを決める。tintAlpha(238, 0.06) のアルファを上げると古い点の消えが速くなって尾が短くなり、下げると尾が長く伸びて画面が埋まる。

薄塗りで尾を残すのは指数減衰そのもの。アルファ a の紙色を上から重ねるたび、古い点の「紙からの距離」が毎フレーム (1 − a) 倍に縮む。n フレーム後には (1 − a)ⁿ まで沈むので、点は急に消えるのでなく指数関数で紙に溶けていく。globalAlpha を下げて紙を塗るのと tintAlpha(238, a) で塗るのは、同じ「上から半透明を一枚かける」操作で効きはほぼ同じ。clearRecta = 1(一回で全部消す)の極端、不透明塗りも同じく a = 1 に当たる。

この薄塗りの膜で軌跡を引く描き方を全面で回しているのが flow。向きの場に沿って大量の粒子を歩かせ、毎フレーム tintAlpha の膜を一枚かけて尾を引かせる。下は同じ仕掛けを最小化したもの。sincos で各点の向きを決め、その向きへ一歩進めて点を打つ。背景を薄塗りで重ねるので、粒子の通った道が筋になって残る。

粒子の寿命が尽きるか画面の外へ出たら、別の一様な位置へ撒き直す。clearRect を一度も呼ばず tintAlpha の膜だけで描くので、点が忘れられていく速さが尾の長さになる。膜のアルファを step の大きさと合わせて握ると、短い破線から長い流線まで筋の質が変わる。