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

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

参数:

返回: 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(v1v2|v1||v2|)

参数:

返回: 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

叉乘运算法则为:

v1×v2=(v1yv2zv1zv2y,v1zv2xv1xv2z,v1xv2yv1yv2x)

转换为行列式形式:

v1×v2=|ijkv1xv1yv1zv2xv2yv2z|

参数:

返回: 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

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

参数:

返回: 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

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

参数:

返回: 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

method project(self, other: Vector3) -> Vector3

说明: 计算自向量在另一个向量上的投影向量。

TIP

投影向量计算公式,projv(u)表示向量u在向量v上的投影向量:

projv(u)=uv|v|2v

参数:

返回: Vector3: 投影向量

源代码在GitHub上查看
python
def project(self, other: 'Vector3') -> 'Vector3':
    return self @ other / other.length * other.unit

@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

参数:

返回: 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 self == other

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

参数:

返回: 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

别去点那边实现了。

参数:

返回: 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

参数:

返回: 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

参数:

返回: 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。

参数:

返回: 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

说明: 点乘。

参数:

返回: 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)

文档由 VitePress 构建 | API引用由 litedoc 生成