Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14

Tell us what’s happening:

I’ve looked over the output of my code compared to the example for about an hour counting spaces and even cleaning up my output to align itself correctly with many other Projectile objects with larger x and y coordinates beyond the example. I’ve read through the 3 different posts and while they don’t use the same style as mine, the output I’m getting seems to be precisely what the example asks for. I’m assuming I’m missing a space somewhere but I can’t see it myself.

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
        self.__angle = math.radians(angle)
        
    def __str__(self):
        return f'''
Projectile details:
speed: {self.speed} m/s
height: {self.height} m
angle: {self.angle}°
displacement: {round(self.__calculate_displacement(), 1)} m
'''

    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
    
    def __repr__(self):
        return f'{self.__class__}({self.speed}, {self.height}, {self.angle})'

class Graph:
    __slots__ = ('__coordinates')

    def __init__(self, coord):
        self.__coordinates = coord
    
    def __repr__(self):
        return f'Graph({self.__coordinates})'


# User Editable Region

    def create_coordinates_table(self):
        max_x_len = max(len(str(x)) for x, y in self.__coordinates)
        max_y_len = max(len(str(math.floor(y))) for x, y in self.__coordinates) + 3
        output = f'\n {"x":>{max_x_len}}   {"y":>{max_y_len}}\n'
        for x, y in self.__coordinates:
            output += f' {x:>{max_x_len}}   {y:>{max_y_len}.2f}\n'
        return output



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

graph = Graph(coordinates)
print(graph.create_coordinates_table())

# User Editable Region

Your browser information:

User Agent is: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36

Challenge Information:

Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14

1 Like

Hey, your output seems correct. There’s a bug in the test and it will be fixed soon.
Thank you for reporting this.

1 Like

Hey thanks for the confirmation I wasn’t crazy, is there any way I can view the test so that I can get it to match and pass this step? The dev tools console doesn’t seem to show any tests akin to what the project portions do.

you will need to change your approach, the test was accidentally reassigning str so you can’t use it

I’m somewhat confused as to what you mean, there’s no str method in that class. I’ve tried straight-up printing the string from the function as opposed to returning it and still failed.

You are using the str function in your create_coordinates_table method.
The test is using str as a variable name and it shouldn’t since its a reserved. Therefore the issue. This has not come up before because you don’t really need to use str here, but the implementation is free so it’s up to you.

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.