Tell us what’s happening:
I’ve looked over the output of my code compared to the example for about an hour counting spaces and even cleaning up my output to align itself correctly with many other Projectile objects with larger x and y coordinates beyond the example. I’ve read through the 3 different posts and while they don’t use the same style as mine, the output I’m getting seems to be precisely what the example asks for. I’m assuming I’m missing a space somewhere but I can’t see it myself.
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):
max_x_len = max(len(str(x)) for x, y in self.__coordinates)
max_y_len = max(len(str(math.floor(y))) for x, y in self.__coordinates) + 3
output = f'\n {"x":>{max_x_len}} {"y":>{max_y_len}}\n'
for x, y in self.__coordinates:
output += f' {x:>{max_x_len}} {y:>{max_y_len}.2f}\n'
return output
ball = Projectile(10, 20, 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 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Challenge Information:
Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14