import math from LinearAlgebra.Angle import Angle class Direction: def __init__(self, horizontal=0, vertical=0): self.horizontal: float = Angle.Normalize(horizontal) self.vertical: float = Angle.Normalize(vertical) self.Normalize() @staticmethod def Degrees(horizontal: float, vertical: float): direction = Direction (horizontal, vertical) return direction def __add__(self, other): return Direction(self.horizontal + other.x, self.vertical + other.y) def __neg__(self): return Direction(self.horizontal + 180, -self.vertical) def __sub__(self, other): return Direction(self.horizontal - other.x, self.vertical - other.y) def __mul__(self, scalar): return Direction(self.horizontal * scalar, self.vertical * scalar) def __truediv__(self, scalar): if scalar != 0: return Direction(self.horizontal / scalar, self.vertical / scalar) else: raise ValueError("Cannot divide by zero") def Magnitude(self): return math.sqrt(self.horizontal**2 + self.vertical**2) def Normalize(self): if self.vertical > 90 or self.vertical < -90: self.horizontal += 180 self.verical = 180 - self.verical def Dot(self, other): return self.horizontal * other.x + self.vertical * other.y def __repr__(self): return f"Direction(x={self.horizontal}, y={self.vertical})" Direction.forward = Direction(0, 0) Direction.backward = Direction(-180, 0) Direction.up = Direction(0, 90) Direction.down = Direction(0, -90) Direction.left = Direction(-90, 0) Direction.right = Direction(90, 0)