花火とか雷とかまでの距離を求める

でも音速って一定じゃないよね

一般に光と音の差の時間から距離は求まる。

光速は1秒間に地球7周半、google先生によると 299,792,458 m/sで、音速は 340 m/sぐらいなので、だいたい1000000倍弱ちがうので、有効数字が3桁程度であれば、「音速×時間=そこまでの距離」と考えてよい。

ざっくりと距離を求めるには、340mだと計算しにくいので、大体3秒で1kmとしてしまえば、暗算でもわりと簡単にできる。「6秒だからざっくりと2kmぐらいだよね」とか。

ごく簡単にだいたいの距離を求めるなら、そのぐらいの概算で十分。うん。

小学校の算数であればその計算でいいのだけれど、高校ぐらいになると「でも音速って温度によって変わってくるよね」とかめんどうなことを言い出す奴がいたりする。

音速は絶対温度の一次関数か

確かに音速は温度によって変化する。wikipediaによると c = 331.5 + 0.61 tらしいのだが、これは一次のテイラー展開による近似式のようで、より厳密な式は、c = 20.055 * √(t + 273.15 ) であるらしい。

desmosでグラフを書いてみたところ、常温領域(0℃~50℃)では、ほぼ誤差は無い様だ。

時間も正確に測りたい

javascriptでストップウォッチ的なものを作るというのはわりと一般的みたいだ。初心者向けのサンプル的なものが検索すると引っかかった。基本的な動作としては、スタートボタンを押した時間を基準にしてどのぐらい時間が経ったか表示すればよい。なるほど。

興味がわいたので、実際にそれで試作してみた。そうするとスマホで操作したときボタンを押したタイミングとのズレが気になる。多くのサンプルのようにeventを"click"で引っかけて、処理するとボタンを離した瞬間がトリガーになるため、少し遅れた感じになってしまうのだ。

じゃぁ"mousedown"ならどうかというと、これもほんの少し遅れる。おそらくタッチパネルが押されたタイミングから押されたと確定するまでに時間がかかるようだ。ブラウザの挙動にもよるのかもしれないけど。

なので"touchdown"を使ってみる。たぶん感覚的には近い。何度か試すと、ごくまれにチャタリングのような挙動が見えたので、ある程度短い間隔のイベントがあったら、それは無視することにする。あとtouchイベントに対応していない場合はmousedownを使うことにする。弊害としてボタン上でタッチを開始してスクロールさせたり、ダブルクリックで拡大するようなシーンでも、ボタンが押された判定となってしまう。まぁ違和感はないだろうと思うのでそのままにする。

音速から距離測定ツールをつくってみた

というわけでツールページを作ってみた。雷や花火などが光ったタイミングと音が鳴ったタイミングでボタンを押すことで、間隔時間を計測。その間隔時間と音速から、距離を計算して表示する仕様。より厳密に青いつまみで気温(℃)を設定するとその環境での音速(m/s)を表示し再計算する。やまびことかも音の反射なので、戻ってくるまでの時間差で往復距離がわかりますかね。

こんな感じ。

音と光のズレから距離測定ツール

花火はやっぱり近くで見ると迫力が違う。音の大きさとか重低音の響きとか、音って空気の振動なんだなというのを肌で感じることができるのが好き。落ち着いたら花火大会とか行きたいですね。とりあえず両親に感謝。