Skip to content

Commit 26fef7e

Browse files
author
renzon
committed
Lançamento vertical ok
1 parent 423b162 commit 26fef7e

4 files changed

Lines changed: 105 additions & 14 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ gravidade (G) constante e igual a 10 m/s^2.
5959
### Método Lancar
6060

6161
O método lançar recebe o ângulo, em graus, que será feito o lançamento. Cada pássaro deve armazenar esse valor e tempo
62-
de lançamento para cálculo de sua posíção. Lembrar que o tempo das fórmulas é delta_t=Tfinal-Tinicial
62+
de lançamento para cálculo de sua posíção. Lembrar que o tempo das fórmulas é delta_t=Tfinal-Tinicialself
6363

6464
### Método posicao_horizontal
6565

6666
Fórmula X=X0+v*cos(teta)*delta_t.
6767

6868
### Método posicao_vertical
6969

70-
Fórmula Y=Y0+v*sen(teta)delta_t+(G*delta_t^2)/2.
70+
Fórmula Y=Y0+v*sen(teta)delta_t-(G*delta_t^2)/2.
7171

7272

7373

atores.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99

1010
class Ator():
11-
_tempo_de_colisao = None
1211
_caracter_ativo = 'A'
1312
_caracter_destruido = '✝'
1413

@@ -21,6 +20,7 @@ def caracter(self, tempo):
2120
def __init__(self, x=0, y=0):
2221
self.y = y
2322
self.x = x
23+
self._tempo_de_colisao = None
2424

2525
def status(self, tempo):
2626
if self._tempo_de_colisao is None or self._tempo_de_colisao > tempo:
@@ -31,7 +31,8 @@ def calcular_posicao(self, tempo):
3131
return self.arredondar_posicao()
3232

3333
def arredondar_posicao(self):
34-
return round(self.x), round(self.y)
34+
self.x, self.y = round(self.x), round(self.y)
35+
return self.x, self.y
3536

3637
def colidir(self, outro_ator, tempo):
3738
if self.status(tempo) == DESTRUIDO or outro_ator.status(tempo) == DESTRUIDO:
@@ -57,6 +58,9 @@ class Porco(Ator):
5758
_caracter_ativo = '☺'
5859

5960

61+
GRAVIDADE = 10 # m/s^2
62+
63+
6064
class Passaro(Ator):
6165
_velocidade_scalar = None
6266

@@ -67,17 +71,36 @@ def __init__(self, x=0, y=0):
6771
self._tempo_de_lancamento = None
6872
self._angulo_de_lancamento = None # radianos
6973

74+
def colidir_com_chao(self, tempo):
75+
if self.y <= 0:
76+
self._tempo_de_colisao = tempo
77+
78+
def _calcular_posicao_vertical(self, tempo):
79+
delta_t = tempo - self._tempo_de_lancamento
80+
self.y = self._y_inicial + \
81+
self._velocidade_scalar * delta_t * math.sin(self._angulo_de_lancamento) - \
82+
(GRAVIDADE / 2) * delta_t ** 2
83+
84+
def _calcular_posicao(self, tempo):
85+
self._calcular_posicao_vertical(tempo)
86+
7087
def calcular_posicao(self, tempo):
7188
if self._tempo_de_lancamento is None or tempo < self._tempo_de_lancamento:
72-
return self.arredondar_posicao()
89+
self.x = self._x_inicial
90+
self.y = self._y_inicial
91+
elif self._tempo_de_colisao is not None and tempo >= self._tempo_de_colisao:
92+
self._calcular_posicao(self._tempo_de_colisao)
93+
else:
94+
self._calcular_posicao(tempo)
95+
return self.arredondar_posicao()
7396

7497
def lancar(self, angulo, tempo):
7598
self._tempo_de_lancamento = tempo
7699
self._angulo_de_lancamento = math.radians(angulo)
77100

78101

79102
class PassaroAmarelo(Passaro):
80-
_velocidade_scalar = 10 # m/s
103+
_velocidade_scalar = 30 # m/s
81104
_caracter_ativo = '>'
82105

83106

placa_grafica.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ def rebobina(delta_t, fase, passo, tempo, msg):
5757
def animar(fase, passo=0.1, delta_t=0.1):
5858
tempo = 0
5959
tempo_final = _animar(delta_t, fase, passo, tempo, 'Play!')
60-
rebobina(delta_t, fase, passo / 10, tempo_final, 'Rebobinando 10 vezes mais rápido!')
61-
_animar(delta_t, fase, passo / 5, tempo, 'Replay 5 vezes mais rápido!')
60+
rebobina(delta_t, fase, passo / 50, tempo_final, 'Rebobinando 50 vezes mais rápido!')
61+
_animar(delta_t, fase, passo / 20, tempo, 'Replay 20 vezes mais rápido!')
6262
apagar_tela()
6363
print(fase.status())
6464
print(FIM)
@@ -126,7 +126,7 @@ def acabou(self, tempo):
126126
def status(self):
127127
return 'Você ganhou'
128128

129-
animar(Fase())
129+
animar(Fase(),passo=0.01,delta_t=0.01)
130130

