三维向量是指具有三个有序数值组成的向量,通常表示为$$ \mathbf{v} = \begin{bmatrix} x \ y \ z \end{bmatrix} $$。其中,$$x$$、$$y$$和$$z$$分别表示该向量在三个坐标轴上的分量。
在数学中,我们可以使用线性代数的概念来定义三维向量。一个三维向量可以被看作是三个标量的有序组合,这些标量分别表示在三个坐标轴上的投影。具体地,给定一个三维向量 $$\mathbf{v} = \begin{bmatrix} x \ y \ z \end{bmatrix}$$,我们可以定义它为:
其中,$$\mathbf{i}$$、$$\mathbf{j}$$和$$\mathbf{k}$$分别是三维空间中的标准基向量。它们的定义如下:
这样,三维向量
程序定义如下
#[derive(Debug)]
pub struct Vector3D {
pub x: f64,
pub y: f64,
pub z: f64,
}
三维向量的加法和减法遵循分量相加和相减的原则。考虑两个三维向量:
它们的加法定义为:
这就是将两个向量的相应分量相加得到的新向量。同样,两个向量的减法定义为:
这就是将两个向量的相应分量相减得到的新向量。
程序解如下
// 向量加法
pub fn add(&self, other: &Vector3D) -> Vector3D {
Vector3D {
x: self.x + other.x,
y: self.y + other.y,
z: self.z + other.z,
}
}
// 向量减法
pub fn subtract(&self, other: &Vector3D) -> Vector3D {
Vector3D {
x: self.x - other.x,
y: self.y - other.y,
z: self.z - other.z,
}
}
数量乘法是指将一个标量与一个向量的每个分量相乘的操作。给定一个标量
在这个操作中,标量
数量乘法的几何解释是对向量进行缩放或拉伸。如果
例如,如果有向量 $$\mathbf{v} = \begin{bmatrix} 2 \ 3 \ -1 \end{bmatrix}$$ 和标量
这表示将向量
程序解如下
// 数量乘法
pub fn scalar_multiply(&self, scalar: f64) -> Vector3D {
Vector3D {
x: self.x * scalar,
y: self.y * scalar,
z: self.z * scalar,
}
}
向量乘法中的叉积(cross product)是两个向量之间的一种特殊的乘法运算。给定两个三维向量 $$\mathbf{v}_1 = \begin{bmatrix} x_1 \ y_1 \ z_1 \end{bmatrix}$$ 和 $$\mathbf{v}_2 = \begin{bmatrix} x_2 \ y_2 \ z_2 \end{bmatrix}$$,它们的叉积
程序解如下
// 计算叉积
pub fn cross_product(&self, other: &Vector3D) -> Vector3D {
Vector3D {
x: self.y * other.z - self.z * other.y,
y: self.z * other.x - self.x * other.z,
z: self.x * other.y - self.y * other.x,
}
}
模长,也称为长度、幅值或矢量的大小,是指一个向量在空间中的长度。对于三维向量 $$\mathbf{v} = \begin{bmatrix} x \ y \ z \end{bmatrix}$$,它的模长计算公式为:
这个公式来源于三维空间中的勾股定理。模长表示从原点到向量终点的距离,或者说向量的大小。
程序解如下
// 计算模长
pub fn magnitude(&self) -> f64 {
(self.x.powi(2) + self.y.powi(2) + self.z.powi(2)).sqrt()
}
计算两个三维向量之间的夹角通常可以使用向量的点积(内积)和反余弦函数。假设有两个向量
其中,$$\cdot$$ 表示点积,$$ |\mathbf{v}| $$ 表示向量的模长。夹角
程序解如下
// 计算两个向量之间的夹角(弧度)
pub fn angle_between(&self, other: &Vector3D) -> f64 {
let dot_product = self.dot_product(other);
let magnitude_product = self.magnitude() * other.magnitude();
dot_product.acos() / magnitude_product
}