目次
「数学って、社会で何の役に立つの?」そんな声をよく耳にします。でも、実は高校で習う三角関数は、社会の様々な場面で活躍しています。
tan関数
たとえば、測量の世界ではその力が発揮されます。ある木の高さを直接測れないときでも、三角関数を使えば簡単に計算できるのです。
例題2-14-1
木からの距離が a メートル、木のてっぺんを見上げたときの角度が θ 度だった場合、
次の式で高さ h を求められます:h = a × tan(θ)
角度はラジアンに変換する必要があります(JavaScriptの Math.tan はラジアン角を使うため)。

次のコードを実行して木の高さを計算してみよう。
function setup() {
const a = 20; // 木までの距離 (m)
const t = 32; // 角度 (度)
// 角度をラジアンに変換
const t_rad = (t * Math.PI) / 180;
// 高さを計算 (tan を使用)
const h = Math.tan(t_rad) * a;
console.log(`木の高さ: ${h.toFixed(2)} m`);
}📌 三角関数を使った別の活用事例
sin関数・cos関数
ゲームのキャラクターが円を描くように動いたり、時計の針を回したり、視点を回転させたりするときにも、三角関数は欠かせません。
特に sin や cos は 円運動の表現に不可欠です。
三角関数を使えば、中心が原点(0,0)、半径 r の円周上で、角度 θ の位置にある点の (x, y) 座標を以下のように求められます:

例題2-14-2 〜 練習問題
sin関数・cos関数を使って正5角形を描いてみましょう。
先ほどの木の高さを求めるときに使ったtan関数と同様に三角関数で指定する角度はラジアン(弧度法)である必要がありますが、人間には分かりづらいです。また、いちいち角度をラジアンに変換するのは面倒です。そこでangleMode(DEGREES)を使うことによって、三角関数をラジアン(弧度法ではなく、馴染みのある度数法で指定することができるようになります。下記の例題で確認してみて下さい。
function setup() {
createCanvas(400, 400);
background(255);
translate(width / 2, height / 2);
scale(1, -1);
noStroke();
fill(255, 200, 200);
angleMode(DEGREES);
const r = 80;
// 正5角形を描く
let x;
let y;
let angle;
angle = 0;
x = r * cos(angle);
y = r * sin(angle);
circle(x, y, 10);
angle = 72;
x = R * cos(angle);
y = R * sin(angle);
circle(x, y, 10);
// 残りの3点を自分で描いてみよう!
}練習問題2-14-2a
上記の正5角形を描くプログラムをfor文を使って短くまとめなさい。
練習問題2-14-2b

青の円の円周上の点を中心に同じ半径の黒の円を描く。
これを角度をずらしながら、円周上を一周する。
すると次のような図形が描ける。

【問題】
円の円周上の点を中心に同じ大きさの円を描きながら、円周を一周するプログラムを作成してください。
下記のひな型をコピーして作り始めなさい。なお、原点はキャンバスの中央に移動されています。
【条件】
- 半径80 の円周上に 36個 の点を取り、それぞれの点を中心に半径 80 の円を描く。
- 座標計算には三角関数 cos, sin を使用すること。
- 円は枠線のみ(塗りつぶしなし)で描くこと。
function setup() {
createCanvas(400, 400);
background(220);
// 原点をキャンバスの中央に移動
translate(width / 2, height / 2);
// Y軸を反転(上がプラス、下がマイナスになる)
scale(1, -1);
// 度数法を使用
// 円を描く
}練習問題2-14-2c
円周上で 120°の角度を成す2点を直線で結ぶ。始点 x1,y1 の円周上の位置は 5°ずつ反時計方向に回転させてできる 図形を描きなさい。円の半径は150とする。

この表の結果から、グラフ表示する場合のx座標とy座標の範囲を考えなさい。キャンバスのサイ ズは 400×400 とする。
結果

例題2-14-3
円周上を16分割した各点を総当たりで結ぶ。このとき描かれる図形をダイアモンドリングと呼ぶ。総当たりといっても、すでに描いた直線は引かないので、最初のくり返しで15本、次のくり返しで14本・・・と一本ずつ少なくなる。

次のコードを実行してどのような図形が描かれるか、確認ししてみよう。
コード
function setup() {
createCanvas(400, 400);
background(220);
// 原点をキャンバスの中央に移動
translate(width / 2, height / 2);
// Y軸を反転(上がプラス、下がマイナスになる)
scale(1, -1);
// 度数法を使用
angleMode(DEGREES);
// 分割数
const N = 16;
// 円の半径
const radius = 150;
for (let i = 0; i < N; i++) {
let x1 = radius * cos(i * 360 / N);
let y1 = radius * sin(i * 360 / N);
for (let j = i + 1; j < N; j++) {
let x2 = radius * cos(j * 360 / N);
let y2 = radius * sin(j * 360 / N);
line(x1, y1, x2, y2);
}
}
}結果

練習問題2-14-3
例題のプログラムを改造して、カラフルにしたり、自由にアート作品を作りなさい。完成したら、先生にスクショをSlackで送りなさい。