52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
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) |