摩天轮座舱有多高,藏在角度里——sin 是「高度计」,cos 是「水平计」。
想象你在坐摩天轮。座舱从右侧起点出发,转过的角度叫 θ。不管轮子转多快,座舱的高度只由角度决定:它在圆心上方多少,是 sin θ × 轮半径;它离竖直中线多远,是 cos θ × 轮半径。数学上把这件事画成一个半径 = 1 的圆(单位圆):角度 θ 对应的点,高度 = sin θ,水平坐标 = cos θ。所以 sin / cos 就是把「角度」翻译成「坐标」的翻译官。
一圈角度有两种记法:角度制把一圈切成 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)
sin()/cos() 只认弧度!把 30 直接传进去,它当成「30 弧度」(约 1719°,转了 4 圈多),结果完全对不上。下一课子任务会专门演示这个坑。单位圆上,角度 θ 对应的点 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(浮点精度)
cos(PI/2) 在 C++ 里输出 6.123e-17 而不是 0——这是浮点精度的正常现象(π/2 存成小数本身就是近似值),不是 bug。需要判断「≈0」时,看它的绝对值是否小于 1e-6 之类的小阈值。// 坑 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° 躲着走」。写程序时把换算封装成一个函数,全程序统一调用,就不会忘。
cos(PI/2) 不是精确的 0(≈6.1e-17),1 除以一个极小的数 → 极大的数;C++ 浮点「除以 0」只有除数恰好是 0.0 时才产生 inf,这里差一点点,所以输出巨大数。③ sin(60 * PI / 180) 或 sin(PI / 3),结果 ≈ 0.866。
设轮半径 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 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 米(最低点)
if (abs(cos(th)) < 1e-9),是的话输出「几乎竖直」或跳过,不硬除。