Skip to content

horizontal motion code physics #4710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Apr 4, 2022
Merged
Changes from 11 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
a565258
Add files via upload
avivfaraj Sep 3, 2021
4951686
Changed print to f-string
avivfaraj Sep 4, 2021
ff2a162
Add files via upload
avivfaraj Sep 4, 2021
6550183
Fixes: #4710 provided return type
avivfaraj Sep 4, 2021
552546f
File exists in another pull request
avivfaraj Sep 4, 2021
bc31e3f
imported radians from math
avivfaraj Sep 5, 2021
974e0a6
Updated file according to pre-commit test
avivfaraj Sep 6, 2021
1d4fc81
Updated file
avivfaraj Sep 6, 2021
7bd84b4
Updated gamma
avivfaraj Sep 6, 2021
2841c11
Deleted duplicate file
avivfaraj Sep 6, 2021
cea2deb
removed pi
avivfaraj Sep 6, 2021
db7db3b
reversed tests
avivfaraj Sep 7, 2021
132e495
Fixed angle condition
avivfaraj Sep 7, 2021
c0e5071
Modified prints to f-string
avivfaraj Sep 7, 2021
894fa7f
Update horizontal_projectile_motion.py
avivfaraj Sep 7, 2021
ee49ce7
Merge branch 'TheAlgorithms:master' into master
avivfaraj Sep 7, 2021
07646ac
Update horizontal_projectile_motion.py
avivfaraj Sep 7, 2021
4e2fcaf
Fixes #4710 added exceptions and tests
avivfaraj Sep 7, 2021
dcacc95
Added float tests
avivfaraj Sep 7, 2021
3f2b238
Fixed type annotations
avivfaraj Sep 14, 2021
e3678fd
Fixed last annotation
avivfaraj Sep 14, 2021
c37bb95
Fixed annotations
avivfaraj Sep 14, 2021
5b0249a
fixed format
avivfaraj Sep 14, 2021
ec790c6
Revert "fixed format"
avivfaraj Sep 14, 2021
e865929
Revert "Fixed annotations"
avivfaraj Sep 14, 2021
82b4e0d
Revert "Fixed last annotation"
avivfaraj Sep 14, 2021
63c7c6a
Revert "Fixed type annotations"
avivfaraj Sep 14, 2021
0527866
Merge branch 'TheAlgorithms:master' into master
avivfaraj Apr 4, 2022
805050e
Revert to 4e2fcaf6fb
avivfaraj Apr 4, 2022
5f3486c
Fixing errors found during pre-commit
avivfaraj Apr 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions physics/horizontal_projectile_motion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
"""
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 radians as angle_to_radians
from math import sin

# Acceleration Constant on hearth (unit m/s^2)
g = 9.80665


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]")