Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14

Tell us what’s happening:

It looks exactly the same. I don’t know what else I can do

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):
        output = '\n  x      y\n'
        for x,y in self.__coordinates:            
            output += f' {x:>2} {y:6.2f} \n'
        
        return output


ball = Projectile(10, 3, 45)
print(ball)
coordinates = ball.calculate_all_coordinates()
print('start')
graph = Graph(coordinates)
print(graph.create_coordinates_table())
print('end')

# 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/131.0.0.0 Safari/537.36

Challenge Information:

Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14

you have at minimum extra spaces on the right of each line

1 Like

Thank you very much, I managed it. PAY ATTENTION to the spaces. What is the point of it being so precise? Even though it looks exactly like that, it doesn’t fit… Does it really have to be so precise? Please explain.

Are the two strings "hello" and "hello " the same?
what does "hello" == "hello " returns?

if you need to return a string, the tests check that it is that string, spaces are characters like all others

That’s clear. But it’s not entirely clear in the task. There are no quotation marks to show you the limits each row. There should be a little tolerance built in here, right?

1 Like

With strings added it’s like this:

'''
  x      y
  0   3.00
  1   3.90
  2   4.61
  3   5.12
  4   5.43
  5   5.55
  6   5.47
  7   5.19
  8   4.72
  9   4.05
 10   3.19
 11   2.13
 12   0.87  
'''
1 Like