# Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 24

### Tell us what’s happening:

Can’t figure out what I’m doing wrong on the call profectile_helper line. Did it with return, without, with print, and moved it everywhere. Please advise.

``````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

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):

@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

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]

matrix_axes = [y_axis_tick + row for row in matrix]
matrix_axes.append(" " + x_axis_tick * (len(matrix[0])))

graph = "\n" + "\n".join(matrix_axes) + "\n"

return graph

# User Editable Region

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

def projectile_helper(speed, height, angle):
projectile = Projectile(speed, height, angle)
coordinates = projectile.calculate_all_coordinates()
graph = Graph(coordinates)
print(projectile)
print(graph.create_coordinates_table())
print(graph.create_trajectory())
return(projectile_helper)

# User Editable Region

``````

User Agent is: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`

### Challenge Information:

Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 24

Hello,
your code is almost coorect first remove this block of code since you already add it to your `projectile_helper`helper function

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

Then call the `projectile_helper` with three values of your choice as stated at the end of the instructions

Got it! Thank you so much that was spot on!!!

1 Like