rs-math

为了学好Rust也是拼了系列-数学库-二维向量

二维向量是数学中的一个重要概念,通常用两个实数表示。一个二维向量可以写成 \(\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}\),其中 \(v_1\) 和 \(v_2\) 是实数,分别表示向量在 x 轴和 y 轴上的分量。

二维向量可以用来表示平面上的点,其中 \(v_1\) 表示 x 坐标,\(v_2\) 表示 y 坐标。这样,一个点的位置可以由一个二维向量来描述。

Rust程序定义

pub struct Vector2D {
    pub x: f64,
    pub y: f64,
}

加减法

数学中的向量加法和减法是按照分量进行的。假设有两个二维向量:

\(\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}\) 和 \(\mathbf{u} = \begin{bmatrix} u_1 \\ u_2 \end{bmatrix}\)

  1. 向量加法: \(\mathbf{v} + \mathbf{u} = \begin{bmatrix} v_1 + u_1 \\ v_2 + u_2 \end{bmatrix}\)

    这表示将两个向量的对应分量相加,得到一个新的向量。

  2. 向量减法: \(\mathbf{v} - \mathbf{u} = \begin{bmatrix} v_1 - u_1 \\ v_2 - u_2 \end{bmatrix}\)

程序解如下

// 向量加法
pub fn add(self, other: Vector2D) -> Vector2D {
    Vector2D { x: self.x + other.x, y: self.y + other.y }
}

// 向量减法
pub fn subtract(self, other: Vector2D) -> Vector2D {
    Vector2D { x: self.x - other.x, y: self.y - other.y }
}

二维向量点积(内积)

假设有两个二维向量:

\(\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}\) 和 \(\mathbf{u} = \begin{bmatrix} u_1 \\ u_2 \end{bmatrix}\)

它们的点积(内积)定义为:

\[\mathbf{v} \cdot \mathbf{u} = v_1 \cdot u_1 + v_2 \cdot u_2\]

点积的几何意义包括计算一个向量在另一个向量方向上的投影。

程序解如下

pub fn dot_product(self, other: Vector2D) -> f64 {
    self.x * other.x + self.y * other.y
}

二维向量叉积(外积)

在二维空间中,叉积并没有直接的定义,因为它主要用于三维向量。对于二维向量 \(\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}\) 和 \(\mathbf{u} = \begin{bmatrix} u_1 \\ u_2 \end{bmatrix}\),它们的”叉积”可以通过以下公式表示:

\[\mathbf{v} \times \mathbf{u} = v_1 \cdot u_2 - v_2 \cdot u_1\]

在这个情况下,它的结果是一个标量而不是一个向量,这代表了两个向量所在平面的有向面积。这个值可以用来判断两个向量的相对方向(顺时针还是逆时针)和计算面积。

请注意,在二维空间中,叉积的应用相对有限,主要因为它返回一个标量而不是一个向量。在三维空间中,叉积更加常见,因为它返回垂直于原始两个向量所在平面的向量。

程序解如下

// 向量叉积
pub fn cross_product(self, other: Vector2D) -> f64 {
    self.x * other.y - self.y * other.x
}