Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 13

Tell us what’s happening:

I’m missing something here… It seems the way my string is formated is wrong, i don’t understan though. What are the requisites that my formated string should have? I played around it for a while now but it does not seem that any of the ways in which I formated the string is good… Thanks in advance!
The problem seems to be here:

def __repr__(self):
        return f"{self.__class__.__name__} = {self.__coordinates})"

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__.__name__}({self.speed}, {self.height}, {self.angle})"


# User Editable Region

class Graph:
    __slots__ = ('__coordinates')  

    def __init__(self, coordinates):
        self.__coordinates = coordinates  

    def __repr__(self):
        return f"{self.__class__.__name__} = {self.__coordinates})"  

ball = Projectile(10, 3, 45)
print(ball)
coordinates = ball.calculate_all_coordinates()
graph = Graph(coordinates) 
print(graph)



# User Editable Region

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 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 13

the string needs to give something like this (but where the coordinates are spelled out). You should not have an assignment in the repr string

1 Like

Solved! Thanks for the help, now I fully understood the concept. I overthinked on that but in the end, now the concept of how repr should work is very clear, again, thanks!

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