131131

132132
if __name__ == '__main__':

testes/atores_testes.py

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def teste_colisao_somente_um_ator_destruido(self):
8686
self.assert_nao_colisao(Ator(1, 2), ator)
8787
self.assert_nao_colisao(Ator(1, 3), ator)
8888

89+
8990
def teste_status(self):
9091
ator = Ator()
9192
assert_ator_status(self, ator, 'A', '✝')
@@ -103,11 +104,15 @@ def teste_status(self):
103104
assert_ator_status(self, porco, '☺', '✝')
104105

105106

106-
class PassaroAmareloTests(TestCase):
107-
def teste_status(self):
108-
passaro_amarelo = PassaroAmarelo(1, 1)
109-
assert_ator_status(self, passaro_amarelo, '>', '✝')
107+
class PassaroBaseTests(TestCase):
108+
def assert_passaro_posicao(self, x_esperado, y_esperado, status_esperado, passaro, tempo):
109+
dct = {'x_esperado': x_esperado, 'y_esperado': y_esperado, 'status_esperado': status_esperado, 'tempo': tempo}
110+
self.assertTupleEqual((x_esperado, y_esperado), passaro.calcular_posicao(tempo), dct)
111+
passaro.colidir_com_chao(tempo)
112+
self.assertEqual(status_esperado, passaro.status(tempo), dct)
113+
110114

115+
class PassaroAmareloTests(PassaroBaseTests):
111116
def teste_posicao_antes_do_lancamento(self):
112117
passaro_amarelo = PassaroAmarelo(1, 1)
113118
passaro_amarelo.lancar(90, 2) # passaro lancado a 90 graus no tempo 2 segundos
@@ -116,8 +121,71 @@ def teste_posicao_antes_do_lancamento(self):
116121
t /= 10
117122
self.assertEqual((1, 1), passaro_amarelo.calcular_posicao(t),
118123
'Não deveria se mover no tempo %s < 2 segundtos' % t)
119-
self.assertNotEqual((1, 1), passaro_amarelo.calcular_posicao(3), 'Deveria ter subido')
120124

125+
def teste_status(self):
126+
passaro_amarelo = PassaroAmarelo(1, 1)
127+
assert_ator_status(self, passaro_amarelo, '>', '✝')
128+
129+
def teste_colisao_com_chao(self):
130+
for i in range(30):
131+
passaro = PassaroAmarelo(i, 0)
132+
passaro.colidir_com_chao(3)
133+
self.assertEqual(DESTRUIDO, passaro.status(3), 'Deve colidir com chão sempre que y=0')
121134

135+
def teste_lacamento_vertical(self):
136+
passaro_amarelo = PassaroAmarelo(1, 1)
137+
passaro_amarelo.lancar(90, 2) # passaro lancado a 90 graus no tempo 2 segundos
122138

139+
def assert_vertical(y_local, tempo):
140+
self.assert_passaro_posicao(1, y_local, ATIVO, passaro_amarelo, tempo)
141+
142+
# subindo
143+
144+
assert_vertical(1, 2.0)
145+
assert_vertical(1, 2.0)
146+
assert_vertical(1, 2.01)
147+
assert_vertical(2, 2.02)
148+
assert_vertical(2, 2.03)
149+
assert_vertical(2, 2.04)
150+
assert_vertical(2, 2.05)
151+
152+
# descendo
153+
154+
assert_vertical(46, 5.26)
155+
assert_vertical(46, 5.27)
156+
assert_vertical(46, 5.279999999999999)
157+
assert_vertical(46, 5.29)
158+
assert_vertical(46, 5.3)
159+
assert_vertical(46, 5.3100000000000005)
160+
assert_vertical(45, 5.32)
161+
assert_vertical(45, 5.33)
162+
assert_vertical(45, 5.34)
163+
assert_vertical(45, 5.35)
164+
assert_vertical(45, 5.359999999999999)
165+
assert_vertical(45, 5.37)
166+
assert_vertical(45, 5.38)
167+
assert_vertical(45, 5.390000000000001)
168+
assert_vertical(45, 5.4)
169+
assert_vertical(45, 5.41)
170+
assert_vertical(45, 5.42)
171+
assert_vertical(45, 5.43)
172+
assert_vertical(45, 5.4399999999999995)
173+
assert_vertical(45, 5.45)
174+
assert_vertical(45, 5.46)
175+
assert_vertical(45, 5.470000000000001)
176+
assert_vertical(45, 5.48)
177+
178+
# preparando para impacto no chão
179+
assert_vertical(1, 8.0)
180+
assert_vertical(1, 8.01)
181+
182+
# colisão
183+
self.assert_passaro_posicao(1, 0, DESTRUIDO, passaro_amarelo, 8.02)
184+
185+
def lancamento_45_graus(self):
186+
pass
187+
# for delta_t in range(0, 1000):
188+
# t = 2 + (delta_t / 100)
189+
# y=passaro_amarelo.calcular_posicao(t)[1]
190+
# print(' assert_vertical(%s, %s)'%(y,t))
123191

0 commit comments

Comments
 (0)