Update app.py
Browse files
app.py
CHANGED
|
@@ -76,4 +76,54 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
# Desenha checkpoints e o rastro contínuo
|
| 80 |
+
ax.scatter(*ponto_a, s=150, c='lime', alpha=0.7)
|
| 81 |
+
ax.scatter(*ponto_b, s=150, c='red', marker='X', alpha=0.9)
|
| 82 |
+
|
| 83 |
+
rastro_np = np.array(historico_rastro)
|
| 84 |
+
# Desenha o rastro até o ponto atual da bola
|
| 85 |
+
indice_global_frame = len(historico_rastro) - len(x_ciclo) + frame
|
| 86 |
+
ax.plot(rastro_np[:indice_global_frame+1, 0], rastro_np[:indice_global_frame+1, 1], rastro_np[:indice_global_frame+1, 2], '-', color='#ff4500', linewidth=4, alpha=0.6)
|
| 87 |
+
|
| 88 |
+
# Desenha a bola na posição atual
|
| 89 |
+
ax.plot([x_ciclo[frame]], [y_ciclo[frame]], [z_ciclo[frame]], 'o', color='#ff4500', markersize=8, markeredgecolor='white')
|
| 90 |
+
|
| 91 |
+
# Informações na tela
|
| 92 |
+
info_texto = f"Ciclo: {ciclo_num}\nAlvo: {np.round(ponto_b, 1)}"
|
| 93 |
+
ax.text2D(0.05, 0.95, info_texto, transform=ax.transAxes, color='white', fontsize=10)
|
| 94 |
+
|
| 95 |
+
# Envia o frame atual para a UI
|
| 96 |
+
yield fig
|
| 97 |
+
time.sleep(0.02) # Pequena pausa para controlar a velocidade
|
| 98 |
+
|
| 99 |
+
# Prepara para o próximo ciclo
|
| 100 |
+
ponto_a = ponto_b
|
| 101 |
+
|
| 102 |
+
plt.close(fig) # Este código nunca será alcançado, mas é uma boa prática
|
| 103 |
+
|
| 104 |
+
# --- Interface Gradio ---
|
| 105 |
+
|
| 106 |
+
with gr.Blocks(theme=gr.themes.Base(primary_hue="orange")) as demo:
|
| 107 |
+
gr.Markdown(
|
| 108 |
+
"""
|
| 109 |
+
# ♾️ Simulador Autônomo 3D de Convergência
|
| 110 |
+
Clique em "Iniciar" para dar partida no motor da simulação. O agente (bola) irá navegar
|
| 111 |
+
autonomamente pelo espaço, gerando novos alvos aleatórios em um loop infinito e deixando um rastro contínuo.
|
| 112 |
+
**Para parar, simplesmente recarregue a página.**
|
| 113 |
+
"""
|
| 114 |
+
)
|
| 115 |
+
with gr.Row():
|
| 116 |
+
with gr.Column(scale=1):
|
| 117 |
+
angulo_camera_slider = gr.Slider(-180, 180, value=45, label="Ângulo da Câmera")
|
| 118 |
+
start_btn = gr.Button("🚀 Iniciar Simulação Infinita", variant="primary")
|
| 119 |
+
with gr.Column(scale=2):
|
| 120 |
+
plot_output = gr.Plot(label="Visualização em Tempo Real")
|
| 121 |
+
|
| 122 |
+
start_btn.click(
|
| 123 |
+
fn=motor_da_simulacao_infinita,
|
| 124 |
+
inputs=[angulo_camera_slider],
|
| 125 |
+
outputs=[plot_output]
|
| 126 |
+
)
|
| 127 |
+
|
| 128 |
+
if __name__ == "__main__":
|
| 129 |
+
demo.launch()
|