mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
Add files via upload
This commit is contained in:
parent
4951686999
commit
ff2a162bdd
131
physics/horizontal_projectile_motion.py
Normal file
131
physics/horizontal_projectile_motion.py
Normal file
|
@ -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]")
|
Loading…
Reference in New Issue
Block a user