Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 21

Tell us what’s happening:

i don’t understand how to do this, i know you will need to add the two ticks but i don’t know how you do that

    "⊣     ∙       ",
    "⊣  ∙∙∙ ∙∙∙    ",
    "⊣ ∙       ∙   ",
    "⊣∙         ∙  ",
    "⊣           ∙ ",
    "⊣            ∙",
    "⊣             ",
    " TTTTTTTTTTTTT",

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})"

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

        return table


# User Editable Region

    def create_trajectory(self):

        rounded_coords = [(round(x), round(y)) for x, y in self.__coordinates]

        x_max = max(rounded_coords, key=lambda i: i[0])[0]
        y_max = max(rounded_coords, key=lambda j: j[1])[1]

        matrix_list = [[" " for _ in range(x_max + 1)] for _ in range(y_max + 1)]

        for x, y in rounded_coords:
            matrix_list[-1 - y][x] = PROJECTILE

        matrix = ["".join(line) for line in matrix_list]

        return matrix

# User Editable Region


ball = Projectile(10, 3, 45)
print(ball)
coordinates = ball.calculate_all_coordinates()
graph = Graph(coordinates)
for row in graph.create_trajectory():
    print(row) 
   

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 21

Start with the y_axis_tick. You need to add it to the beginning of each line in matrix, right?

like this,

matrix = [(y_axis_tick,x_axis_tick,"".join(line)) for line in matrix_list]]```

i get this 
('⊣', 'T', '     ∙       ')
('⊣', 'T', '  ∙∙∙ ∙∙∙    ')
('⊣', 'T', ' ∙       ∙   ')
('⊣', 'T', '∙         ∙  ')
('⊣', 'T', '           ∙ ')
('⊣', 'T', '            ∙')
('⊣', 'T', '             ')

how would i get the x axis on the axis ?
my thinkiing on how to do this i'll need to make a new line below it and using that line i'll put in the x_axis_tick, but how do i do that

that’s not the result you want… for x axes ticks you need to add them below what you already have

yes, but i don’t know how, i’ve said what i think i should do and i said that i think i should create a new line and add that into it.

how do you add a new element to a list?

like this? matrix.append(x_axis_tick) i have an issue tho it doesn’t update it
EDIT: nvm it does update it it’s just that it is singular now i don’t imagine a times this by a set number as the code will be inefficient

what is not being updated?

the new element still needs to be a list

my output:
('⊣', ' ∙ ') ('⊣', ' ∙∙∙ ∙∙∙ ') ('⊣', ' ∙ ∙ ') ('⊣', '∙ ∙ ') ('⊣', ' ∙ ') ('⊣', ' ∙') ('⊣', ' ') T

that is not a list of lists, do not change the type of the output

wait isn’t this the thing i done before? you just iterate over it no?

if you are adding the x axes you don’t need to iterate.

oh, ok, here the output is a list of strings.
so add a new string as last element and add to it the right number of ticks

do you mean times it to the right number of ticks? wdym add it to the right num of ticks?

add to the string the right number of ticks. you don’t need to add to the ticks, you need to add the ticks to the graph

You’ve gotten far enough that you should have all the tools to do this on your own.

You have a list of lists, or a list of strings. You just need to add a character to the first line of each row, and add an additional row at the end.

It should look exactly like the example when the output is finished.

Let us know if you have a specific question.

okay i understand what you are saying however i’m still getting nothing back from the terminal in regards to the x_axis_tick
my code:
matrix_list.append(f"{x_axis_tick}\n")
my output:
(‘⊣’, ’ ∙ ')
(‘⊣’, ’ ∙∙∙ ∙∙∙ ')
(‘⊣’, ’ ∙ ∙ ')
(‘⊣’, '∙ ∙ ')
(‘⊣’, ’ ∙ ‘)
(‘⊣’, ’ ∙’)
(‘⊣’, ’ ')

There’s a reason for that.

What is matrix ? ( … whoa.)

What is matrix_list ?

1 Like

why do you have tuples in your code now? a comma doesn’t add an item to a string. you need to use a proper operator that concatenates strings there.

okay i’ve got this now

 matrix = ["".join(line) for line in matrix_list]
        max_x = max(x for x, y in coordinates)
        x_axis_line = x_axis_tick * (max_x + 1)
        matrix = [f"{y_axis_tick}{line}" for line in matrix]
        matrix.append(x_axis_line)
        
        return matrix

i told chatgpt walk me through each step without telling me answers but rather asking me questions on how each line of code works and i got to this. Is this a good way of learning i understand the code.