From ff2a162bddfb46e75a4020d5212efef684dd5850 Mon Sep 17 00:00:00 2001 From: avivfaraj <73610201+avivfaraj@users.noreply.github.com> Date: Sat, 4 Sep 2021 12:41:26 -0400 Subject: [PATCH] Add files via upload --- physics/horizontal_projectile_motion.py | 131 ++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 physics/horizontal_projectile_motion.py diff --git a/physics/horizontal_projectile_motion.py b/physics/horizontal_projectile_motion.py new file mode 100644 index 000000000..a5b2cff28 --- /dev/null +++ b/physics/horizontal_projectile_motion.py @@ -0,0 +1,131 @@ +""" +Horizontal Projectile Motion problem in physics. +This algorithm solves a specific problem in which +the motion starts from the ground as can be seen below: + (v = 0) + ** + * * + * * + * * + * * + * * +GROUND GROUND + +For more info: https://en.wikipedia.org/wiki/Projectile_motion +""" + +# Importing packages +from math import pi, sin + +# Acceleration Constant on hearth (unit m/s^2) +g = 9.80665 + + +def angle_to_radians(angle): + """ + Convert an angle from degrees to randians + """ + return angle * pi / 180 + + +def horizontal_distance(init_velocity: float, angle: float) -> float: + """ + Returns the horizontal distance that the object cover + + Formula: + v_0^2 * sin(2 * alpha) + --------------------- + g + + v_0 - initial velocity + alpha - angle + + >>> horizontal_distance(30, 45) + 91.77 + >>> horizontal_distance(100, 78) + 414.76 + """ + radians = angle_to_radians(2 * angle) + return round((init_velocity ** 2) * sin(radians) / g, 2) + + +def max_height(init_velocity: float, angle: float) -> float: + """ + Returns the maximum height that the object reach + + Formula: + v_0^2 * sin^2(alpha) + -------------------- + 2g + + v_0 - initial velocity + alpha - angle + + >>> max_height(30, 45) + 22.94 + >>> max_height(100, 78) + 487.82 + """ + + radians = angle_to_radians(angle) + return round(((init_velocity ** 2) * (sin(radians)) ** 2) / (2 * g), 2) + + +def total_time(init_velocity: float, angle: float) -> float: + """ + Returns total time of the motion + + Formula: + 2 * v_0 * sin(alpha) + -------------------- + g + + v_0 - initial velocity + alpha - angle + + >>> total_time(30, 45) + 4.33 + >>> total_time(100, 78) + 19.95 + """ + + radians = angle_to_radians(angle) + return round((2 * init_velocity) * (sin(radians)) / g, 2) + + +def test_motion() -> None: + """ + >>> test_motion() + """ + v0, angle = 25, 20 + assert 40.97 == horizontal_distance(v0, angle) + assert 3.73 == max_height(v0, angle) + assert 1.74 == total_time(v0, angle) + + +if __name__ == "__main__": + + # Get input from user + init_vel = float(input("Initial Velocity: ")) + + # Get input from user + angle = float(input("angle: ")) + + # Ensure valid angle + if angle > 90 or angle <= 0: + print("Error: Invalid angle. Range is 1-90 degrees.") + + # Ensure valid velocity + elif init_vel < 0: + print("Error: Invalid velocity. Should be a positive number.") + + # Print results + else: + print() + h_dis = str(horizontal_distance(init_vel, angle)) + v_dis = str(max_height(init_vel, angle)) + t_time = str(total_time(init_vel, angle)) + print("Results: ") + print("Horizontal Distance: " + h_dis + " [m]") + print("Maximum Height: " + v_dis + " [m]") + print("Total Time: " + t_time + " [s]")