🎡

三角函数:sin 与 cos

摩天轮座舱有多高,藏在角度里——sin 是「高度计」,cos 是「水平计」。

💡 打个比方

想象你在坐摩天轮。座舱从右侧起点出发,转过的角度叫 θ。不管轮子转多快,座舱的高度只由角度决定:它在圆心上方多少,是 sin θ × 轮半径;它离竖直中线多远,是 cos θ × 轮半径。数学上把这件事画成一个半径 = 1 的圆(单位圆):角度 θ 对应的点,高度 = sin θ,水平坐标 = cos θ。所以 sin / cos 就是把「角度」翻译成「坐标」的翻译官。

术语:角度制(一圈 = 360°);弧度制(一圈 = 2π,π ≈ 3.14159,π 弧度 = 180°);单位圆(圆心在原点、半径 = 1 的圆);sin θ(正弦,单位圆上 θ 对应点的 y 坐标,管「高」);cos θ(余弦,同一点的 x 坐标,管「横」);tan θ = sin θ / cos θ(正切,本课点到为止)。

🖼️ 大图看明白

左边:摩天轮——角度决定座舱位置 地面 座舱 水平 = R·cosθ 高出圆心 R·sinθ 圆心(高 R) θ 高度 = R + R·sinθ 右边:单位圆——sin 管高、cos 管横 水平(x) 高(y) 半径 = 1 cosθ = 0.707 sinθ = 0.707 θ 角度 θ 对应的点:高 = sinθ,横 = cosθ——角度变「坐标」

🧩 子任务 1:角度制与弧度制——两种「量角器」

🎯 小目标:会 360° ↔ 2π 的换算,知道 π 从哪来,记住「弧度 = 角度 × π ÷ 180」。

一圈角度有两种记法:角度制把一圈切成 360 份(1 份 = 1°);弧度制更「自然」——拿半径当尺子去量圆弧:弧长 = 半径 × 弧度数。单位圆半径 = 1,一圈弧长(周长)= 2π × 1 = 2π,所以一圈 = 2π 弧度。这就是 π 的来源:它本来就是「半圈弧长 ÷ 半径」。

// 换算公式(必须背下来,考试常考)
弧度 = 角度 × π ÷ 180
角度 = 弧度 × 180 ÷ π

// 手推对照表(常用角,π 保留符号)
  0°  = 0        90° = π/2  ≈ 1.5708
 30°  = π/6      180° = π   ≈ 3.1416
 45°  = π/4      270° = 3π/2 ≈ 4.7124
 60°  = π/3      360° = 2π  ≈ 6.2832

// C++ 里 π 没有现成全局变量,两种写法:
const double PI = acos(-1.0);        // 数学技巧:反余弦 -1 恰好是 π
const double PI = 3.14159265358979;  // 或者直接写常数(某些编译器有 M_PI)
✅ 小检查:① 270° 是多少弧度?② π/3 弧度是多少度?③ 为什么「一圈 = 2π」而不是「一圈 = 1」?
看看答案 ① 270° = 270×π/180 = 3π/2 ≈ 4.7124。② π/3 = 60°(360°÷6 的另一种记法)。③ 弧度用「弧长 ÷ 半径」定义:单位圆一圈弧长 = 周长 = 2π×半径 = 2π,所以一圈是 2π 弧度 ≈ 6.28 弧度,不是 1 弧度——1 弧度只是 57.3° 左右的一小段。
易错:C++ 的 sin()/cos() 只认弧度!把 30 直接传进去,它当成「30 弧度」(约 1719°,转了 4 圈多),结果完全对不上。下一课子任务会专门演示这个坑。

🧩 子任务 2:单位圆上读 sin / cos——高与横

🎯 小目标:看懂「sin = 高(y 坐标)、cos = 横(x 坐标)」,会背 0°/30°/45°/60°/90° 的特殊值。

单位圆上,角度 θ 对应的点 P:从 P 往水平轴垂直往下量到轴的距离就是 sin θ(高度),从原点到这个落点的水平距离就是 cos θ。θ 从 0° 转到 90°:sin 从 0 长到 1,cos 从 1 缩到 0,两个值始终「互补」——sin θ = cos(90° − θ)。

