Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 9

Tell us what’s happening:

Your angle method should return the value of the private attribute __angle converted to degrees. The error i get when using this line of code, im assuming it’s got something to do with line 57, isn’t that the attribute it’s talking about? I tried returning math.radians(angle) but not only did it not work it woudn’t make sense because there is not mentioning of an instance and that is an instance

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: {round(math.degrees(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()))
        ]


# User Editable Region

    @property
    def speed(self):
        return self.__speed
    @property
    def height(self):
        return self.__height
    @property
    def angle(self):
        return self.__angle

    

# User Editable Region


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

   

Your browser information:

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36

Challenge Information:

Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 9

inside the angle property you don’t have an angle to use, you still need to use the private property

this, but you need to convert self.__angle before returning it

Hi @OCode

  1. Your angle method should return the value of the private attribute __angle converted to degrees.

Remember the angle is stored in radians, so you need to convert it to degrees.

Happy coding

that is not an instance, what do you mean?

isn’t math . degrees an instance on this article that i won’t like but if you typed up built in .com it says this self.instance_attr = instance_attr i was saying that self.__angle = math.radians(angle) math.radians is an instance, sorry never mind just asked chatgpt article confused the hell out of me i now know that self.__angle is a instance attribute and it stores the function math.radians(angle)

i have now got this based on articles and your feedback
return math.degrees(self.__angle) however i still am getting error
EDIT: forgot the round part, i have now solved it thanks

math.degree is part of the math module, which is imported at the top of the code and can be used anywhere in the code

1 Like