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)

### 使用 NumPy 和 SciPy 处理三维向量 对于三维向量的操作,在 Python 中通常借助于 `NumPy` 库,因为该库提供了高效的数组操作接口[^2]。 #### 创建三维向量 创建一个简单的三维向量可以通过定义一维数组来完成: ```python import numpy as np vector_3d = np.array([1, 2, 3]) print(vector_3d) ``` #### 向量的加减乘除运算 执行基本的四则运算是通过直接对两个相同形状的数组应用相应的算术运算符实现的: ```python vector_a = np.array([1, 2, 3]) vector_b = np.array([4, 5, 6]) addition_result = vector_a + vector_b subtraction_result = vector_a - vector_b multiplication_result = vector_a * vector_b division_result = vector_a / vector_b.astype(float) print(f"Addition: {addition_result}") print(f"Subtraction: {subtraction_result}") print(f"Multiplication: {multiplication_result}") print(f"Division: {division_result}") ``` #### 计算模长(范数) 为了向量的长度或大小,即其欧几里得距离,可以利用 `np.linalg.norm()` 函数: ```python magnitude = np.linalg.norm(vector_3d) print(magnitude) ``` #### 单位化向量 单位化意味着保持方向不变的情况下使向量具有单位长度。这可通过将原向量除以其自身的模长得到: ```python unit_vector = vector_3d / magnitude print(unit_vector) ``` #### 点积与叉积 点积反映了两向量之间夹角余弦值;而叉积则是用来获取垂直于这两个输入向量的新向量: ```python dot_product = np.dot(vector_a, vector_b) cross_product = np.cross(vector_a, vector_b) print(f"Dot Product: {dot_product}") print(f"Cross Product: {cross_product}") ``` 上述例子展示了如何使用 `NumPy` 来高效地处理三维空间内的各种向量运算。当涉及到更复杂的几何变换或其他类型的数学建模时,则可能需要用到 `SciPy` 提供的一些额外功能[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值