Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14

Tell us what’s happening:

i don’t know what to do after the for loop here, i’ve read instructions but i can’t see a resemblance of my earlier code in comparison to the example. Any sort of guidance will be a appreciated. Thanks

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

    @property
    def create_coordinates_table(self):
        table = "\nx      y\n"
        for x,y in self.__coordinates:
            print()
            





ball = Projectile(10, 3, 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 (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 14

don’t use print, instead, concatenate to table

you need to align the coordinates, using methods that you learned in the equation solver projects

i have no idea how this isn’t working also why do i do the table = table + formated string? MY CODE:

def create_coordinates_table(self):
        table = "\nx      y\n"
        for x, y in self.__coordinates:
            table += f"{x:>3}{y:>7.2f}\n"
        
        return table


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

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

This is good, almost there.

Are you getting an error in your console output or preview?

print on the console, see that the x and y are not in the right position

they are in the right position tho this is my code output
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

i put 1 instead of greater than 3 and it still fails

my code is this

def create_coordinates_table(self):
        table = "\nx      y\n"
        for x, y in self.__coordinates:
            table += f"{x:>1}{y:>7.2f}\n"
        
        return table


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

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

it still does not work despite being the same placement as the example

Is everything exactly the same spacing?

I mean literally your x and y, the first row

yes the x and y is the same spacing everything is

but they are the same as the example and my table isnt like that its like this,

table = "\nx      y\n"

you have the letter x as first character of the line and the letter y as last character of the line, that’s wrong. While the y is at the right place, the x needs to be right above the 0, and to do that, it needs to have spaces in front

whatever alignment you have here for the numbers, it need to be the same for your x and y

it is above the 0 tho look on the output it says

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

and now they don’t match the requested format, which is

  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 

the 9 needs to be above the 0 of the 10 in the x column, and 4.05 and 3.19 needs to be aligned on top of each other
the requested format also wants a space before the 10, the line starts with a space not with 10 directly

right okay i fixed it got a bit confused overcomplicated it for myself, thanks alot.