From 4c5da3712ee777fdfe6c38dcd628e07bd03a1098 Mon Sep 17 00:00:00 2001 From: Filip Date: Sat, 22 Feb 2025 10:21:59 +0100 Subject: [PATCH] More work done on unit classes. --- cyclinglib/energy.py | 35 +++++++++++++++++++++++++++++++++++ cyclinglib/force.py | 19 +++++++++++++++++++ cyclinglib/length.py | 3 +++ cyclinglib/power.py | 23 +++++++++++++++++++++++ cyclinglib/time.py | 19 +++++++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 cyclinglib/energy.py create mode 100644 cyclinglib/force.py create mode 100644 cyclinglib/power.py create mode 100644 cyclinglib/time.py diff --git a/cyclinglib/energy.py b/cyclinglib/energy.py new file mode 100644 index 0000000..db48a21 --- /dev/null +++ b/cyclinglib/energy.py @@ -0,0 +1,35 @@ +from cyclinglib.force import Force +from cyclinglib.length import Length +from cyclinglib.power import Power +from cyclinglib.time import Time + + +class Energy: + + def __init__(self, joules: float): + self._joules = joules + + def joules(self) -> float: + return self._joules + + def kilojoules(self) -> float: + return self._joules / 1_000 + + def kilocalories(self) -> float: + return self.kilojoules() / 4.184 + + def kcal(self) -> float: + """ + This is alias for kilocalories. + """ + return self.kilocalories() + + +def calculate_energy(force: Force, distance: Length) -> Energy: + joules = force.newtons() * distance.metre() + return Energy(joules) + + +def calculate_energy_cycling(power: Power, duration: Time) -> Energy: + joules = power.watts() * duration.seconds() + return Energy(joules) diff --git a/cyclinglib/force.py b/cyclinglib/force.py new file mode 100644 index 0000000..d732fa2 --- /dev/null +++ b/cyclinglib/force.py @@ -0,0 +1,19 @@ +from cyclinglib.power import Power +from cyclinglib.speed import Speed + + +class Force: + + def __init__(self, newtons: float): + self._newtons = newtons + + def newtons(self) -> float: + return self._newtons + + def kilonewtons(self) -> float: + return self._newtons / 1_000 + + +def calculate_force(power: Power, speed: Speed): + newtons: float = power.watts() * speed.meters_per_second() + return Force(newtons) diff --git a/cyclinglib/length.py b/cyclinglib/length.py index 4dacf89..45173af 100644 --- a/cyclinglib/length.py +++ b/cyclinglib/length.py @@ -3,6 +3,9 @@ class Length: def __init__(self, metre: float) -> None: self._metre = metre + def metre(self) -> float: + return self._metre + def kilometre(self) -> float: return self._metre / 1_000 diff --git a/cyclinglib/power.py b/cyclinglib/power.py new file mode 100644 index 0000000..b8e413f --- /dev/null +++ b/cyclinglib/power.py @@ -0,0 +1,23 @@ +from cyclinglib.force import Force +from cyclinglib.speed import Speed + + +class Power: + + def __init__(self, watts: float): + self._watts = watts + + def watts(self) -> float: + return self._watts + + def kilowatts(self) -> float: + return self._watts / 1_000 + + +def calculate_power(force: Force, speed: Speed) -> Power: + watts = force.newtons() * speed.meters_per_second() + return Power(watts) + + +def calculate_power_si(newtons: float, meters_per_second: float) -> Power: + return calculate_power(Force(newtons), Speed(meters_per_second)) diff --git a/cyclinglib/time.py b/cyclinglib/time.py new file mode 100644 index 0000000..a062668 --- /dev/null +++ b/cyclinglib/time.py @@ -0,0 +1,19 @@ +class Time: + + def __init__(self, seconds: float): + self._seconds = seconds + + def seconds(self) -> float: + return self._seconds + + def milliseconds(self) -> float: + return self._seconds * 1_000 + + def hours(self) -> float: + return self._seconds / 3_600 + + def minutes(self) -> float: + return self._seconds / 60 + + def __str__(self) -> str: + return f"s: {self.seconds()} min: {self.minutes()} h: {self.hours()}"