根据三点坐标计算角度(python,三维坐标,向量法)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" @Time : 2021/8/10 9:16 @Author : Allen Pen(Haijun Peng) @E-mail : shengyutou@outlook.com NOTE: """
import math


def cal_angle(point_a, point_b, point_c):
    """ 根据三点坐标计算夹角 点a 点b ∠ 点c :param point_a、point_b、point_c: 数据类型为list,二维坐标形式[x、y]或三维坐标形式[x、y、z] :return: 返回角点b的夹角值 数学原理: 设m,n是两个不为0的向量,它们的夹角为<m,n> (或用α ,β, θ ,..,字母表示) 1、由向量公式:cos<m,n>=m.n/|m||n| 2、若向量用坐标表示,m=(x1,y1,z1), n=(x2,y2,z2), 则,m.n=(x1x2+y1y2+z1z2). |m|=√(x1^2+y1^2+z1^2), |n|=√(x2^2+y2^2+z2^2). 将这些代入②得到: cos<m,n>=(x1x2+y1y2+z1z2)/[√(x1^2+y1^2+z1^2)*√(x2^2+y2^2+z2^2)] 上述公式是以空间三维坐标给出的,令坐标中的z=0,则得平面向量的计算公式。 两个向量夹角的取值范围是:[0,π]. 夹角为锐角时,cosθ>0;夹角为钝角时,cosθ<0. """
    a_x, b_x, c_x = point_a[0], point_b[0], point_c[0]  # 点a、b、c的x坐标
    a_y, b_y, c_y = point_a[1], point_b[1], point_c[1]  # 点a、b、c的y坐标

    if len(point_a) == len(point_b) == len(point_c) == 3:
        # print("坐标点为3维坐标形式")
        a_z, b_z, c_z = point_a[2], point_b[2], point_c[2]  # 点a、b、c的z坐标
    else:
        a_z, b_z, c_z = 0,0,0  # 坐标点为2维坐标形式,z 坐标默认值设为0
        # print("坐标点为2维坐标形式,z 坐标默认值设为0")

    # 向量 m=(x1,y1,z1), n=(x2,y2,z2)
    x1,y1,z1 = (a_x-b_x),(a_y-b_y),(a_z-b_z)
    x2,y2,z2 = (c_x-b_x),(c_y-b_y),(c_z-b_z)

    # 两个向量的夹角,即角点b的夹角余弦值
    cos_b = (x1*x2 + y1*y2 + z1*z2) / (math.sqrt(x1**2 + y1**2 + z1**2) *(math.sqrt(x2**2 + y2**2 + z2**2))) # 角点b的夹角余弦值
    B = math.degrees(math.acos(cos_b)) # 角点b的夹角值
    return B

cal_angle((3**0.5,1), (0,0), (3**0.5,0))  # 结果为 30°
cal_angle((1,1), (0,0), (1,0))  # 结果为 45°
cal_angle((-1,1), (0,0), (1,0)) # 结果为 135°

    原文作者:shengyutou
    原文地址: https://blog.csdn.net/shengyutou/article/details/119670615
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