#02 ふれてみよう高校数学 幾何と図形

三角比の応用——高さと距離を求める

測れない距離を測る

たとえば、目の前に高いビルがあります。このビルの高さを知りたいのですが、外から直接測ることはできません。でも、ビルから少し離れて「てっぺんを何度の角度で見上げているか」を測れたとしたら?

建物の高さ、山の標高、川の向こう岸までの距離——これらは直接メジャーで測ることができません。しかし三角比を使えば、角度と手元の距離だけから答えが出せます。これが三角比の最も実用的な側面です。

仰角と俯角

仰角(elevation angle)とは、水平線よりを見上げたときの角度です。 俯角(depression angle)とは、水平線よりを見下ろしたときの角度です。

どちらも「水平面からの角度」として定義されます。仰角は首を上げた角度、俯角は首を下げた角度と覚えましょう。

     /← 仰角 α
水平─────/
観測者

基本的な計算パターン

パターン 1:高さを求める

観測者が建物から水平距離 dd 離れた場所から、建物の頂上を仰角 α\alpha で見るとき:

「水平距離」が「隣辺」、「建物の高さ」が「対辺」なので、tan\tan を使います。

高さh=dtanα\text{高さ} h = d \cdot \tan\alpha

パターン 2:斜距離を求める

仰角 α\alpha で見える頂上まで、直線距離(斜距離)LL を求めるとき:

L=dcosα=hsinαL = \frac{d}{\cos\alpha} = \frac{h}{\sin\alpha}

パターン 3:二点観測から高さを求める

同一直線上の二点 A、B から同じ建物の頂上を仰角 α\alphaβ\beta で見るとき(α<β\alpha < \beta、B が近い):

h=dtanαtanβtanβtanαh = \frac{d \cdot \tan\alpha \cdot \tan\beta}{\tan\beta - \tan\alpha}

ここで d=ABd = \overline{AB} は二点間の距離です。

インタラクティブ図解:測量シミュレーション

マウスを左右に動かすと観測距離が変わります。建物の高さは固定で、仰角と計算値がリアルタイムに変化します。近づくほど仰角が大きくなり、遠ざかるほど仰角が小さくなるのが確認できます。

マウスを左右に動かして観測距離を変えてみよう

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° で見た。ビルの高さを求めよ。(目の高さは無視する)

解法:

「水平距離 d=50d = 50m」と「仰角 α=38°\alpha = 38°」が与えられています。高さは対辺なので tan\tan を使います。

h=50×tan38°=50×0.781339.1 mh = 50 \times \tan 38° = 50 \times 0.7813 \approx 39.1 \text{ m}

例題 2

断崖の上(高さ 80m)から海面の船を俯角 25° で見た。断崖の真下から船までの水平距離を求めよ。

解法:

俯角なので、図を逆にして考えます。「高さが対辺、水平距離が隣辺」なので tan\tan を使います。ただし今度は水平距離を求めるので割り算になります。

d=htan25°=800.4663171.6 md = \frac{h}{\tan 25°} = \frac{80}{0.4663} \approx 171.6 \text{ m}

例題 3(二点観測)

A 地点から建物頂上を仰角 30° で、A から 20m 近づいた B 地点から仰角 45° で見た。建物の高さを求めよ。

解法:

「高さ hh と水平距離 xx はわからないが、2つの条件(A とBから見た角度)がある」——連立方程式で解きます。

A から建物の水平距離を xx とおくと:

tan30°=hxh=xtan30°\tan 30° = \frac{h}{x} \Rightarrow h = x \tan 30° tan45°=hx20h=(x20)tan45°\tan 45° = \frac{h}{x - 20} \Rightarrow h = (x-20) \tan 45°

2 式を等しいとおいて:

x13=(x20)1x \cdot \frac{1}{\sqrt{3}} = (x - 20) \cdot 1 x=x3203x = x\sqrt{3} - 20\sqrt{3} x(31)=203x(\sqrt{3} - 1) = 20\sqrt{3} x=20331=203(3+1)2=103(3+1)=30+103x = \frac{20\sqrt{3}}{\sqrt{3}-1} = \frac{20\sqrt{3}(\sqrt{3}+1)}{2} = 10\sqrt{3}(\sqrt{3}+1) = 30 + 10\sqrt{3} h=xtan30°=(30+103)13=303+10=103+1027.3 mh = x \tan 30° = (30 + 10\sqrt{3}) \cdot \frac{1}{\sqrt{3}} = \frac{30}{\sqrt{3}} + 10 = 10\sqrt{3} + 10 \approx 27.3 \text{ m}

実生活での応用

三角比は実際の測量や設計で活躍します。

場面使う比
山の標高測定tan(水平距離から高さ)
飛行機の高度と着陸角度sin, tan
日時計・太陽の高度tan
スロープの設計sin(斜距離と高さ)
橋の設計(斜材の角度)cos, tan

まとめ

  • 仰角は水平から上への角度、俯角は水平から下への角度——首を動かす方向と同じ
  • 基本公式:h=dtanαh = d \cdot \tan\alpha(水平距離 × tan = 高さ)
  • 「どれが対辺で、どれが隣辺か」を確認してから sin・cos・tan を選ぶ
  • 二点観測では方程式を立てて xx(未知の距離)を消去する
  • 三角比は「直接測れない長さ」を角度から計算する強力なツール

次回は三角形の辺と角の一般的な関係を示す「正弦定理・余弦定理」を学びます。