背景
基于人体/动物,骨骼点数据,计算关节角度
1. 原理
计算两个向量的夹角,我们已三个点为例,BA 向量和BC向量,求 B 的角度。若为四个点,延长交叉即可。
2. 效果
效果图如下
3. 核心代码
def compute_vector_angle(a, b, c):
"""
计算两个向量 ba 和 bc 向量的夹角
@params a , 点 a
@params b , 点 b
@params c , 点 c
"""
# 我这里为了好理解使用三个点数据,也可以用四个点
triangle_data = [a, b, c]
# 向量夹角
ba_angle = math.atan2(a[1] - b[1], a[0] - b[0]) * 180 / math.pi
bc_angle = math.atan2(c[1] - b[1], c[0] - b[0]) * 180 / math.pi
b_angle = 0
if ba_angle * bc_angle >= 0:
# 第1,4象限
b_angle = abs(ba_angle - bc_angle)
else:
# 第2,3象限
b_angle = abs(ba_angle) + abs(bc_angle)
if b_angle > 180:
b_angle = 360 - b_angle
print("\nba_angle:", ba_angle, "bc_angle:", bc_angle, "angle:", b_angle)
start_angle = ba_angle
end_angle = bc_angle
return start_angle, end_angle, b_angle, triangle_data
4. 可视化
图像可视化,坐标和圆的坐标系如下,
- 坐标系,相反
- 圆坐标系,逆时针,如图所示
5. 全部代码
实现 Python 代码,可直接执行,C++ 同理实现
#!/usr/bin/env python
# -