// 手推:特殊角查表(θ 在 0°~90° 内)
  角度 θ    sin θ     cos θ     记忆
  0°       0         1         点在 (1, 0):全在横轴
 30°       1/2       √3/2      sin30° = 0.5 最好记
 45°       √2/2      √2/2      高 = 横,≈ 0.7071
 60°       √3/2      1/2       sin60° = cos30°
 90°       1         0         点在 (0, 1):全在竖轴

// C++ 验证(注意:喂弧度!)
#include <cmath>
cout << sin(30 * PI / 180);   // 0.5  ✓
cout << cos(30 * PI / 180);   // 0.866… = √3/2  ✓
cout << cos(PI / 2);         // ≈ 6.12e-17,几乎 0(浮点精度)
✅ 小检查:① sin 60° + sin 30° = ?② cos 0° = ?sin 90° = ?③ 为什么 sin 30° 和 cos 60° 数值相同?
看看答案 ① √3/2 + 1/2 ≈ 1.366(别误以为 =1,它们不是互余角)。② cos 0° = 1,sin 90° = 1。③ 30° + 60° = 90° 是互余角,一个角的 sin 恰好等于它余角的 cos:sin 30° = cos 60° = 1/2。这就是「sin θ = cos(90°−θ)」。
易错:cos(PI/2) 在 C++ 里输出 6.123e-17 而不是 0——这是浮点精度的正常现象(π/2 存成小数本身就是近似值),不是 bug。需要判断「≈0」时,看它的绝对值是否小于 1e-6 之类的小阈值。

🧩 子任务 3:两个经典坑——喂错单位 & tan 90° 爆炸

🎯 小目标:看懂「sin(30) ≠ sin 30°」;理解 tan 90° 为什么是「除以 0」而爆成大数。
// 坑 1:直接喂角度(最常见的翻车现场)
sin(30);                    // ≈ -0.988 ← 这是 30「弧度」的 sin!
// 30 弧度 = 30 × 180/π ≈ 1718.9° = 转 4 圈 + 278.9°,所以是负数
sin(30 * PI / 180);         // = 0.5 ✓ 先换算再喂

// 坑 2:tan 90° 为什么「爆炸」
// tan θ = sin θ ÷ cos θ,θ = 90° 时 cos = 0 → 除以 0!
tan(PI / 2);                // ≈ 1.633e16 ← 天文数字,不是无穷大
// 原因:cos(PI/2) 实际是 6.12e-17(浮点近似,不精确为 0),
//       1 ÷ 6.12e-17 ≈ 1.6e16,「差点除以 0」→ 结果巨大

记忆口诀:「sin cos 吃弧度,角度先乘 π/180;tan 见 90° 躲着走」。写程序时把换算封装成一个函数,全程序统一调用,就不会忘。

✅ 小检查:① 程序输出 sin(90) ≈ 0.894,它其实是哪个角的正弦?② 为什么 C++ 里 tan(π/2) 是「巨大数」而不是「报错」?③ 写出 sin 60° 的正确代码。
看看答案 ① 是 90 弧度的正弦:90 rad = 90×180/π ≈ 5156.6° = 14 圈 + 278.9°,落在第四象限偏下,≈ 0.894。② 因为 cos(PI/2) 不是精确的 0(≈6.1e-17),1 除以一个极小的数 → 极大的数;C++ 浮点「除以 0」只有除数恰好是 0.0 时才产生 inf,这里差一点点,所以输出巨大数。③ sin(60 * PI / 180) 或 sin(PI / 3),结果 ≈ 0.866。

🧩 子任务 4:应用——摩天轮座舱高度计算器

🎯 小目标:把座舱高度写成 h = R + R·sin θ(圆心高度 + 高出圆心的部分),会手推。

设轮半径 R,圆心离地高度也是 R(轮子刚好贴地)。座舱高度 = 圆心高度 + 它高出圆心的部分 = R + R·sin θ。θ 绕一圈(0°→360°)时,座舱高度在 0 ~ 2R 之间起伏:θ=90°(顶点)= 2R 最高,θ=270°(底部)= 0 最低。sin θ 的「波浪」就藏在摩天轮的运动里。

