1.ERROR
项目里出错的截图找不到了,就用一个示例吧。
如上,arccos里面的数应该是[-1, 1],理论上来说,三个点组成的三角形计算的话都应该符合这个条件,即使是三个点跑到一条直线上了。
但是,有时候你还会在实际项目中碰到这种情况,那是为什么呢?
2.分析
在实际中,比如视觉方向,一张图像中你检测出的各个点可能在任意一个位置,即便在任意一个位置你的代码也应该能够正常运行。就是因为位置太任意,导致下面的公式计算出来可能不是一个有理数,这样一来,势必在要进行约去或者进位或者说在计算机上转化为二进制的时候转化的不是原数(这方面我也不是很清楚)。这样一来就造成了该值大于1或者小于-1(虽然只是大了很小很小一点点),进而出现超出函数定义域的情况。
这种情况可能很难想到,因为理论上不会出现这种情况的,但在实际中,任何情况都有可能发生。
3.解决
def norm(x):
if x < -1:
return -1
elif x > 1:
return 1
else:
return x
cos_A = norm((length_b ** 2 + length_c ** 2 - length_a ** 2) / (2 * length_b * length_c))
cos_B = norm((length_a ** 2 + length_c ** 2 - length_b ** 2) / (2 * length_a * length_c))
cos_C = norm((length_a ** 2 + length_b ** 2 - length_c ** 2) / (2 * length_a * length_b))
print(cos_A, cos_B, cos_C)
angle_A = (math.acos(cos_A)) / pi * 180
angle_B = (math.acos(cos_B)) / pi * 180
angle_C = (math.acos(cos_C)) / pi * 180