Update app.py
Browse files
app.py
CHANGED
|
@@ -11,8 +11,7 @@ import time
|
|
| 11 |
def bernstein_poly(i, n, t):
|
| 12 |
return comb(n, i) * (t**(i)) * ((1 - t)**(n - i))
|
| 13 |
|
| 14 |
-
|
| 15 |
-
def bezier_curve_3d(points, n_times=20): # Apenas 20 vetores por ciclo!
|
| 16 |
n_points = len(points)
|
| 17 |
x_points, y_points, z_points = np.array([p[0] for p in points]), np.array([p[1] for p in points]), np.array([p[2] for p in points])
|
| 18 |
t = np.linspace(0.0, 1.0, n_times)
|
|
@@ -25,12 +24,12 @@ def aprender_com_o_eco_3d(pontos_do_eco: list):
|
|
| 25 |
p1, p2 = np.array(pontos_do_eco[0]), np.array(pontos_do_eco[-1])
|
| 26 |
return {"velocity_vector": p2 - p1}
|
| 27 |
|
| 28 |
-
# --- Função Principal do Gradio (Motor Hyperdrive) ---
|
| 29 |
|
| 30 |
def motor_da_simulacao_infinita(angulo_camera: int):
|
| 31 |
"""
|
| 32 |
-
Motor da simulação que roda em um loop infinito, com um universo compacto
|
| 33 |
-
e
|
| 34 |
"""
|
| 35 |
ponto_a = np.array([0., 0., 0.])
|
| 36 |
vetor_inercia = np.array([10., 10., 10.])
|
|
@@ -43,9 +42,7 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 43 |
while True:
|
| 44 |
ciclo_num += 1
|
| 45 |
|
| 46 |
-
|
| 47 |
-
# Alvos aleatórios em um espaço de -25 a 25 (4x menor que o anterior)
|
| 48 |
-
ponto_b = np.random.rand(3) * 50 - 25
|
| 49 |
|
| 50 |
ponto_controle = ponto_a + vetor_inercia
|
| 51 |
pontos_curva = [ponto_a, ponto_controle, ponto_b]
|
|
@@ -53,10 +50,10 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 53 |
|
| 54 |
novos_pontos_rastro = list(zip(x_ciclo, y_ciclo, z_ciclo))
|
| 55 |
historico_rastro.extend(novos_pontos_rastro)
|
| 56 |
-
max_rastro =
|
| 57 |
historico_rastro = historico_rastro[-max_rastro:]
|
| 58 |
|
| 59 |
-
tamanho_eco = 10
|
| 60 |
pontos_eco = list(zip(x_ciclo[-tamanho_eco:], y_ciclo[-tamanho_eco:], z_ciclo[-tamanho_eco:]))
|
| 61 |
vetor_inercia = aprender_com_o_eco_3d(pontos_eco)["velocity_vector"]
|
| 62 |
|
|
@@ -66,9 +63,12 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 66 |
ax.cla()
|
| 67 |
ax.xaxis.pane.fill = False; ax.yaxis.pane.fill = False; ax.zaxis.pane.fill = False
|
| 68 |
ax.grid(color='#222222', linestyle='--')
|
| 69 |
-
ax.view_init(elev=25., azim=angulo_camera + (len(historico_rastro) - len(x_ciclo) + frame) * 0.5) # Rotação de câmera mais rápida
|
| 70 |
|
| 71 |
-
# --- MUDANÇA
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
ax.set_xlim(-30, 30); ax.set_ylim(-30, 30); ax.set_zlim(-30, 30)
|
| 73 |
ax.set_xticklabels([]); ax.set_yticklabels([]); ax.set_zticklabels([])
|
| 74 |
|
|
@@ -84,26 +84,25 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 84 |
ax.text2D(0.05, 0.95, info_texto, transform=ax.transAxes, color='white', fontsize=10)
|
| 85 |
|
| 86 |
yield fig
|
| 87 |
-
|
| 88 |
-
time.sleep(0.01) # Pausa mínima para a UI respirar
|
| 89 |
|
| 90 |
ponto_a = ponto_b
|
| 91 |
|
| 92 |
plt.close(fig)
|
| 93 |
|
| 94 |
# --- Interface Gradio ---
|
| 95 |
-
with gr.Blocks(theme=gr.themes.Base(primary_hue="
|
| 96 |
gr.Markdown(
|
| 97 |
"""
|
| 98 |
-
# ⚡ Simulador Autônomo 3D (
|
| 99 |
-
|
| 100 |
-
por um universo compacto
|
| 101 |
"""
|
| 102 |
)
|
| 103 |
with gr.Row():
|
| 104 |
with gr.Column(scale=1):
|
| 105 |
-
angulo_camera_slider = gr.Slider(-180, 180, value=45, label="Ângulo
|
| 106 |
-
start_btn = gr.Button("🚀 Iniciar Simulação (
|
| 107 |
with gr.Column(scale=2):
|
| 108 |
plot_output = gr.Plot(label="Visualização em Tempo Real")
|
| 109 |
|
|
|
|
| 11 |
def bernstein_poly(i, n, t):
|
| 12 |
return comb(n, i) * (t**(i)) * ((1 - t)**(n - i))
|
| 13 |
|
| 14 |
+
def bezier_curve_3d(points, n_times=20): # 20 vetores para alta velocidade
|
|
|
|
| 15 |
n_points = len(points)
|
| 16 |
x_points, y_points, z_points = np.array([p[0] for p in points]), np.array([p[1] for p in points]), np.array([p[2] for p in points])
|
| 17 |
t = np.linspace(0.0, 1.0, n_times)
|
|
|
|
| 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 (Motor Hyperdrive com Ambiente Fixo) ---
|
| 28 |
|
| 29 |
def motor_da_simulacao_infinita(angulo_camera: int):
|
| 30 |
"""
|
| 31 |
+
Motor da simulação que roda em um loop infinito, com um universo compacto,
|
| 32 |
+
velocidade extrema e um AMBIENTE FIXO.
|
| 33 |
"""
|
| 34 |
ponto_a = np.array([0., 0., 0.])
|
| 35 |
vetor_inercia = np.array([10., 10., 10.])
|
|
|
|
| 42 |
while True:
|
| 43 |
ciclo_num += 1
|
| 44 |
|
| 45 |
+
ponto_b = np.random.rand(3) * 50 - 25 # Universo compacto
|
|
|
|
|
|
|
| 46 |
|
| 47 |
ponto_controle = ponto_a + vetor_inercia
|
| 48 |
pontos_curva = [ponto_a, ponto_controle, ponto_b]
|
|
|
|
| 50 |
|
| 51 |
novos_pontos_rastro = list(zip(x_ciclo, y_ciclo, z_ciclo))
|
| 52 |
historico_rastro.extend(novos_pontos_rastro)
|
| 53 |
+
max_rastro = 150
|
| 54 |
historico_rastro = historico_rastro[-max_rastro:]
|
| 55 |
|
| 56 |
+
tamanho_eco = 10
|
| 57 |
pontos_eco = list(zip(x_ciclo[-tamanho_eco:], y_ciclo[-tamanho_eco:], z_ciclo[-tamanho_eco:]))
|
| 58 |
vetor_inercia = aprender_com_o_eco_3d(pontos_eco)["velocity_vector"]
|
| 59 |
|
|
|
|
| 63 |
ax.cla()
|
| 64 |
ax.xaxis.pane.fill = False; ax.yaxis.pane.fill = False; ax.zaxis.pane.fill = False
|
| 65 |
ax.grid(color='#222222', linestyle='--')
|
|
|
|
| 66 |
|
| 67 |
+
# --- A MUDANÇA PRINCIPAL: AMBIENTE FIXO ---
|
| 68 |
+
# A câmera não gira mais com base no frame. Ela usa o ângulo fixo da UI.
|
| 69 |
+
ax.view_init(elev=30., azim=angulo_camera)
|
| 70 |
+
# ------------------------------------------
|
| 71 |
+
|
| 72 |
ax.set_xlim(-30, 30); ax.set_ylim(-30, 30); ax.set_zlim(-30, 30)
|
| 73 |
ax.set_xticklabels([]); ax.set_yticklabels([]); ax.set_zticklabels([])
|
| 74 |
|
|
|
|
| 84 |
ax.text2D(0.05, 0.95, info_texto, transform=ax.transAxes, color='white', fontsize=10)
|
| 85 |
|
| 86 |
yield fig
|
| 87 |
+
time.sleep(0.01)
|
|
|
|
| 88 |
|
| 89 |
ponto_a = ponto_b
|
| 90 |
|
| 91 |
plt.close(fig)
|
| 92 |
|
| 93 |
# --- Interface Gradio ---
|
| 94 |
+
with gr.Blocks(theme=gr.themes.Base(primary_hue="teal", secondary_hue="green")) as demo:
|
| 95 |
gr.Markdown(
|
| 96 |
"""
|
| 97 |
+
# ⚡ Simulador Autônomo 3D (Hyperdrive Estático)
|
| 98 |
+
Defina um ângulo para a câmera e clique em "Iniciar". O agente (bola) irá navegar em
|
| 99 |
+
**velocidade extrema** por um universo compacto com um **ponto de vista fixo**.
|
| 100 |
"""
|
| 101 |
)
|
| 102 |
with gr.Row():
|
| 103 |
with gr.Column(scale=1):
|
| 104 |
+
angulo_camera_slider = gr.Slider(-180, 180, value=45, label="Ângulo da Câmera (Fixo)")
|
| 105 |
+
start_btn = gr.Button("🚀 Iniciar Simulação (Ambiente Fixo)", variant="primary")
|
| 106 |
with gr.Column(scale=2):
|
| 107 |
plot_output = gr.Plot(label="Visualização em Tempo Real")
|
| 108 |
|