// 手推:R = 20 米
  θ = 0°    sin = 0      h = 20 + 20×0   = 20 米(与圆心齐平)
  θ = 30°   sin = 0.5    h = 20 + 20×0.5 = 30 米
  θ = 90°   sin = 1      h = 20 + 20×1   = 40 米(顶点,2R)
  θ = 180°  sin = 0      h = 20 米(另一侧齐平)
  θ = 270°  sin = -1     h = 20 - 20     = 0 米(最低点)

// 水平距离(离竖直中线的距离)= R·cos θ:
  θ = 0°  x = 20×1 = 20 米(最右侧)
  θ = 90° x = 20×0 = 0   (正上方)
✅ 小检查:① R = 30 米,θ = 45°,座舱高度?② 座舱高度恰好 = 1.5R 时,θ 可能是多少?③ 若圆心离地 5 米(轮子悬空、半径 30 米),公式怎么改?最低点离地多高?
看看答案 ① h = 30 + 30×(√2/2) ≈ 30 + 21.21 = 51.21 米。② R + R·sinθ = 1.5R → sinθ = 0.5 → θ = 30° 或 150°(上升段和下降段各一次)。③ h = 5 + 30·sinθ;最低点(sinθ = −1)= 5 − 30 = ... 等等,若圆心高 5 米而半径 30 米,座舱会插进地里——实际题目会保证圆心高度 ≥ R,那时最低点 = 圆心高 − R。

💻 完整代码:摩天轮座舱高度计算器

// 输入:角度 θ(度)、轮半径 R(米)
// 输出:座舱高度、水平距离
// 示例:输入 30 20 → 座舱高度: 30.00 米 / 水平距离: 17.32 米
// 示例:输入 90 20 → 座舱高度: 40.00 米 / 水平距离: 0.00 米(顶点)
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main() {
    double deg, R;
    cin >> deg >> R;
    const double PI = acos(-1.0);        // π 的可靠取法
    double th = deg * PI / 180;          // 关键一步:度 → 弧度
    double h = R + R * sin(th);          // 高度 = 圆心高 R + R·sinθ
    double x = R * cos(th);              // 水平距离 = R·cosθ
    cout << fixed << setprecision(2);
    cout << "座舱高度: " << h << " 米" << endl;
    cout << "水平距离: " << x << " 米" << endl;
    return 0;
}
// 动手验证:输入 0 20 → 20.00 米;输入 270 20 → 0.00 米(最低点)

✋ 你来试试

第 1 题:把 135° 换算成弧度(用 π 表示)。sin 135° 等于多少?(提示:135° = 180° − 45°,第二象限的点「高度」和 45° 的点一样高) 135° = 135×π/180 = 3π/4。sin 135° = sin 45° = √2/2 ≈ 0.7071:单位圆上 135° 的点在左上方,它的高度与 45° 的点相同,只是水平方向变成负的(cos 135° = −√2/2)。
第 2 题:摩天轮半径 R = 25 米、圆心离地 25 米(轮子贴地)。座舱转到 θ = 60° 时,高度是多少? h = 25 + 25×sin 60° = 25 + 25×(√3/2) ≈ 25 + 21.65 = 46.65 米。
第 3 题:程序输出 sin(x) = −0.5。在 0°~360° 范围内,x 最小是多少度?(提示:sin 是「高度」,什么时候高度是负的?) sin 为负 ⟺ 点在水平轴下方(第三、四象限)。高度 = −0.5 对应 30° 的「镜像」:x = 360° − 30° = 330°(0~360° 内唯一解)。
第 4 题(加餐):为什么特殊角表里不敢列 tan 90°?如果写个程序对每个角度算「坡度」= sinθ ÷ cosθ,θ 接近 90° 时会发生什么?怎么保护? tan 90° = sin90° ÷ cos90° = 1 ÷ 0,除以 0 无定义。θ→90° 时 cosθ→0,商越算越大,最后「爆炸」成 1e16 量级。保护:除之前检查 if (abs(cos(th)) < 1e-9),是的话输出「几乎竖直」或跳过,不硬除。
🎯 一句话记住:sin = 高(y 坐标)、cos = 横(x 坐标);喂给 sin/cos 的角度必须先换算成弧度(×π/180);tan θ = sin θ ÷ cos θ,90° 时「爆炸」;摩天轮座舱高度 = R + R·sinθ。