Rya*_*yan 1 python math trigonometry
我需要找到一个在平面上只有三个坐标点的三角形的角度。在等式末尾的规则三角学中,我将使用:
cos = (a ** 2) - (b ** 2) - (c ** 2) / -2 * b * c
Run Code Online (Sandbox Code Playgroud)
我使用**
,和的幂作为运算符sideA
,sideB
并且sideC
是三角形边的长度。
我目前正在使用math.acos()
该角度,但是遇到了数学域错误。是math.acos()
用什么我所理解的反余弦正确的功能?
这是我程序的代码摘录:
x = 100
y = 100
centerX = x + 50
centerY = y + 50
if event.type == MOUSEMOTION:
mousex, mousey = event.pos
sideA = math.sqrt((x - mousex)**2)+((y - mousey)**2)
sideB = math.sqrt((centerX - mousex)**2)+((centerY - mousey)**2)
sideC = math.sqrt((centerX - x)**2)+((centerY - y)**2)
cos = float(sideA**2)-(sideB**2)-(sideC**2)/(-2*(sideB*sideC))
angle = math.acos(cos)
print angle
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?当我将程序中的数字输入到计算器中时,我得到了正确的角度。
这里的问题是您的代码格式设置很差,看不到括号中的错误。
例如,这一行:
sideA = math.sqrt((x - mousex)**2)+((y - mousey)**2)
Run Code Online (Sandbox Code Playgroud)
正确格式化后,如下所示:
sideA = math.sqrt((x - mousex) ** 2) + ((y - mousey) ** 2)
Run Code Online (Sandbox Code Playgroud)
当您删除多余的括号时,您可以更清楚地看到正在发生的事情:
sideA = math.sqrt((x - mousex) ** 2) + (y - mousey) ** 2
Run Code Online (Sandbox Code Playgroud)
您只需将一侧的正方形传递到math.sqrt()
,然后将第二侧的正方形添加到其中。它应该是:
sideA = math.sqrt((x - mousex) ** 2 + (y - mousey) ** 2)
Run Code Online (Sandbox Code Playgroud)
甚至更好:
sideA = math.hypot(x - mousex, y - mousey)
Run Code Online (Sandbox Code Playgroud)
然后这行:
cos = float(sideA**2)-(sideB**2)-(sideC**2)/(-2*(sideB*sideC))
Run Code Online (Sandbox Code Playgroud)
有一个类似的问题-您在前三个术语周围缺少括号,并且只将C边的平方除以2bc。它应该是:
cos = (sideA ** 2 - sideB ** 2 - sideC ** 2) / ( -2 * sideB * sideC)
Run Code Online (Sandbox Code Playgroud)
由于上述原因,您无法正确计算余弦,因此传递给您的内容math.acos()
超出了余弦的允许范围(余弦将始终在范围内-1 <= cos A <= 1
),因此它为您提供了该域错误。在这里打印出您的价值观会帮助您看到一些真正奇怪的东西。
这是程序的固定且有效的版本,经过修改后可以直接为mousex
和设置值mousey
:
#!/usr/bin/env python
import math
x, y = 100, 100
centerX, centerY = x + 50, y + 50
mousex, mousey = 100,150
sideA = math.hypot(x - mousex, y - mousey);
sideB = math.hypot(centerX - mousex, centerY - mousey)
sideC = math.hypot(centerX - x, centerY - y)
cosA = (sideB ** 2 + sideC ** 2 - sideA ** 2) / (2 * sideB * sideC)
angle = math.acos(cosA)
print "sideA: %.2f, sideB: %.2f, sideC: %.2f" % (sideA, sideB, sideC)
print "cosA: %.6f" % (cosA)
print "angle: %.2f radians, %.2f degrees" % (angle, math.degrees(angle))
Run Code Online (Sandbox Code Playgroud)
输出:
paul@horus:~/src/sandbox$ ./angle.py
sideA: 50.00, sideB: 50.00, sideC: 70.71
cosA: 0.707107
angle: 0.79 radians, 45.00 degrees
paul@horus:~/src/sandbox$
Run Code Online (Sandbox Code Playgroud)
我采取了稍微重新排列余弦规则计算的自由,以消除否定分母的需要。