python math.acos反余弦问题

时间:2014-11-04 02:50:32

标签: python math cosine

我需要找到一个三角形的角度,平面上只有三个坐标点。在等式结束时的常规三角学中,我将使用:

cos = (a ** 2) - (b ** 2) - (c ** 2) / -2 * b * c

我使用**运算符来表示权力,而sideAsideBsideC是三角形边长。

我目前正在使用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

我做错了什么?当我从我的程序输入数字到我的计算器时,我得到了正确的角度。

2 个答案:

答案 0 :(得分:4)

您的问题是您的代码格式太差,您无法通过括号查看错误。

错误1

例如,这一行:

sideA = math.sqrt((x - mousex)**2)+((y - mousey)**2)

格式正确时,如下所示:

sideA = math.sqrt((x - mousex) ** 2) + ((y - mousey) ** 2)

当你删除多余的括号时,你可以更清楚地看到发生了什么:

sideA = math.sqrt((x - mousex) ** 2) + (y - mousey) ** 2

你只是将你身边的一个的正方形传递给math.sqrt(),然后只是将第二面的正方形加到它上面。它应该是:

sideA = math.sqrt((x - mousex) ** 2 + (y - mousey) ** 2)

甚至更好:

sideA = math.hypot(x - mousex, y - mousey)

错误2

然后这一行:

cos = float(sideA**2)-(sideB**2)-(sideC**2)/(-2*(sideB*sideC))

有一个类似的问题 - 你在前三个术语周围缺少括号,而你只是将C面的平方除以2bc。它应该是:

cos = (sideA ** 2 - sideB ** 2 - sideC ** 2) / ( -2 * sideB * sideC)

解决方案

由于上述原因,您无法正确计算余弦,因此您传递给math.acos()的内容超出了余弦的允许范围(余弦将永远存在)在-1 <= cos A <= 1)范围内,因此它会给您带来域名错误。在这里打印出你的价值观会让你看到一些非常奇怪的东西。

这是您的计划的固定版本和工作版本,修改后只为mousexmousey直接设置值:

#!/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))

输出:

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$ 

我已经冒昧地重新安排你的余弦规则计算,以消除否定分母的必要性。

答案 1 :(得分:0)

是的,math.acos是反余弦的正确函数。

您的错误在其他地方,但如果没有您输入的确切示例,我们无法为您提供帮助。什么行产生错误?错误信息是什么?