CC++ & Algorithm

Python中的三角函数:sin和cos

困难2
语言版本:C++Python
概述:学习使用math库中的sin和cos函数计算角度的正弦和余弦值,就像在游乐场里用滑梯的高度和秋千的水平距离来理解数学。

用Python玩转三角函数:sin和cos的奥秘

想象你站在一个巨大的摩天轮上。当摩天轮转动时,你的位置会有两个有趣的数据:你离地面的高度(就像 sin 函数),以及你离中心点的水平距离(就像 cos 函数)。在Python中,我们可以用 math.sinmath.cos 来计算这些值,它们能帮你解决很多和角度、位置有关的问题,比如做游戏、画动画、甚至模拟过山车的轨道。

1. 正弦和余弦到底是什么?

还是用摩天轮来说:

  • 假设摩天轮的半径是1(这样数字简单),你坐在一个座位上。
  • 当座位从最右端(3点钟方向)开始逆时针旋转,sin(角度) 就是你的 高度(从地面到座位中心的垂直距离),向上为正,向下为负。
  • cos(角度) 就是你的 水平距离(从摩天轮中心到你的水平偏移),向右为正,向左为负。

比如:

  • 0°时,你在最右边:高度 = 0(sin0=0),水平距离 = 1(cos0=1)。
  • 90°时,你在最顶部:高度 = 1(sin90=1),水平距离 = 0(cos90=0)。
  • 180°时,你在最左边:高度 = 0(sin180=0),水平距离 = -1(cos180=-1)。
  • 360°时,你回到起点,一切又回到0°的值。

这些值永远在-1到1之间,就像你永远不能离开摩天轮的边缘一样。

2. 为什么Python要用“弧度”而不是“度”?

你可能习惯用“度”(比如30°、90°),但Python的三角函数 math.sin()math.cos() 只接受 弧度 作为参数。
弧度是另一种测量角度的方法:一个完整的圆周是 2π 弧度(约6.283),而180°对应 π 弧度。类比温度:摄氏度和华氏度都能表示温度,但需要转换。同样,我们需要把“度”转换成“弧度”。

转换公式:

  • 弧度 = 度 × π / 180
  • 或者直接用 Python 提供的 math.radians(度数) 函数。

例如:

  • 30° = π/6 ≈ 0.5236 弧度
  • 45° = π/4 ≈ 0.7854 弧度
  • 60° = π/3 ≈ 1.0472 弧度
  • 90° = π/2 ≈ 1.5708 弧度

3. 如何用Python计算sin和cos?

先导入 math 库,然后用 math.radians() 转换角度,再调用 math.sin()math.cos()。下面是一个完整的例子,包含多个常用角度:

import math

# 定义一个带中文注释的列表,存放要测试的角度(度)
test_degrees = [0, 30, 45, 60, 90, 120, 180, 270, 360]

print("角度(度) | 弧度(近似) | 正弦(sin) | 余弦(cos)")
print("----------------------------------------------")

for deg in test_degrees:
    # 将度转换为弧度
    rad = math.radians(deg)
    # 计算正弦和余弦值,保留4位小数
    sin_val = math.sin(rad)
    cos_val = math.cos(rad)
    print(f"{deg:>6}° | {rad:>8.4f} | {sin_val:>8.4f} | {cos_val:>8.4f}")

运行结果会像这样(实际浮点数可能略有差异):

角度(度) | 弧度(近似) | 正弦(sin) | 余弦(cos)
----------------------------------------------
     0° |   0.0000 |   0.0000 |   1.0000
    30° |   0.5236 |   0.5000 |   0.8660
    45° |   0.7854 |   0.7071 |   0.7071
    60° |   1.0472 |   0.8660 |   0.5000
    90° |   1.5708 |   1.0000 |   0.0000
   120° |   2.0944 |   0.8660 |  -0.5000
   180° |   3.1416 |   0.0000 |  -1.0000
   270° |   4.7124 |  -1.0000 |  -0.0000
   360° |   6.2832 |  -0.0000 |   1.0000

注意:90°时 sin=1,cos=0;180°时 sin=0,cos=-1。这些规律可以帮你检查自己的计算是否正确。

