x2XcarleX2x commited on
Commit
0c5d221
·
verified ·
1 Parent(s): 279b9d7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -88
app.py CHANGED
@@ -4,7 +4,6 @@ import matplotlib.pyplot as plt
4
  from mpl_toolkits.mplot3d import Axes3D
5
  import math
6
  from scipy.special import comb
7
- import json
8
  import time
9
 
10
  # --- Funções Matemáticas (Inalteradas) ---
@@ -24,101 +23,57 @@ def aprender_com_o_eco_3d(pontos_do_eco: list):
24
  p1, p2 = np.array(pontos_do_eco[0]), np.array(pontos_do_eco[-1])
25
  return {"velocity_vector": p2 - p1}
26
 
27
- # --- Função Principal do Gradio (Gerador de Loop Infinito) ---
28
- def motor_da_simulacao(estado_json: str, angulo_camera: int):
29
- # 1. Carrega ou inicializa o estado
30
- if estado_json:
31
- estado = json.loads(estado_json)
32
- ponto_a = np.array(estado["ponto_b"])
33
- vetor_inercia = np.array(estado["vetor_inercia"])
34
- historico_rastro = estado.get("historico_rastro", [ponto_a.tolist()])
35
- else:
36
- ponto_a = np.array([-40., 20., 10.])
37
- vetor_inercia = np.array([30., 10., -20.])
38
- historico_rastro = [ponto_a.tolist()]
39
 
40
- ponto_b = np.random.rand(3) * 120 - 60
41
- ponto_controle = ponto_a + vetor_inercia
42
- pontos_curva = [ponto_a, ponto_controle, ponto_b]
43
- x_ciclo, y_ciclo, z_ciclo = bezier_curve_3d(pontos_curva)
44
-
45
- novos_pontos_rastro = list(zip(x_ciclo, y_ciclo, z_ciclo))
46
- historico_rastro.extend(novos_pontos_rastro)
 
 
47
 
48
- max_rastro = 500
49
- historico_rastro = historico_rastro[-max_rastro:]
50
-
51
- tamanho_eco = 20
52
- pontos_eco = historico_rastro[-tamanho_eco:]
53
- novo_vetor_inercia = aprender_com_o_eco_3d(pontos_eco)["velocity_vector"]
54
-
55
- proximo_estado = {
56
- "ponto_b": ponto_b.tolist(),
57
- "vetor_inercia": novo_vetor_inercia.tolist(),
58
- "historico_rastro": historico_rastro
59
- }
60
-
61
  fig = plt.figure(figsize=(8, 8)); ax = fig.add_subplot(111, projection='3d')
62
  cor_fundo = '#0a0a0a'; fig.patch.set_facecolor(cor_fundo); ax.set_facecolor(cor_fundo)
63
-
64
- # --- AQUI ESTÁ A CORREÇÃO DE SINTAXE E LÓGICA ---
65
- # Convertemos o rastro para Numpy array aqui, em sua própria linha.
66
- rastro_np = np.array(historico_rastro)
67
-
68
- # O loop de animação começa depois da preparação dos dados.
69
- for frame in range(len(x_ciclo)):
70
- ax.cla()
71
- ax.xaxis.pane.fill = False; ax.yaxis.pane.fill = False; ax.zaxis.pane.fill = False
72
- ax.grid(color='#222222', linestyle='--')
73
- ax.view_init(elev=30., azim=angulo_camera + (len(historico_rastro) - len(x_ciclo) + frame) * 0.1)
74
- ax.set_xlim(-70, 70); ax.set_ylim(-70, 70); ax.set_zlim(-70, 70)
75
- ax.set_xticklabels([]); ax.set_yticklabels([]); ax.set_zticklabels([])
76
-
77
- ax.scatter(*ponto_a, s=150, c='lime', alpha=0.7)
78
- ax.scatter(*ponto_b, s=150, c='red', marker='X', alpha=0.9)
79
 
80
- # O índice para o rastro deve ser calculado corretamente
81
- indice_inicio_rastro_global = len(historico_rastro) - len(x_ciclo)
82
- rastro_frame_atual = rastro_np[:indice_inicio_rastro_global + frame + 1]
 
83
 
84
- ax.plot(rastro_frame_atual[:,0], rastro_frame_atual[:,1], rastro_frame_atual[:,2], '-', color='#ff4500', linewidth=4, alpha=0.6)
 
85
 
86
- ax.plot([x_ciclo[frame]], [y_ciclo[frame]], [z_ciclo[frame]], 'o', color='#ff4500', markersize=8, markeredgecolor='white')
87
-
88
- info = f"Ciclo Atual\nInício (A): {np.round(ponto_a, 1)}\nDestino (B): {np.round(ponto_b, 1)}"
89
- yield fig, json.dumps(proximo_estado), info
90
- time.sleep(0.01)
91
-
92
- plt.close(fig)
93
 
