# mbcp.mp_math.vector | MBCP 文档
MBCP 粒子计算和生成库文档

Skip to content

# 模块 `mbcp.mp_math.vector` ​

本模块定义了3维向量的类Vector3，以及一些常用的向量。

### class `Vector3` ​

#### method `__init__(self, x: float, y: float, z: float)` ​

说明: 3维向量

参数:

> - x (`float`): x轴分量
> - y (`float`): y轴分量
> - z (`float`): z轴分量

源代码 或 在GitHub上查看
python

    def __init__(self, x: float, y: float, z: float):
        self.x = x
        self.y = y
        self.z = z

#### method `approx(self, other: Vector3, epsilon: float = APPROX) -> bool` ​

说明: 判断两个向量是否近似相等。

参数:

> - other (`Vector3`): 另一个向量
> - epsilon (`float`): 误差

返回: `bool`: 是否近似相等

源代码 或 在GitHub上查看
python

    def approx(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
        return all([abs(self.x - other.x) < epsilon, abs(self.y - other.y) < epsilon, abs(self.z - other.z) < epsilon])

#### method `cal_angle(self, other: Vector3) -> AnyAngle` ​

说明: 计算两个向量之间的夹角。

TIP

向量夹角计算公式:

θ=arccos⁡(v 1⋅v 2|v 1|⋅|v 2|)

参数:

> - other (`Vector3`): 另一个向量

返回: `AnyAngle`: 夹角

源代码 或 在GitHub上查看
python

    def cal_angle(self, other: 'Vector3') -> 'AnyAngle':
        return AnyAngle(math.acos(self @ other / (self.length * other.length)), is_radian=True)

#### method `cross(self, other: Vector3) -> Vector3` ​

说明: 向量积 叉乘：v1 x v2 -> v3

TIP

叉乘运算法则为:

v 1×v 2=(v 1 y⋅v 2 z−v 1 z⋅v 2 y,v 1 z⋅v 2 x−v 1 x⋅v 2 z,v 1 x⋅v 2 y−v 1 y⋅v 2 x)

转换为行列式形式:

v 1×v 2=|ijkv 1 xv 1 yv 1 zv 2 xv 2 yv 2 z|

参数:

> - other (`Vector3`): 另一个向量

返回: `Vector3`: 叉乘结果

源代码 或 在GitHub上查看
python

    def cross(self, other: 'Vector3') -> 'Vector3':
        return Vector3(self.y * other.z - self.z * other.y, self.z * other.x - self.x * other.z, self.x * other.y - self.y * other.x)

#### method `is_approx_parallel(self, other: Vector3, epsilon: float = APPROX) -> bool` ​

说明: 判断两个向量是否近似平行。

参数:

> - other (`Vector3`): 另一个向量
> - epsilon (`float`): 误差

返回: `bool`: 是否近似平行

源代码 或 在GitHub上查看
python

    def is_approx_parallel(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
        return self.cross(other).length < epsilon

#### method `is_parallel(self, other: Vector3) -> bool` ​

说明: 判断两个向量是否平行。

参数:

> - other (`Vector3`): 另一个向量

返回: `bool`: 是否平行

源代码 或 在GitHub上查看
python

    def is_parallel(self, other: 'Vector3') -> bool:
        return self.cross(other).approx(zero_vector3)

#### method `normalize(self)` ​

说明: 将向量归一化。

自体归一化，不返回值。

源代码 或 在GitHub上查看
python

    def normalize(self):
        length = self.length
        self.x /= length
        self.y /= length
        self.z /= length

`@property`

#### method `np_array(self) -> np.ndarray` ​

返回: `np.ndarray`: numpy数组

源代码 或 在GitHub上查看
python

    @property
    def np_array(self) -> 'np.ndarray':
        return np.array([self.x, self.y, self.z])

`@property`

#### method `length(self) -> float` ​

说明: 向量的模。

返回: `float`: 模

源代码 或 在GitHub上查看
python

    @property
    def length(self) -> float:
        return math.sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2)

`@property`

#### method `unit(self) -> Vector3` ​

说明: 获取该向量的单位向量。

返回: `Vector3`: 单位向量

源代码 或 在GitHub上查看
python

    @property
    def unit(self) -> 'Vector3':
        return self / self.length

#### method `__abs__(self)` ​

源代码 或 在GitHub上查看
python

    def __abs__(self):
        return self.length

`@overload`

#### method `self + other: Vector3 => Vector3` ​

源代码 或 在GitHub上查看
python

    @overload
    def __add__(self, other: 'Vector3') -> 'Vector3':
        ...

`@overload`

#### method `self + other: Point3 => Point3` ​

源代码 或 在GitHub上查看
python

    @overload
    def __add__(self, other: 'Point3') -> 'Point3':
        ...

#### method `self + other` ​

说明: V + P -> P

V + V -> V

参数:

> - other (`Vector3` | `Point3`): 另一个向量或点

返回: `Vector3` | `Point3`: 新的向量或点

源代码 或 在GitHub上查看
python

    def __add__(self, other):
        if isinstance(other, Vector3):
            return Vector3(self.x + other.x, self.y + other.y, self.z + other.z)
        elif isinstance(other, Point3):
            return Point3(self.x + other.x, self.y + other.y, self.z + other.z)
        else:
            raise TypeError(f"unsupported operand type(s) for +: 'Vector3' and '{type(other)}'")

#### method `__eq__(self, other)` ​

说明: 判断两个向量是否相等。

参数:

> - other (`Vector3`): 另一个向量

返回: `bool`: 是否相等

源代码 或 在GitHub上查看
python

    def __eq__(self, other):
        return approx(self.x, other.x) and approx(self.y, other.y) and approx(self.z, other.z)

#### method `self + other: Point3 => Point3` ​

说明: P + V -> P

别去点那边实现了。

参数:

> - other (`Point3`): 另一个点

返回: `Point3`: 新的点

源代码 或 在GitHub上查看
python

    def __radd__(self, other: 'Point3') -> 'Point3':
        return Point3(self.x + other.x, self.y + other.y, self.z + other.z)

`@overload`

#### method `self - other: Vector3 => Vector3` ​

源代码 或 在GitHub上查看
python

    @overload
    def __sub__(self, other: 'Vector3') -> 'Vector3':
        ...

`@overload`

#### method `self - other: Point3 => Point3` ​

源代码 或 在GitHub上查看
python

    @overload
    def __sub__(self, other: 'Point3') -> 'Point3':
        ...

#### method `self - other` ​

说明: V - P -> P

V - V -> V

参数:

> - other (`Vector3` | `Point3`): 另一个向量或点

返回: `Vector3` | `Point3`: 新的向量

源代码 或 在GitHub上查看
python

    def __sub__(self, other):
        if isinstance(other, Vector3):
            return Vector3(self.x - other.x, self.y - other.y, self.z - other.z)
        elif isinstance(other, Point3):
            return Point3(self.x - other.x, self.y - other.y, self.z - other.z)
        else:
            raise TypeError(f'unsupported operand type(s) for -: "Vector3" and "{type(other)}"')

#### method `self - other: Point3` ​

说明: P - V -> P

参数:

> - other (`Point3`): 另一个点

返回: `Point3`: 新的点

源代码 或 在GitHub上查看
python

    def __rsub__(self, other: 'Point3'):
        if isinstance(other, Point3):
            return Point3(other.x - self.x, other.y - self.y, other.z - self.z)
        else:
            raise TypeError(f"unsupported operand type(s) for -: '{type(other)}' and 'Vector3'")

`@overload`

#### method `self * other: Vector3 => Vector3` ​

源代码 或 在GitHub上查看
python

    @overload
    def __mul__(self, other: 'Vector3') -> 'Vector3':
        ...

`@overload`

#### method `self * other: RealNumber => Vector3` ​

源代码 或 在GitHub上查看
python

    @overload
    def __mul__(self, other: RealNumber) -> 'Vector3':
        ...

#### method `self * other: int | float | Vector3 => Vector3` ​

说明: 数组运算 非点乘。点乘使用@，叉乘使用cross。

参数:

> - other (`Vector3` | `float`): 另一个向量或数

返回: `Vector3`: 数组运算结果

源代码 或 在GitHub上查看
python

    def __mul__(self, other: 'int | float | Vector3') -> 'Vector3':
        if isinstance(other, Vector3):
            return Vector3(self.x * other.x, self.y * other.y, self.z * other.z)
        elif isinstance(other, (float, int)):
            return Vector3(self.x * other, self.y * other, self.z * other)
        else:
            raise TypeError(f"unsupported operand type(s) for *: 'Vector3' and '{type(other)}'")

#### method `self * other: RealNumber => Vector3` ​

源代码 或 在GitHub上查看
python

    def __rmul__(self, other: 'RealNumber') -> 'Vector3':
        return self.__mul__(other)

#### method `self @ other: Vector3 => RealNumber` ​

说明: 点乘。

参数:

> - other (`Vector3`): 另一个向量

返回: `float`: 点乘结果

源代码 或 在GitHub上查看
python

    def __matmul__(self, other: 'Vector3') -> 'RealNumber':
        return self.x * other.x + self.y * other.y + self.z * other.z

#### method `self / other: RealNumber => Vector3` ​

源代码 或 在GitHub上查看
python

    def __truediv__(self, other: RealNumber) -> 'Vector3':
        return Vector3(self.x / other, self.y / other, self.z / other)

#### method `- self => Vector3` ​

说明: 取负。

返回: `Vector3`: 负向量

源代码 或 在GitHub上查看
python

    def __neg__(self) -> 'Vector3':
        return Vector3(-self.x, -self.y, -self.z)

### var `zero_vector3` ​

- 说明: 零向量

- 类型: `Vector3`

- 默认值: `Vector3(0, 0, 0)`

### var `x_axis` ​

- 说明: x轴单位向量

- 类型: `Vector3`

- 默认值: `Vector3(1, 0, 0)`

### var `y_axis` ​

- 说明: y轴单位向量

- 类型: `Vector3`

- 默认值: `Vector3(0, 1, 0)`

### var `z_axis` ​

- 说明: z轴单位向量

- 类型: `Vector3`

- 默认值: `Vector3(0, 0, 1)`