Update app.py
Browse files
app.py
CHANGED
|
@@ -6,12 +6,13 @@ import math
|
|
| 6 |
from scipy.special import comb
|
| 7 |
import time
|
| 8 |
|
| 9 |
-
# --- Funções Matemáticas
|
|
|
|
| 10 |
def bernstein_poly(i, n, t):
|
| 11 |
return comb(n, i) * (t**(i)) * ((1 - t)**(n - i))
|
| 12 |
|
| 13 |
-
# --- MUDANÇA #1:
|
| 14 |
-
def bezier_curve_3d(points, n_times=
|
| 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,37 +25,38 @@ 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 (Motor
|
| 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
|
| 32 |
-
e
|
| 33 |
"""
|
| 34 |
-
ponto_a = np.array([
|
| 35 |
-
vetor_inercia = np.array([
|
| 36 |
historico_rastro = [ponto_a.tolist()]
|
| 37 |
|
| 38 |
-
fig = plt.figure(figsize=(
|
| 39 |
cor_fundo = '#0a0a0a'; fig.patch.set_facecolor(cor_fundo); ax.set_facecolor(cor_fundo)
|
| 40 |
|
| 41 |
ciclo_num = 0
|
| 42 |
while True:
|
| 43 |
ciclo_num += 1
|
| 44 |
|
| 45 |
-
# --- MUDANÇA #2: UNIVERSO
|
| 46 |
-
|
|
|
|
| 47 |
|
| 48 |
ponto_controle = ponto_a + vetor_inercia
|
| 49 |
pontos_curva = [ponto_a, ponto_controle, ponto_b]
|
| 50 |
-
x_ciclo, y_ciclo, z_ciclo = bezier_curve_3d(pontos_curva)
|
| 51 |
|
| 52 |
novos_pontos_rastro = list(zip(x_ciclo, y_ciclo, z_ciclo))
|
| 53 |
historico_rastro.extend(novos_pontos_rastro)
|
| 54 |
-
max_rastro =
|
| 55 |
historico_rastro = historico_rastro[-max_rastro:]
|
| 56 |
|
| 57 |
-
tamanho_eco =
|
| 58 |
pontos_eco = list(zip(x_ciclo[-tamanho_eco:], y_ciclo[-tamanho_eco:], z_ciclo[-tamanho_eco:]))
|
| 59 |
vetor_inercia = aprender_com_o_eco_3d(pontos_eco)["velocity_vector"]
|
| 60 |
|
|
@@ -64,10 +66,10 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 64 |
ax.cla()
|
| 65 |
ax.xaxis.pane.fill = False; ax.yaxis.pane.fill = False; ax.zaxis.pane.fill = False
|
| 66 |
ax.grid(color='#222222', linestyle='--')
|
| 67 |
-
ax.view_init(elev=
|
| 68 |
|
| 69 |
-
# --- MUDANÇA #2 (Continuação):
|
| 70 |
-
ax.set_xlim(-
|
| 71 |
ax.set_xticklabels([]); ax.set_yticklabels([]); ax.set_zticklabels([])
|
| 72 |
|
| 73 |
ax.scatter(*ponto_a, s=150, c='lime', alpha=0.7)
|
|
@@ -82,25 +84,26 @@ def motor_da_simulacao_infinita(angulo_camera: int):
|
|
| 82 |
ax.text2D(0.05, 0.95, info_texto, transform=ax.transAxes, color='white', fontsize=10)
|
| 83 |
|
| 84 |
yield fig
|
| 85 |
-
|
|
|
|
| 86 |
|
| 87 |
ponto_a = ponto_b
|
| 88 |
|
| 89 |
plt.close(fig)
|
| 90 |
|
| 91 |
-
# --- Interface Gradio
|
| 92 |
-
with gr.Blocks(theme=gr.themes.Base(primary_hue="
|
| 93 |
gr.Markdown(
|
| 94 |
"""
|
| 95 |
-
#
|
| 96 |
-
Clique em "Iniciar" para dar partida no motor da simulação. O agente
|
| 97 |
-
|
| 98 |
"""
|
| 99 |
)
|
| 100 |
with gr.Row():
|
| 101 |
with gr.Column(scale=1):
|
| 102 |
angulo_camera_slider = gr.Slider(-180, 180, value=45, label="Ângulo Inicial da Câmera")
|
| 103 |
-
start_btn = gr.Button("🚀 Iniciar Simulação
|
| 104 |
with gr.Column(scale=2):
|
| 105 |
plot_output = gr.Plot(label="Visualização em Tempo Real")
|
| 106 |
|
|
|
|
| 6 |
from scipy.special import comb
|
| 7 |
import time
|
| 8 |
|
| 9 |
+
# --- Funções Matemáticas ---
|
| 10 |
+
|
| 11 |
def bernstein_poly(i, n, t):
|
| 12 |
return comb(n, i) * (t**(i)) * ((1 - t)**(n - i))
|
| 13 |
|
| 14 |
+
# --- MUDANÇA #1: CICLOS ULTRA-RÁPIDOS (Menos Vetores) ---
|
| 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 |
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 velocidade de movimento extrema.
|
| 34 |
"""
|
| 35 |
+
ponto_a = np.array([0., 0., 0.])
|
| 36 |
+
vetor_inercia = np.array([10., 10., 10.])
|
| 37 |
historico_rastro = [ponto_a.tolist()]
|
| 38 |
|
| 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 |
ciclo_num = 0
|
| 43 |
while True:
|
| 44 |
ciclo_num += 1
|
| 45 |
|
| 46 |
+
# --- MUDANÇA #2: UNIVERSO COMPACTO ---
|
| 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]
|
| 52 |
+
x_ciclo, y_ciclo, z_ciclo = bezier_curve_3d(pontos_curva)
|
| 53 |
|
| 54 |
novos_pontos_rastro = list(zip(x_ciclo, y_ciclo, z_ciclo))
|
| 55 |
historico_rastro.extend(novos_pontos_rastro)
|
| 56 |
+
max_rastro = 150 # Rastro mais curto para um visual mais limpo
|
| 57 |
historico_rastro = historico_rastro[-max_rastro:]
|
| 58 |
|
| 59 |
+
tamanho_eco = 10 # Eco menor para trajetórias mais curtas
|
| 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 |
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 #2 (Continuação): Limites do gráfico para o universo compacto ---
|
| 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 |
|
| 75 |
ax.scatter(*ponto_a, s=150, c='lime', alpha=0.7)
|
|
|
|
| 84 |
ax.text2D(0.05, 0.95, info_texto, transform=ax.transAxes, color='white', fontsize=10)
|
| 85 |
|
| 86 |
yield fig
|
| 87 |
+
# --- MUDANÇA #3: ATUALIZAÇÃO MAIS RÁPIDA ---
|
| 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="red")) as demo:
|
| 96 |
gr.Markdown(
|
| 97 |
"""
|
| 98 |
+
# ⚡ Simulador Autônomo 3D (Modo Hyperdrive)
|
| 99 |
+
Clique em "Iniciar" para dar partida no motor da simulação. O agente irá navegar em **velocidade extrema**
|
| 100 |
+
por um universo compacto, gerando novos alvos aleatórios em um loop infinito.
|
| 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 |
+
start_btn = gr.Button("🚀 Iniciar Simulação (Hyperdrive)", variant="primary")
|
| 107 |
with gr.Column(scale=2):
|
| 108 |
plot_output = gr.Plot(label="Visualização em Tempo Real")
|
| 109 |
|