三角関数の定義——単位円
単位円による三角関数の定義
建物の高さや山の標高を測るとき、角度を使いますよね。「傾き30度の坂を100m進んだら高さはどのくらい?」——これを計算するのが三角関数です。
でも、直角三角形だけで考えると「90度より大きい角」は扱えません。たとえば、時計の針が12時を過ぎてさらに回った場合、その「角度」に対応するsinやcosはどうなる?——そこで登場するのが単位円を使った定義です。
半径1の円(単位円)の上に点 があるとします。原点(中心)から点 への方向と、右向きの軸とのなす角を としたとき:
つまり「cosは横方向の成分、sinは縦方向の成分」——これだけ覚えておけば、どんな角度にも対応できます。この定義のおかげで、 が鋭角だけでなく、任意の角度(負の角・ 以上の角)にも対応しています。
4つの象限と符号
単位円を4等分したエリアを「象限」と言います。時計の反対回りに第1〜第4象限と呼びます。「右上が第1、左上が第2、左下が第3、右下が第4」——地図の4方向のようなイメージです。
各エリアでcosとsinの符号(プラス・マイナス)が決まります。cos は「横方向(x座標)」なので右半分でプラス、sin は「縦方向(y座標)」なので上半分でプラスです。
| 象限 | の範囲 | |||
|---|---|---|---|---|
| 第1象限 | ||||
| 第2象限 | ||||
| 第3象限 | ||||
| 第4象限 |
覚え方:「す・た・つ・き(すべて・たんじぇんと・つかい・きょうは)」など
インタラクティブデモ:単位円アニメーション
点 が単位円上を回転します。青い線は ( 軸への射影)、赤い線は ( 軸への射影)を表しています。マウスを左右に動かすと角度が変わります。右パネルの数値がリアルタイムで変わるのを確認してください——第2象限(90〜180°)に入るとcosがマイナスになるのがよくわかります。
function loop() {
ctx.clearRect(0, 0, W, H);
var cx = W / 2 - 60, cy = H / 2 + 10;
var r = 120;
var theta = (mx / W) * Math.PI * 2;
var cosT = Math.cos(theta), sinT = Math.sin(theta);
var px = cx + r * cosT, py = cy - r * sinT;
// Quadrant shading
var qColor = ['rgba(79,195,247,0.08)', 'rgba(129,199,132,0.08)', 'rgba(239,83,80,0.08)', 'rgba(255,183,77,0.08)'];
for (var qi = 0; qi < 4; qi++) {
var qa = qi * Math.PI / 2;
ctx.fillStyle = qColor[qi];
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.arc(cx, cy, r + 20, -qa, -qa - Math.PI / 2, true);
ctx.closePath();
ctx.fill();
}
// Grid
ctx.strokeStyle = 'rgba(255,255,255,0.08)';
ctx.lineWidth = 1;
for (var gi = -3; gi <= 3; gi++) {
ctx.beginPath(); ctx.moveTo(cx + gi * 40, cy - 180); ctx.lineTo(cx + gi * 40, cy + 180); ctx.stroke();
ctx.beginPath(); ctx.moveTo(cx - 160, cy + gi * 40); ctx.lineTo(cx + 160, cy + gi * 40); ctx.stroke();
}
// Unit circle
ctx.strokeStyle = 'rgba(255,255,255,0.25)';
ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.stroke();
// Axes
ctx.strokeStyle = 'rgba(255,255,255,0.35)';
ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(cx - 160, cy); ctx.lineTo(cx + 160, cy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(cx, cy - 160); ctx.lineTo(cx, cy + 160); ctx.stroke();
// Axis labels
ctx.fillStyle = 'rgba(255,255,255,0.5)';
ctx.font = '12px sans-serif';
ctx.fillText('1', cx + r - 6, cy + 16);
ctx.fillText('-1', cx - r - 16, cy + 16);
ctx.fillText('1', cx + 4, cy - r + 4);
ctx.fillText('-1', cx + 4, cy + r + 12);
// Arc for theta
ctx.strokeStyle = 'rgba(255,235,59,0.6)';
ctx.lineWidth = 2;
ctx.beginPath();
ctx.arc(cx, cy, 28, 0, -theta, theta < 0);
ctx.stroke();
ctx.fillStyle = '#ffeb3b';
ctx.font = '14px sans-serif';
ctx.fillText('θ', cx + 32, cy - 6);
// cos segment (x-projection) - blue
ctx.strokeStyle = '#4fc3f7';
ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(cx, cy); ctx.lineTo(px, cy); ctx.stroke();
// label
ctx.fillStyle = '#4fc3f7';
ctx.font = 'bold 12px sans-serif';
ctx.fillText('cosθ = ' + cosT.toFixed(3), cx + (cosT > 0 ? 4 : -80), cy + 18);
// sin segment (y-projection) - red
ctx.strokeStyle = '#ef5350';
ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(px, cy); ctx.lineTo(px, py); ctx.stroke();
ctx.fillStyle = '#ef5350';
ctx.font = 'bold 12px sans-serif';
var sinLabelX = cosT > 0 ? px + 6 : px - 70;
ctx.fillText('sinθ = ' + sinT.toFixed(3), sinLabelX, cy - (sinT * r) / 2);
// Radius line
ctx.strokeStyle = 'rgba(255,255,255,0.7)';
ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(cx, cy); ctx.lineTo(px, py); ctx.stroke();
// Point P
ctx.fillStyle = '#ffeb3b';
ctx.beginPath(); ctx.arc(px, py, 7, 0, Math.PI * 2); ctx.fill();
ctx.strokeStyle = '#fff';
ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.arc(px, py, 7, 0, Math.PI * 2); ctx.stroke();
ctx.fillStyle = '#fff';
ctx.font = 'bold 13px sans-serif';
ctx.fillText('P', px + 9, py - 6);
// Dashed projection lines
ctx.strokeStyle = 'rgba(255,255,255,0.2)';
ctx.lineWidth = 1;
ctx.setLineDash([4, 4]);
ctx.beginPath(); ctx.moveTo(px, py); ctx.lineTo(px, cy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(px, py); ctx.lineTo(cx, py); ctx.stroke();
ctx.setLineDash([]);
// Info panel
var deg = (theta * 180 / Math.PI % 360 + 360) % 360;
var tanT = Math.abs(cosT) > 0.01 ? (sinT / cosT).toFixed(3) : '±∞';
ctx.fillStyle = 'rgba(0,0,0,0.65)';
ctx.beginPath(); ctx.roundRect(W - 180, 10, 168, 100, 8); ctx.fill();
ctx.fillStyle = '#ffeb3b';
ctx.font = 'bold 14px monospace';
ctx.fillText('θ = ' + deg.toFixed(1) + '°', W - 168, 34);
ctx.fillStyle = '#4fc3f7';
ctx.font = '13px monospace';
ctx.fillText('cos = ' + cosT.toFixed(3), W - 168, 56);
ctx.fillStyle = '#ef5350';
ctx.fillText('sin = ' + sinT.toFixed(3), W - 168, 74);
ctx.fillStyle = '#a5d6a7';
ctx.fillText('tan = ' + tanT, W - 168, 92);
// Quadrant label
var qNum = theta >= 0 && theta < Math.PI/2 ? 'Ⅰ' : theta < Math.PI ? 'Ⅱ' : theta < 3*Math.PI/2 ? 'Ⅲ' : 'Ⅳ';
ctx.fillStyle = 'rgba(255,255,255,0.6)';
ctx.font = '12px sans-serif';
ctx.fillText('第' + qNum + '象限', W - 168, 108);
requestAnimationFrame(loop);
}
loop(); 特殊角の三角比
「30°、45°、60°」——この3つは特によく使う角度です。試験や計算で何度も登場するので、値を覚えておくと便利です。
覚え方のコツ: の値は から にかけて「」と増えていきます。分子を と思うと規則的——「ルートの中が0から4まで増える」と覚えれば一気に覚えられます。
| 未定義 |
は の逆順——「sinが増えるとcosが減る」というシーソーのような関係です。
三角関数の基本関係式
単位円の定義から、以下の関係式が常に成り立ちます。これらは「覚える」ものではなく、「単位円から導ける」ものです。
これはピタゴラスの定理そのもの——単位円上の点の座標を とすると、。、 なので自動的に成り立ちます。「三平方の定理が変装しているだけ」と思えば納得できます。
これも上の を で割るだけで導けます——「式変形で生み出せるもの」です。
練習問題
- 、、 を求めよ。
- の値を求めよ。
- かつ のとき、 を求めよ。
解答
- 、、
- ( の恒等式)
- (第1象限で )
まとめ
- 単位円上の点 の座標が ——「横がcos、縦がsin」
- ——「縦÷横の比率」
- ——「ピタゴラスの定理の別の顔」
- 象限によって各三角関数の符号が決まる——「右半分でcosプラス、上半分でsinプラス」
次回は三角関数のグラフを学びます。sinやcosが描く「波形」は、音や光の現象を記述するための基本パターンになっています。