python 实现三维向量之间的夹角

部署运行你感兴趣的模型镜像

原理:

设  m=(x_1,y_1,z_1), n=(x_2,y_2,z_2)

                                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        cos<m,n>=\frac{m*n}{\left | m \right |*\left | n \right |}

m*n = (x_1*x_2+y_1*y_2+z_1*z_2)

\left | m \right |=\sqrt{x_1^2+y_1^2+z_1^2}

\left | n \right |=\sqrt{x_2^2+y_2^2+z_2^2}

这里求出的两个夹角的取值范围为 [0, pi]。

代码

这里方便起见,计算n个3维向量与z坐标之间的夹角。代码如下

import numpy as np
    
normal1 = np.random.rand(5, 3)  # 创建5行3列取值范围为[0,1)的数组
normal2 = np.array([0, 0, 1]).reshape(1, -1)

data_M = np.sqrt(np.sum(normal1*normal1,axis=1))
data_N = np.sqrt(np.sum(normal2*normal2,axis=1))
cos_theta = np.sum(normal1 * normal2, axis=1)/(data_M*data_N)
theta = np.degrees(np.arccos(cos_theta))  # 角点b的夹角值

print(normal1)
print(theta)

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们已知有两个三维向量,计算它们之间夹角可以使用点积公式。两个向量a和b的点积定义为:a·b=|a||b|cosθ,其中θ是它们之间夹角。因此,cosθ=(a·b)/(|a||b|),然后通过反余弦函数得到角度(弧度),再转换为角度(如果需要)。步骤:1.计算两个向量的点积(dotproduct)2.分别计算两个向量的模(magnitude)3.计算夹角的余弦值:cosθ=点积/(模的乘积)4.使用反余弦函数得到弧度,然后转换为角度(可选)注意:需要避免除数为0(即其中一个向量是零向量)的情况。另外,在Lua中,我们可以使用math.acos来反余弦,math.sqrt平方根,math.deg将弧度转换为角度(或者直接使用弧度)。函数设计:输入:两个向量,例如:a={x1,y1,z1},b={x2,y2,z2}输出:夹角(弧度或角度)我们这里提供两个版本:一个返回弧度,一个返回角度(可选)。根据引用[2]中提到V-REP支持Lua,所以这个函数可以在V-REP环境中使用。编写函数如下:</think> 在 Lua 中计算两个三维向量夹角,可以通过向量点积公式实现,核心公式为: $$\cos\theta = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| \cdot |\vec{b}|}$$ 其中 $\theta$ 是夹角,$\vec{a} \cdot \vec{b}$ 是点积,$|\vec{a}|$ 和 $|\vec{b}|$ 是向量的模长。 ### 完整实现代码 ```lua function angleBetweenVectors(a, b) -- 计算点积 local dot = a.x * b.x + a.y * b.y + a.z * b.z -- 计算模长 local magA = math.sqrt(a.x^2 + a.y^2 + a.z^2) local magB = math.sqrt(b.x^2 + b.y^2 + b.z^2) -- 避免除零错误 if magA == 0 or magB == 0 then return 0 -- 零向量与任何向量夹角为0 end -- 计算夹角余弦值 local cosTheta = dot / (magA * magB) -- 处理浮点误差(确保值在[-1,1]范围内) cosTheta = math.max(-1, math.min(1, cosTheta)) -- 返回夹角(弧度) return math.acos(cosTheta) end -- 示例用法 local vec1 = {x=1, y=0, z=0} -- X轴单位向量 local vec2 = {x=0, y=1, z=0} -- Y轴单位向量 local angleRad = angleBetweenVectors(vec1, vec2) print("夹角(弧度): " .. angleRad) --> 约 1.5708 print("夹角(角度): " .. math.deg(angleRad) .. "°") --> 90° ``` ### 关键步骤说明: 1. **点积计算**: $\vec{a} \cdot \vec{b} = a_x b_x + a_y b_y + a_z b_z$ 2. **模长计算**: $|\vec{a}| = \sqrt{a_x^2 + a_y^2 + a_z^2}$ 3. **夹角推导**: 通过 $\theta = \arccos\left(\frac{\vec{a}\cdot\vec{b}}{|\vec{a}||\vec{b}|}\right)$ 得到弧度值 4. **异常处理**: - 零向量检测(模长为0时返回0) - 浮点误差修正(约束余弦值在[-1,1]区间) ### 实际应用场景 该算法可用于: 1. 机器人关节角度计算(如机械臂末端姿态控制)[^2] 2. 3D游戏中角色视线角度检测 3. 计算机视觉中的特征点方向分析[^1] --- ### 相关问题 1. Lua 中如何计算三维向量的叉积? 2. 如何处理向量计算中的浮点精度误差问题? 3. 在 V-REP 仿真环境中如何调用 Lua 向量计算函数?[^2] [^1]: Triangulate Points: Calculate the 3D position of features found in the left and right views using triangulation. [^2]: V-REP Robot simulator, 3D, source available, Lua scripting, APIs for C/C++, Python, Java, Matlab, URBI, 2 physics engines, full kinematic solver.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值