RuntimeWarning: invalid value encountered in arccos

 出错代码位置

np.arccos(cos_value) * (180 / np.pi)
    def get_cross_angle(l1, l2):
        arr_a = np.array([(l1.p2.x - l1.p1.x), (l1.p2.y - l1.p1.y)])  # 向量a
        arr_b = np.array([(l2.p2.x - l2.p1.x), (l2.p2.y - l2.p1.y)])  # 向量b
        cos_value = (float(arr_a.dot(arr_b)) / (np.sqrt(arr_a.dot(arr_a)) * np.sqrt(arr_b.dot(arr_b))))  # 注意转成浮点数运算
        print(cos_value > 1)
        print(cos_value)
        return np.arccos(cos_value) * (180 / np.pi)  # 两个向量的夹角的角度, 余弦值:cos_value, np.cos(para), 其中para是弧度,不是角度

出错原因:cos_value值大于1,但是cos_value值只能是[-1, 1]之间。

调试方法

print(cos_value > 1)
print(cos_value)

输出:True,1.0;原因可能是print会将无限接近1的值,置值1.

修正代码

    def get_cross_angle(l1, l2):
        arr_a = np.array([(l1.p2.x - l1.p1.x), (l1.p2.y - l1.p1.y)])  # 向量a
        arr_b = np.array([(l2.p2.x - l2.p1.x), (l2.p2.y - l2.p1.y)])  # 向量b
        cos_value = (float(arr_a.dot(arr_b)) / (np.sqrt(arr_a.dot(arr_a)) * np.sqrt(arr_b.dot(arr_b))))  # 注意转成浮点数运算
        eps = 1e-6
        if 1.0 < cos_value < 1.0 + eps:
            cos_value = 1.0
        elif -1.0 - eps < cos_value < -1.0:
            cos_value = -1.0
        return np.arccos(cos_value) * (180 / np.pi)  # 两个向量的夹角的角度, 余弦值:cos_value, np.cos(para), 其中para是弧度,不是角度

 


版权声明:本文为jizhidexiaoming原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。