93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
from math import sqrt, atan2
|
|
|
|
|
|
class Position:
|
|
def __init__(self, x: int = 0, y: int = 0):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
def __add__(self, other: "Position") -> "Position":
|
|
return Position(self.x + other.x, self.y + other.y)
|
|
|
|
def __sub__(self, other: "Position") -> "Position":
|
|
return Position(self.x - other.x, self.y - other.y)
|
|
|
|
def __mul__(self, other: float) -> "Position":
|
|
return Position(int(self.x * other), int(self.y * other))
|
|
|
|
def __truediv__(self, other: float) -> "Position":
|
|
return Position(int(self.x / other), int(self.y / other))
|
|
|
|
def __str__(self):
|
|
return f"({self.x}, {self.y})"
|
|
|
|
def __eq__(self, other: "Position"):
|
|
return self.x == other.x and self.y == other.y
|
|
|
|
def distance_to(self, other: "Position") -> float:
|
|
return sqrt((self.x - other.x) ** 2 + (self.y - other.y) ** 2)
|
|
|
|
def norm(self) -> float:
|
|
return sqrt(self.x ** 2 + self.y ** 2)
|
|
|
|
def angle_to(self, other: "Position") -> float:
|
|
return atan2(self.y - other.y, other.x - self.x)
|
|
|
|
|
|
class Station:
|
|
"""
|
|
This class represents the position and link of a metro station.
|
|
"""
|
|
|
|
def __init__(self, pos: Position, orientation: float, name: str = "Station"):
|
|
"""
|
|
Constructor of Station.
|
|
|
|
:param pos: Position x and y of the station
|
|
:param orientation: The orientation of the station in radian (The angle is where the station is facing next)
|
|
:param name: The name of the station
|
|
"""
|
|
self.name = name
|
|
self.orientation = orientation
|
|
self.pos = pos
|
|
self.last_station = None
|
|
self.next_station = None
|
|
|
|
def distance_to(self, station: "Station") -> float:
|
|
"""
|
|
Calculate the distance between two stations.
|
|
|
|
:param station: The station to calculate the distance to
|
|
:return: The distance between two stations
|
|
"""
|
|
return self.pos.distance_to(station.pos)
|
|
|
|
|
|
class Metro_Line:
|
|
"""
|
|
This class represents the metro line.
|
|
"""
|
|
|
|
def __init__(self, name: str = "Metro line A"):
|
|
"""
|
|
Constructor of Metro_Line.
|
|
|
|
:param name: The name of the metro line
|
|
"""
|
|
self.name = name
|
|
self.stations = []
|
|
|
|
def add_station(self, station: Station):
|
|
"""
|
|
Add a station to the metro map.
|
|
|
|
:param station: The station to be added
|
|
"""
|
|
self.stations.append(station)
|
|
if len(self.stations) > 1:
|
|
self.stations[-2].next_station = station
|
|
station.last_station = self.stations[-2]
|
|
|
|
|
|
__all__ = ["Metro_Line", "Station", "Position"]
|