94
- # --- Interface Gradio (Inalterada) ---
95
- with gr.Blocks(theme=gr.themes.Base(primary_hue="pink")) as demo:
96
- gr.Markdown(
97
- """
98
- # ♾️ Simulador de Jornada Infinita (Tempo Real)
99
- Clique em "Iniciar / Próximo Ciclo" para que o agente (bola) comece sua jornada.
100
- A simulação continuará em um loop infinito, gerando novos alvos e mantendo um rastro contínuo do seu percurso.
101
- """
102
- )
103
- with gr.Row():
104
- with gr.Column(scale=1):
105
- angulo_camera_slider = gr.Slider(-180, 180, value=45, label="Ângulo Inicial da Câmera")
106
- info_output = gr.Textbox(label="Dados do Ciclo Atual", lines=3, interactive=False)
107
- run_btn = gr.Button("🚀 Iniciar / Próximo Ciclo", variant="primary")
108
- with gr.Column(scale=2):
109
- plot_output = gr.Plot(label="Visualização da Simulação")
110
 
111
- state = gr.State()
 
 
 
 
 
 
 
112
 
113
- run_btn.click(
114
- fn=motor_da_simulacao,
115
- inputs=[state, angulo_camera_slider],
116
- outputs=[plot_output, state, info_output]
117
- ).then(
118
- fn=motor_da_simulacao,
119
- inputs=[state, angulo_camera_slider],
120
- outputs=[plot_output, state, info_output]
121
- )
 
122
 
123
- if __name__ == "__main__":
124
- demo.launch(),
 
4
  from mpl_toolkits.mplot3d import Axes3D
5
  import math
6
  from scipy.special import comb
 
7
  import time
8
 
9
  # --- Funções Matemáticas (Inalteradas) ---
 
23
  p1, p2 = np.array(pontos_do_eco[0]), np.array(pontos_do_eco[-1])
24
  return {"velocity_vector": p2 - p1}
25
 
26
+ # --- Função Principal do Gradio (O Motor da Simulação Infinita) ---
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ def motor_da_simulacao_infinita(angulo_camera: int):
29
+ """
30
+ Esta função é um gerador que roda em um loop infinito, 'yieldando'
31
+ um novo frame do gráfico para a UI a cada passo.
32
+ """
33
+ # 1. Inicializa o estado da simulação
34
+ ponto_a = np.array([-40., 20., 10.])
35
+ vetor_inercia = np.array([30., 10., -20.])
36
+ historico_rastro = [ponto_a.tolist()] # O rastro começa no ponto inicial
37
 
38
+ # Prepara a figura do Matplotlib uma única vez
 
 
 
 
 
 
 
 
 
 
 
 
39
  fig = plt.figure(figsize=(8, 8)); ax = fig.add_subplot(111, projection='3d')
40
  cor_fundo = '#0a0a0a'; fig.patch.set_facecolor(cor_fundo); ax.set_facecolor(cor_fundo)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
+ # --- 2. O LOOP INFINITO ---
43
+ ciclo_num = 0
44
+ while True:
45
+ ciclo_num += 1
46
 
47
+ # Gera um novo checkpoint B aleatório
48
+ ponto_b = np.random.rand(3) * 120 - 60
49
 
50
+ # Calcula a trajetória para o ciclo atual
51
+ ponto_controle = ponto_a + vetor_inercia
52
+ pontos_curva = [ponto_a, ponto_controle, ponto_b]
53
+ x_ciclo, y_ciclo, z_ciclo = bezier_curve_3d(pontos_curva)
 
 
 
54
 
55
+ # Adiciona os novos pontos do ciclo ao histórico do rastro
56
+ novos_pontos_rastro = list(zip(x_ciclo, y_ciclo, z_ciclo))
57
+ historico_rastro.extend(novos_pontos_rastro)
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
+ # Limita o tamanho do rastro para não consumir memória infinita
60
+ max_rastro = 500
61
+ historico_rastro = historico_rastro[-max_rastro:]
62
+
63
+ # Aprende o "eco" para o PRÓXIMO ciclo
64
+ tamanho_eco = 20
65
+ pontos_eco = list(zip(x_ciclo[-tamanho_eco:], y_ciclo[-tamanho_eco:], z_ciclo[-tamanho_eco:]))
66
+ vetor_inercia = aprender_com_o_eco_3d(pontos_eco)["velocity_vector"]
67
 
68
+ # Loop de renderização para o ciclo atual
69
+ for frame in range(len(x_ciclo)):
70
+ ax.cla() # Limpa o gráfico para o próximo frame
71
+
72
+ # Reconfigura o ambiente fixo
73
+ ax.xaxis.pane.fill = False; ax.yaxis.pane.fill = False; ax.zaxis.pane.fill = False
74
+ ax.grid(color='#222222', linestyle='--')
75
+ ax.view_init(elev=30., azim=angulo_camera)
76
+ ax.set_xlim(-70, 70); ax.set_ylim(-70, 70); ax.set_zlim(-70, 70)
77
+ ax.set_xticklabels([]); ax.set_yticklabels([]); ax.set_zticklabels([])
78
 
79
+