5.4.10 三角函数
三角函数将三角形中的角与其边长相关联。在有周期性质的公式中经常出现三角函数如谐波或圆周运动,在处理角时也会经常用到三角函数。标准库中所有三角函数的角参数都被表示为弧度。
给定一个直角三角形中的角,其正弦是对边长度与斜边长度之比(sinA=对边/斜边)。余弦是邻边长度与斜边长度之比(cosA=邻边/斜边)。正切对边与邻边之比(tanA=对边/邻边)。
import math
print('{:^7} {:^7} {:^7} {:^7} {:^7}'.format(
'Degrees','Radians','Sine','Cosine','Tangent'
))
print('{:-^7} {:-^7} {:-^7} {:-^7} {:-^7}'.format(
'-','-','-','-','-',
))
fmt = '{:7.2f} {:7.2f} {:7.2f} {:7.2f} {:7.2f}'
for deg in range(0,361,30):
rad = math.radians(deg)
if deg in (90,270):
t = float('inf')
else:
t = math.tan(rad)
print(fmt.format(deg,rad,math.sin(rad),math.cos(rad),t))
正切也可以被定义为角的正弦值预期余弦值之比,因为弧度π/2和3π/2的余弦是0,所以相应的正切值为无穷大。
运行结果:
给定一个点(x,y),点[{0,0},(x,0),(x,y)]构成三角形中斜边长度未(x2 + y2)** 1/2,可以用hypot()来计算。
import math
print('{:^7} {:^7} {:^10}'.format('X','Y','Hypotenuse'))
print('{:-^7} {:-^7} {:-^10}'.format('','',''))
POINTS = [
(1,1),
(-1,-1),
(math.sqrt(2),math.sqrt(2)),
(3,4), # 3-4-5 triangle
# On the circle
(math.sqrt(2) / 2 ,math.sqrt(2) / 2), # pi/4 rads
(0.5,math.sqrt(3) / 2), # pi/3 rads
]
for x,y in POINTS:
h = math.hypot(x,y)
print('{:7.2f} {:7.2f} {:7.2f}'.format(x,y,h))
对于圆上的点,其斜边总是等于1。
运行结果:
还可以用这个函数查看两个点之间的距离。
import math
print('{:^8} {:^8} {:^8} {:^8} {:^8}'.format(
'X1','Y1','X2','Y2','Distance',
))
print('{:-^8} {:-^8} {:-^8} {:-^8} {:-^8}'.format(
'','','','','',
))
POINTS = [
((5,5),(6,6)),
((-6,-6),(-5,-5)),
((0,0),(3,4)), # 3-4-5 triangle
((-1,-1),(2,3)), # 3-4-5 triangle
]
for (x1,y1),(x2,y2) in POINTS:
x = x1 - x2
y = y1 - y2
h = math.hypot(x,y)
print('{:8.2f} {:8.2f} {:8.2f} {:8.2f} {:8.2f}'.format(
x1,y1,x2,y2,h,
))
使用x值之差和y值之差将一个端点移至原点,然后将结果传入hypot()。
运行结果:
math还定义了反三角函数。
import math
for r in [0,0.5,1]:
print('arcsine({:1f}) = {:5.2f}'.format(r,math.asin(r)))
print('arccosine({:1f}) = {:5.2f}'.format(r,math.acos(r)))
print('arctangent({:1f}) = {:5.2f}'.format(r,math.atan(r)))
print()
1.57大约等于π/2,或90度,这个角的正弦为1,余弦为0。
运行结果: