Add Metro_Line, Station and Position classes

This commit is contained in:
NichiHachi
2024-04-29 23:53:08 +02:00
parent 0e5e6a9313
commit 85796df6c6
2 changed files with 86 additions and 1 deletions

2
.gitignore vendored
View File

@@ -157,4 +157,4 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear # and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/ .idea/

85
metro/Metro_Line.py Normal file
View File

@@ -0,0 +1,85 @@
from math import sqrt
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 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)
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"]