三角比の応用——高さと距離を求める
測れない距離を測る
たとえば、目の前に高いビルがあります。このビルの高さを知りたいのですが、外から直接測ることはできません。でも、ビルから少し離れて「てっぺんを何度の角度で見上げているか」を測れたとしたら?
建物の高さ、山の標高、川の向こう岸までの距離——これらは直接メジャーで測ることができません。しかし三角比を使えば、角度と手元の距離だけから答えが出せます。これが三角比の最も実用的な側面です。
仰角と俯角
仰角(elevation angle)とは、水平線より上を見上げたときの角度です。 俯角(depression angle)とは、水平線より下を見下ろしたときの角度です。
どちらも「水平面からの角度」として定義されます。仰角は首を上げた角度、俯角は首を下げた角度と覚えましょう。
/← 仰角 α
水平─────/
観測者
基本的な計算パターン
パターン 1:高さを求める
観測者が建物から水平距離 離れた場所から、建物の頂上を仰角 で見るとき:
「水平距離」が「隣辺」、「建物の高さ」が「対辺」なので、 を使います。
パターン 2:斜距離を求める
仰角 で見える頂上まで、直線距離(斜距離) を求めるとき:
パターン 3:二点観測から高さを求める
同一直線上の二点 A、B から同じ建物の頂上を仰角 、 で見るとき(、B が近い):
ここで は二点間の距離です。
インタラクティブ図解:測量シミュレーション
マウスを左右に動かすと観測距離が変わります。建物の高さは固定で、仰角と計算値がリアルタイムに変化します。近づくほど仰角が大きくなり、遠ざかるほど仰角が小さくなるのが確認できます。
function loop() {
ctx.clearRect(0, 0, W, H);
var groundY = 300;
var buildX = 480;
var buildH = 180;
var buildTop = groundY - buildH;
// 観測者の位置: mx で制御(左端60〜右端buildX-60)
var obsX = 60 + (mx / W) * (buildX - 120);
var obsY = groundY;
// 地面
ctx.fillStyle = '#161b22';
ctx.fillRect(0, groundY, W, H - groundY);
ctx.strokeStyle = '#30363d';
ctx.lineWidth = 1;
ctx.beginPath(); ctx.moveTo(0, groundY); ctx.lineTo(W, groundY); ctx.stroke();
// 建物
ctx.fillStyle = '#1c2128';
ctx.fillRect(buildX - 20, buildTop, 40, buildH);
ctx.strokeStyle = '#58a6ff';
ctx.lineWidth = 1.5;
ctx.strokeRect(buildX - 20, buildTop, 40, buildH);
// 窓
for (var wy = buildTop + 15; wy < groundY - 15; wy += 30) {
ctx.fillStyle = '#ffa65740';
ctx.fillRect(buildX - 12, wy, 10, 14);
ctx.fillRect(buildX + 2, wy, 10, 14);
}
// 頂上フラグ
ctx.beginPath();
ctx.moveTo(buildX, buildTop);
ctx.lineTo(buildX + 14, buildTop - 10);
ctx.lineTo(buildX, buildTop - 6);
ctx.fillStyle = '#f0883e';
ctx.fill();
// 水平距離
var horizDist = buildX - obsX;
var elevAngle = Math.atan2(buildH, horizDist);
var elevDeg = (elevAngle * 180 / Math.PI).toFixed(1);
// 仰角の線
ctx.beginPath();
ctx.moveTo(obsX, obsY);
ctx.lineTo(buildX, buildTop);
ctx.strokeStyle = '#f0883e';
ctx.lineWidth = 2.5;
ctx.setLineDash([6, 4]);
ctx.stroke();
ctx.setLineDash([]);
// 水平線
ctx.beginPath();
ctx.moveTo(obsX, obsY);
ctx.lineTo(buildX, obsY);
ctx.strokeStyle = '#30363d';
ctx.lineWidth = 1.5;
ctx.stroke();
// 高さの垂線
ctx.beginPath();
ctx.moveTo(buildX, obsY);
ctx.lineTo(buildX, buildTop);
ctx.strokeStyle = '#56d364';
ctx.lineWidth = 2;
ctx.stroke();
// 仰角弧
ctx.beginPath();
ctx.arc(obsX, obsY, 30, -elevAngle, 0);
ctx.strokeStyle = '#ffa657';
ctx.lineWidth = 2;
ctx.stroke();
ctx.fillStyle = '#ffa657';
ctx.font = '13px serif';
ctx.fillText('α', obsX + 34, obsY - 8);
// 距離ラベル
ctx.fillStyle = '#bc8cff';
ctx.font = '12px sans-serif';
ctx.fillText('d = ' + horizDist.toFixed(0) + ' m', obsX + (horizDist/2) - 20, obsY + 18);
// 高さラベル
ctx.fillStyle = '#56d364';
ctx.fillText('h = ' + buildH.toFixed(0) + ' m', buildX + 26, (buildTop + groundY) / 2);
// 観測者
ctx.beginPath();
ctx.arc(obsX, obsY - 12, 8, 0, Math.PI * 2);
ctx.fillStyle = '#79c0ff';
ctx.fill();
ctx.beginPath();
ctx.moveTo(obsX, obsY - 4);
ctx.lineTo(obsX, obsY - 28);
ctx.strokeStyle = '#79c0ff';
ctx.lineWidth = 2;
ctx.stroke();
// 計算パネル
ctx.fillStyle = '#0d1117cc';
ctx.fillRect(10, 10, 200, 90);
ctx.strokeStyle = '#30363d';
ctx.lineWidth = 1;
ctx.strokeRect(10, 10, 200, 90);
ctx.fillStyle = '#e6edf3';
ctx.font = 'bold 13px monospace';
ctx.fillText('仰角 α = ' + elevDeg + '°', 20, 32);
ctx.fillStyle = '#bc8cff';
ctx.fillText('d = ' + horizDist.toFixed(1) + ' m', 20, 52);
ctx.fillStyle = '#56d364';
ctx.fillText('h = d·tan α', 20, 72);
ctx.fillText(' = ' + (horizDist * Math.tan(elevAngle)).toFixed(1) + ' m', 20, 90);
requestAnimationFrame(loop);
}
loop();
例題を解いてみよう
例題 1
地上から水平距離 50m 離れた点から、ビルの屋上を仰角 38° で見た。ビルの高さを求めよ。(目の高さは無視する)
解法:
「水平距離 m」と「仰角 」が与えられています。高さは対辺なので を使います。
例題 2
断崖の上(高さ 80m)から海面の船を俯角 25° で見た。断崖の真下から船までの水平距離を求めよ。
解法:
俯角なので、図を逆にして考えます。「高さが対辺、水平距離が隣辺」なので を使います。ただし今度は水平距離を求めるので割り算になります。
例題 3(二点観測)
A 地点から建物頂上を仰角 30° で、A から 20m 近づいた B 地点から仰角 45° で見た。建物の高さを求めよ。
解法:
「高さ と水平距離 はわからないが、2つの条件(A とBから見た角度)がある」——連立方程式で解きます。
A から建物の水平距離を とおくと:
2 式を等しいとおいて:
実生活での応用
三角比は実際の測量や設計で活躍します。
| 場面 | 使う比 |
|---|---|
| 山の標高測定 | tan(水平距離から高さ) |
| 飛行機の高度と着陸角度 | sin, tan |
| 日時計・太陽の高度 | tan |
| スロープの設計 | sin(斜距離と高さ) |
| 橋の設計(斜材の角度) | cos, tan |
まとめ
- 仰角は水平から上への角度、俯角は水平から下への角度——首を動かす方向と同じ
- 基本公式:(水平距離 × tan = 高さ)
- 「どれが対辺で、どれが隣辺か」を確認してから sin・cos・tan を選ぶ
- 二点観測では方程式を立てて (未知の距離)を消去する
- 三角比は「直接測れない長さ」を角度から計算する強力なツール
次回は三角形の辺と角の一般的な関係を示す「正弦定理・余弦定理」を学びます。