manimgeo.components.vector.adapter 源代码
from __future__ import annotations
from pydantic import Field
from typing import cast
import numpy as np
from ...math import (
close,
unit_direction_vector,
)
from ..base import GeometryAdapter
from .args import *
[文档]
class VectorAdapter(GeometryAdapter[VectorConstructArgs]): # 继承 GeometryAdapter 并指定参数模型类型
vec: np.ndarray = Field(default=np.zeros(3), description="计算向量坐标", init=False)
norm: Number = Field(default=0.0, description="计算向量模长", init=False)
unit_direction: np.ndarray = Field(default=np.zeros(3), description="计算向量单位方向", init=False)
def __call__(self):
"""根据 self.args 执行具体计算"""
match self.construct_type:
case "PP":
args = cast(PPArgs, self.args)
self.vec = args.end.coord - args.start.coord
case "L":
args = cast(LArgs, self.args)
self.vec = args.line.end - args.line.start
case "N":
args = cast(NArgs, self.args)
self.vec = args.vec.copy()
case "NPP":
args = cast(NPPArgs, self.args)
self.vec = args.end - args.start
case "NNormDirection":
args = cast(NNormDirectionArgs, self.args)
self.vec = args.norm * unit_direction_vector(np.zeros_like(args.direction), args.direction)
case "AddVV":
args = cast(AddVVArgs, self.args)
self.vec = args.vec1.vec + args.vec2.vec
case "SubVV":
args = cast(SubVVArgs, self.args)
self.vec = args.vec1.vec - args.vec2.vec
case "MulNV":
args = cast(MulNVArgs, self.args)
self.vec = args.factor * args.vec.vec
case _:
raise NotImplementedError(f"Invalid constructing method: {self.construct_type}")
self.norm = float(np.linalg.norm(self.vec))
# 避免除以零
if not close(self.norm, 0):
self.unit_direction = self.vec / self.norm
else:
self.unit_direction = np.zeros(3)