4. 生活中的有趣应用

  • 游戏编程:如果你想在屏幕上画一个角色围绕中心旋转,可以用 x = center_x + radius * cos(角度)y = center_y + radius * sin(角度) 来获取角色位置。
  • 制作动画:利用sin值在-1到1之间来回变化,可以让小兔子上下跳动(高度 = sin(时间))。
  • 秋千与滑梯:sin代表你离地的高度(秋千荡到最高点时高度最大),cos代表你左右摆动的距离(从中心到两侧)。
  • 计算影子长度:如果太阳高度角是θ,一根1米高的杆子的影子长度是 1 / tan(θ),但tan可以由sin/cos得到。

5. 新手最容易犯的错误

  • 忘记导入 math 库:直接写 math.sin(30) 会报错 NameError,必须先写 import math
  • 直接用度数调用 sin 和 cos:比如 math.sin(30) 会把30当作弧度(也就是约1718.87°),结果很奇怪。一定要先用 math.radians() 转换。
  • 混淆角度和弧度:如果从别的代码里拿到一个弧度值,就不要再转换了;如果拿到度数,必须转换。
  • 浮点数精度问题:有时 math.sin(math.pi) 不会精确等于0,而是接近0的一个极小数字(如1.224e-16)。这是计算机浮点数运算的正常现象,可以用 round(值, 6) 来保留6位小数忽略误差。
  • 忘记返回值范围:sin和cos的结果永远在-1到1之间。如果程序里出现超过1的值,肯定是参数错了(比如忘了转换单位)。

6. 完整示例:模拟摩天轮上座舱的位置

下面的程序让用户输入一个角度(度),然后输出该角度对应的摩天轮上座舱的高度水平距离(假设摩天轮半径=100米,中心离地面50米)。

import math

# 用户输入角度(度),例如45
angle_deg = float(input("请输入摩天轮转过的角度(度):"))

# 将角度转换为弧度
angle_rad = math.radians(angle_deg)

# 摩天轮半径100米,中心距地面50米
radius = 100          # 半径
center_height = 50    # 中心离地面高度

# 计算座舱的相对位置(以半径为1时的值)
relative_height = math.sin(angle_rad)    # 相对高度(-1 ~ 1)
relative_horiz = math.cos(angle_rad)     # 相对水平距离(-1 ~ 1)

# 乘以半径得到实际偏移量
actual_height_offset = radius * relative_height  # 相对于中心的垂直偏移
actual_horiz_offset = radius * relative_horiz    # 相对于中心的水平偏移

# 座舱实际离地高度 = 中心高度 + 垂直偏移
cabin_height = center_height + actual_height_offset

# 座舱实际水平位置 = 中心水平位置(设为0) + 水平偏移
cabin_horiz = 0 + actual_horiz_offset

# 输出结果,保留2位小数
print(f"角度 {angle_deg:.2f}° 时:")
print(f"  座舱高度 {cabin_height:.2f} 米")
print(f"  座舱水平偏移 {cabin_horiz:.2f} 米")

如果输入30,输出:

角度 30.00° 时:
  座舱高度 100.00 米
  座舱水平偏移 86.60 米

(因为30°时,sin=0.5,cos≈0.866,半径100,所以高度=50+1000.5=100,水平偏移=1000.866=86.6)

7. 还想了解更多?

  • math.tan():计算正切,即 sin/cos。
  • math.asin, math.acos:反正弦、反余弦,从数值反推角度(返回值是弧度)。
  • math.degrees():把弧度转换成度,和 math.radians() 相反。
  • math.pi:圆周率π的精确值,方便直接使用。
  • 画圆与螺旋:结合 turtle 库或 pygame,用 sin/cos 绘制各种图形。

现在,你可以试着用 sin/cos 来做一个简单的“弹簧小人”动画,或者计算一个斜坡的高度和宽度。数学函数就像工具箱里的扳手,用熟了就能解决很多有趣的问题!

例题精讲

1单选题

在Python的math库中,math.sin()和math.cos()函数的参数单位是什么?

A角度
B弧度
C梯度
D任意单位
2单选题

执行以下代码,输出结果最接近哪个值?import math; print(math.cos(math.radians(60)))

A0.5
B0.8660254037844386
C1.0
D0.0
3判断题

在Python中,math.sin(math.pi / 2) 的结果等于0。

4填空题
以下代码计算30度的正弦值和60度的余弦值,请补充完整。import math
deg1 = 30
deg2 = 60
rad1 = ___(deg1)
rad2 = ___(deg2)
sin_val = math.sin(rad1)
cos_val = math.cos(rad2)
print(sin_val, cos_val)
5单选题

执行如下Python代码,输出结果是什么?import math; print(math.cos(math.pi))

A-1.0
B1.0
C0.0
D0.5