根据三点坐标计算角度(python,三维坐标,向量法)
def cal_angle(point_a, point_b, point_c):"""https://zhidao.baidu.com/question/588244934.html设a,b是两个不为0的向量,它们的夹角为<a,b> (或用α ,β, θ ,..,字母表示)1、由向量公式:cos<a,b>=a.b/|a||b|.①2、若向量用坐标表示,a=(x1,y1,z
·
#!/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°
更多推荐
已为社区贡献1条内容
所有评论(0)