三角関数を使ってみたかった

最近数学系の本を読んでいて、ふと、「数学で幾何学を習ったけど、公式を暗記してテストで問題を解いたくらいで、実際にちゃんと使ったことないし、何かに利用できる道具であることを実感してみたいな」と思い、身近ですぐ実践できる問題はないかな、とWikipediaを見ていたら、三角測量のページに下のイラストを見つけました。

劉徽による263年頃の、島の高さを測る方法を示した図、1726年の版に含まれているイラスト

おそらく、これは2点から山の頂上を見上げた時の角度を使うと山の高さが測れるんだろうな、きっと三角関数を使うとできそうだな、と思ったので、作図してみました。

(Wikipediaのイラストの解法はこれとは違ってそうですが)2点から山の頂上を見上げる角度と、角度を観測した2点の距離を測ることができれば、大掛かりな器具がなくても山の高さが測定できそうです。
山の頂点と2箇所の観測地点が作る三角形で正弦定理を使うと、観測地点の距離(x)と山側の観測地点で見上げた角度(B)から、後ろ側の観測地点から山の頂上までの長さ(r)がわかります。すると山の高さ(h)は r × sin A で求めることができます。
実際に書いた図を定規と分度器で計ってx,A,Bに入れてhを計算すると、定規で測ったhと一致していそうでした。

アプリを作ってみる

では、実際に測定して確かめてみたくなったので、角度の計測ができるブラウザ上で動くアプリを適当に作ってみました。
https://tektoh.github.io/measure-height/
https://github.com/tektoh/measure-height

手元にあった SH-M05 (Android8) で動作を確認しています。iPhoneではうまく動きませんでした。

MediaDevicesを使ってカメラのデータをvideoタグで表示し、videoの中央にCSSで十字マークをつけていて、videoの下のスライダーでカメラをズームできます。また、DeviceOrientationEventでデバイスの傾きを取得しています。”tilt” が前向き(x軸)の回転角度で、”roll” が横向き(z軸)の回転角度です。
カメラを見ながら高さを測定したい地点を十字マークに合わせ、rollが0になるように注意しながらtiltを読みます。
測定する場所を変えて、2箇所で測定箇所の距離、視点の上方向、下方向それぞれの角度を測ると、高さを測定したい地点の地面からの高さを求められます。

ひとまずの実験で、自宅の2mの高さのドアを、ドアから1〜2mくらいの適当な位置と、その1m後ろ(巻き尺で測定)の2ヶ所からドアの上下の角度を測定してみると、結果は199.0cmでした。スマホは手持ちで雑に測定したのですが、なんとなくちゃんとしてそうな数字が出ました。これはイケそう。

巨人の身長を測る

というわけでもう少し大きなものを測ってみたいので、この方法で高さを測るのにちょうどいい物はないかな、と思って見つけたのがお台場のユニコーンガンダム。正面に広場があるので角度を計測する2点が確保しやすい、高さが公表されているので答え合わせができる、休日に娘を連れて日本科学未来館に遊びに行くことにすれば道中で測定ができる!

ガンダムの足元を歩き回る娘を視界の隅で追いつつ、アプリでユニコーンガンダムのツノと足元の角度Aを計測し、後ろに10歩下がってもう一度ツノと足元の角度Bを計測しました。

角度Aは上38.0°、下1.0°、角度Bは上48.0°、下1.4°でした。私の歩幅は2歩で150cmだったので、10歩だと7.5mです。

これを先の式に当てはめると、

高さ = 7.5m × (sin 38.0° × sin 48.0° / sin 10° + sin 1.0° × sin 1.4° / sin 0.4°) ≒ 20.2m

という結果が出ました。

お台場のユニコーンガンダムの高さは 19.7m らしいので、約20mというところでは一致したのではないでしょうか。カメラを三脚などで固定したり、測定位置間の長さをちゃんと測定し、複数回測定するなりするともう少し正確な結果になりそうな感じがあります。

まとめ

大掛かりな道具がなくても、スマホだけでユニコーンガンダムの大体の高さが1分で測れてしまいました。三角関数ってすごいね(小並感)