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 orgwikiprojectilemotion importing packages acceleration constant on earth unit ms2 check that the arguments are valid ensure valid instance ensure valid angle ensure valid velocity returns the horizontal distance that the object cover formula v02 sin2 alpha g v0 initial velocity alpha angle horizontaldistance30 45 91 77 horizontaldistance100 78 414 76 horizontaldistance1 20 traceback most recent call last valueerror invalid velocity should be a positive number horizontaldistance30 20 traceback most recent call last valueerror invalid angle range is 190 degrees returns the maximum height that the object reach formula v02 sin2alpha 2g v0 initial velocity alpha angle maxheight30 45 22 94 maxheight100 78 487 82 maxheighta 20 traceback most recent call last typeerror invalid velocity should be a positive number horizontaldistance30 b traceback most recent call last typeerror invalid angle range is 190 degrees returns total time of the motion formula 2 v0 sinalpha g v0 initial velocity alpha angle totaltime30 45 4 33 totaltime100 78 19 95 totaltime10 40 traceback most recent call last valueerror invalid velocity should be a positive number totaltime30 b traceback most recent call last typeerror invalid angle range is 190 degrees testmotion get input from user get input from user print results importing packages acceleration constant on earth unit m s 2 check that the arguments are valid ensure valid instance ensure valid angle ensure valid velocity 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 horizontal_distance 1 20 traceback most recent call last valueerror invalid velocity should be a positive number horizontal_distance 30 20 traceback most recent call last valueerror invalid angle range is 1 90 degrees 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 max_height a 20 traceback most recent call last typeerror invalid velocity should be a positive number horizontal_distance 30 b traceback most recent call last typeerror invalid angle range is 1 90 degrees 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 total_time 10 40 traceback most recent call last valueerror invalid velocity should be a positive number total_time 30 b traceback most recent call last typeerror invalid angle range is 1 90 degrees test_motion get input from user get input from user print results
from math import radians as angle_to_radians
from math import sin


g = 9.80665


def check_args(init_velocity: float, angle: float) -> None:
    

    
    if not isinstance(init_velocity, (int, float)):
        raise TypeError("Invalid velocity. Should be a positive number.")

    if not isinstance(angle, (int, float)):
        raise TypeError("Invalid angle. Range is 1-90 degrees.")

    
    if angle > 90 or angle < 1:
        raise ValueError("Invalid angle. Range is 1-90 degrees.")

    
    if init_velocity < 0:
        raise ValueError("Invalid velocity. Should be a positive number.")


def horizontal_distance(init_velocity: float, angle: float) -> float:
    
    check_args(init_velocity, angle)
    radians = angle_to_radians(2 * angle)
    return round(init_velocity**2 * sin(radians) / g, 2)


def max_height(init_velocity: float, angle: float) -> float:
    
    check_args(init_velocity, angle)
    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:
    
    check_args(init_velocity, angle)
    radians = angle_to_radians(angle)
    return round(2 * init_velocity * sin(radians) / g, 2)


def test_motion() -> None:
    
    v0, angle = 25, 20
    assert horizontal_distance(v0, angle) == 40.97
    assert max_height(v0, angle) == 3.73
    assert total_time(v0, angle) == 1.74


if __name__ == "__main__":
    from doctest import testmod

    testmod()

    
    init_vel = float(input("Initial Velocity: ").strip())

    
    angle = float(input("angle: ").strip())

    
    print()
    print("Results: ")
    print(f"Horizontal Distance: {horizontal_distance(init_vel, angle)!s} [m]")
    print(f"Maximum Height: {max_height(init_vel, angle)!s} [m]")
    print(f"Total Time: {total_time(init_vel, angle)!s} [s]")