# mbcp.mp_math.vector | MBCP 文檔
MBCP 粒子計算和生成庫文檔

Skip to content

# mbcp.mp_math.vector ​

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

### class `Vector3` ​

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

説明: 3维向量

變數説明:

> - x: x轴分量
> - y: y轴分量
> - z: z轴分量

源碼 或 於GitHub上查看
python

    def __init__(self, x: float, y: float, z: float):
        """
            3维向量
            Args:
                x: x轴分量
                y: y轴分量
                z: z轴分量
            """
        self.x = x
        self.y = y
        self.z = z

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

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

變數説明:

> - other:
> - epsilon:

返回: 是否近似相等

源碼 或 於GitHub上查看
python

    def approx(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
        """
            判断两个向量是否近似相等。
            Args:
                other:
                epsilon:

            Returns:
                是否近似相等
            """
        return all([abs(self.x - other.x) < epsilon, abs(self.y - other.y) < epsilon, abs(self.z - other.z) < epsilon])

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

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

變數説明:

> - other: 另一个向量

返回: 夹角

源碼 或 於GitHub上查看
python

    def cal_angle(self, other: 'Vector3') -> 'AnyAngle':
        """
            计算两个向量之间的夹角。
            Args:
                other: 另一个向量
            Returns:
                夹角
            """
        return AnyAngle(math.acos(self @ other / (self.length * other.length)), is_radian=True)

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

説明: 向量积 叉乘：v1 cross v2 -> v3

叉乘为0，则两向量平行。 其余结果的模为平行四边形的面积。

變數説明:

> - other:

返回: 行列式的结果

源碼 或 於GitHub上查看
python

    def cross(self, other: 'Vector3') -> 'Vector3':
        """
            向量积 叉乘：v1 cross v2 -> v3

            叉乘为0，则两向量平行。
            其余结果的模为平行四边形的面积。

            返回如下行列式的结果：

            ``i  j  k``

            ``x1 y1 z1``

            ``x2 y2 z2``

            Args:
                other:
            Returns:
                行列式的结果
            """
        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)

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

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

變數説明:

> - other: 另一个向量
> - epsilon: 允许的误差

返回: 是否近似平行

源碼 或 於GitHub上查看
python

    def is_approx_parallel(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
        """
            判断两个向量是否近似平行。
            Args:
                other: 另一个向量
                epsilon: 允许的误差
            Returns:
                是否近似平行
            """
        return self.cross(other).length < epsilon

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

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

變數説明:

> - other: 另一个向量

返回: 是否平行

源碼 或 於GitHub上查看
python

    def is_parallel(self, other: 'Vector3') -> bool:
        """
            判断两个向量是否平行。
            Args:
                other: 另一个向量
            Returns:
                是否平行
            """
        return self.cross(other).approx(zero_vector3)

#### def `normalize(self)` ​

説明: 将向量归一化。

自体归一化，不返回值。

源碼 或 於GitHub上查看
python

    def normalize(self):
        """
            将向量归一化。

            自体归一化，不返回值。
            """
        length = self.length
        self.x /= length
        self.y /= length
        self.z /= length

`@property`

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

源碼 或 於GitHub上查看
python

    @property
    def np_array(self) -> 'np.ndarray':
        """
            返回numpy数组
            Returns:
            """
        return np.array([self.x, self.y, self.z])

`@property`

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

説明: 向量的模。

返回: 模

源碼 或 於GitHub上查看
python

    @property
    def length(self) -> float:
        """
            向量的模。
            Returns:
                模
            """
        return math.sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2)

`@property`

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

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

返回: 单位向量

源碼 或 於GitHub上查看
python

    @property
    def unit(self) -> 'Vector3':
        """
            获取该向量的单位向量。
            Returns:
                单位向量
            """
        return self / self.length

#### def `__abs__(self)` ​

源碼 或 於GitHub上查看
python

    def __abs__(self):
        return self.length

`@overload`

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

源碼 或 於GitHub上查看
python

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

`@overload`

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

源碼 或 於GitHub上查看
python

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

#### def `self + other` ​

説明: V + P -> P

V + V -> V

變數説明:

> - other:

源碼 或 於GitHub上查看
python

    def __add__(self, other):
        """
            V + P -> P

            V + V -> V
            Args:
                other:
            Returns:

            """
        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)}'")

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

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

變數説明:

> - other:

返回: 是否相等

源碼 或 於GitHub上查看
python

    def __eq__(self, other):
        """
            判断两个向量是否相等。
            Args:
                other:
            Returns:
                是否相等
            """
        return approx(self.x, other.x) and approx(self.y, other.y) and approx(self.z, other.z)

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

説明: P + V -> P

别去点那边实现了。 :param other: :return:

源碼 或 於GitHub上查看
python

    def __radd__(self, other: 'Point3') -> 'Point3':
        """
            P + V -> P

            别去点那边实现了。
            :param other:
            :return:
            """
        return Point3(self.x + other.x, self.y + other.y, self.z + other.z)

`@overload`

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

源碼 或 於GitHub上查看
python

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

`@overload`

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

源碼 或 於GitHub上查看
python

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

#### def `self - other` ​

説明: V - P -> P

V - V -> V

變數説明:

> - other:

源碼 或 於GitHub上查看
python

    def __sub__(self, other):
        """
            V - P -> P

            V - V -> V
            Args:
                other:
            Returns:
            """
        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)}"')

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

説明: P - V -> P

變數説明:

> - other:

源碼 或 於GitHub上查看
python

    def __rsub__(self, other: 'Point3'):
        """
            P - V -> P
            Args:
                other:
            Returns:

            """
        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`

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

源碼 或 於GitHub上查看
python

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

`@overload`

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

源碼 或 於GitHub上查看
python

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

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

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

變數説明:

> - other:

源碼 或 於GitHub上查看
python

    def __mul__(self, other: 'int | float | Vector3') -> 'Vector3':
        """
            数组运算 非点乘。点乘使用@，叉乘使用cross。
            Args:
                other:

            Returns:
            """
        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)}'")

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

源碼 或 於GitHub上查看
python

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

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

説明: 点乘。

變數説明:

> - other:

源碼 或 於GitHub上查看
python

    def __matmul__(self, other: 'Vector3') -> 'RealNumber':
        """
            点乘。
            Args:
                other:
            Returns:
            """
        return self.x * other.x + self.y * other.y + self.z * other.z

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

源碼 或 於GitHub上查看
python

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

#### def `- self` ​

源碼 或 於GitHub上查看
python

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

### var `zero_vector3` = `Vector3(0, 0, 0)` ​

- 類型: `Vector3`

- 説明: 零向量

### var `x_axis` = `Vector3(1, 0, 0)` ​

- 類型: `Vector3`

- 説明: x轴单位向量

### var `y_axis` = `Vector3(0, 1, 0)` ​

- 類型: `Vector3`

- 説明: y轴单位向量

### var `z_axis` = `Vector3(0, 0, 1)` ​

- 類型: `Vector3`

- 説明: z轴单位向量