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