Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 11

Tell us what’s happening:

The code is working but it not passing. Also, I am confused about the __calculated_displacement(), how we are going to use its getter we have not set it yet.

Your code so far

import math

GRAVITATIONAL_ACCELERATION = 9.81
PROJECTILE = "∙"
x_axis_tick = "T"
y_axis_tick = "⊣"

class Projectile:
    __slots__ = ('__speed', '__height', '__angle')

    def __init__(self, speed, height, angle):
        self.__speed = speed
        self.__height = height

# User Editable Region

        self.__angle = math.radians(angle)

    def __str__(self):
        return f'''
Projectile details:
speed: {int(self.speed)} m/s
height: {int(self.height)} m
angle: {int(round(math.degrees(self.angle)))}°
displacement: {round(self.calculate_displacement, 1)} m
'''
    @property
    def calculate_displacement(self):
        return self.__calculate_displacement()

# User Editable Region


    def __calculate_displacement(self):
        horizontal_component = self.__speed * math.cos(self.__angle)
        vertical_component = self.__speed * math.sin(self.__angle)
        squared_component = vertical_component**2
        gh_component = 2 * GRAVITATIONAL_ACCELERATION * self.__height
        sqrt_component = math.sqrt(squared_component + gh_component)
        
        return horizontal_component * (vertical_component + sqrt_component) / GRAVITATIONAL_ACCELERATION
        
    def __calculate_y_coordinate(self, x):
        height_component = self.__height
        angle_component = math.tan(self.__angle) * x
        acceleration_component = GRAVITATIONAL_ACCELERATION * x ** 2 / (
                2 * self.__speed ** 2 * math.cos(self.__angle) ** 2)
        y_coordinate = height_component + angle_component - acceleration_component

        return y_coordinate
    
    def calculate_all_coordinates(self):
        return [
            (x, self.__calculate_y_coordinate(x))
            for x in range(math.ceil(self.__calculate_displacement()))
        ]

    @property
    def height(self):
        return self.__height

    @property
    def angle(self):
        return round(math.degrees(self.__angle))

    @property
    def speed(self):
        return self.__speed
    
    @height.setter
    def height(self, n):
        self.__height = n

    @angle.setter
    def angle(self, n):
        self.__angle = math.radians(n)

    @speed.setter
    def speed(self, s):
       self.__speed = s

ball = Projectile(45, 45, 45)
print(ball)
coordinates = ball.calculate_all_coordinates()
   

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36

Challenge Information:

Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 11

1 Like

Does it give the correct angle? (same angle it gave before?). Look at your angle getter and see what calculations it performs.

If you haven’t created that you can’t use it, so you can leave it as is.

1 Like