manimgeo.components.angle.adapter 源代码
from __future__ import annotations
from pydantic import Field
from typing import Literal, cast
import numpy as np
from ...math import (
angle_3p_countclockwise as angle_3p_ccw,
)
from ..base import GeometryAdapter
from .args import *
[文档]
class AngleAdapter(GeometryAdapter[AngleConstructArgs]): # 继承 GeometryAdapter 并指定参数模型类型
angle: Number = Field(default=0.0, description="计算角度", init=False)
turn: Literal["Clockwise", "Counterclockwise"] = Field(default="Counterclockwise", description="角度计算方向", init=False)
def __call__(self):
"""根据 self.args 执行具体计算"""
match self.construct_type:
case "PPP":
args = cast(PPPArgs, self.args)
self.angle = angle_3p_ccw(args.start.coord, args.center.coord, args.end.coord)
self.turn = "Counterclockwise"
case "LL":
args = cast(LLArgs, self.args)
if not np.allclose(args.line1.start, args.line2.start):
raise ValueError("无法从起始点不等的两条线构造角")
self.angle = angle_3p_ccw(args.line1.end, args.line1.start, args.line2.end)
self.turn = "Counterclockwise"
case "LP":
args = cast(LPArgs, self.args)
self.angle = angle_3p_ccw(args.line.end, args.line.start, args.point.coord)
self.turn = "Counterclockwise"
case "N":
args = cast(NArgs, self.args)
if args.turn not in ["Clockwise", "Counterclockwise"]:
raise ValueError("角度方向必须为 'Clockwise' 或 'Counterclockwise'")
self.angle = args.angle
self.turn = args.turn
case "TurnA":
args = cast(TurnAArgs, self.args)
self.angle = 2 * np.pi - args.angle.angle
self.turn = "Counterclockwise" if args.angle.turn == "Clockwise" else "Clockwise"
case "AddAA":
args = cast(AddAAArgs, self.args)
an0 = args.angle1.angle if args.angle1.turn == "Counterclockwise" else 2 * np.pi - args.angle1.angle
an1 = args.angle2.angle if args.angle2.turn == "Counterclockwise" else 2 * np.pi - args.angle2.angle
self.angle = (an0 + an1) % (2 * np.pi)
self.turn = "Counterclockwise"
case "SubAA":
args = cast(SubAAArgs, self.args)
an0 = args.angle1.angle if args.angle1.turn == "Counterclockwise" else 2 * np.pi - args.angle1.angle
an1 = args.angle2.angle if args.angle2.turn == "Counterclockwise" else 2 * np.pi - args.angle2.angle
self.angle = (an0 - an1) % (2 * np.pi)
self.turn = "Counterclockwise"
case "MulNA":
args = cast(MulNAArgs, self.args)
self.angle = (args.factor * args.angle.angle) % (2 * np.pi)
self.turn = args.angle.turn
case _:
raise NotImplementedError(f"Invalid constructing method: {self.construct_type}")