Carlexxx commited on
Commit
c270a81
·
verified ·
1 Parent(s): 0b28d7d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -144
app.py CHANGED
@@ -1,22 +1,11 @@
1
 
2
 
3
- # --- ORÁCULO DA CONTINUIDADE ---
4
- # Um laboratório interativo para o Teorema das Crianças
5
- # By Carlex & Gemini
6
- #
7
- # OBJETIVO:
8
- # Demonstrar visualmente como a continuidade de movimento pode ser alcançada
9
- # a partir de informação parcial (um "eco"). O sistema aprende a "inércia"
10
- # final de uma trajetória (Criança A) e a usa como condição inicial para
11
- # gerar uma nova trajetória suave e coerente (Criança B).
12
-
13
- import gradio as gr
14
  import numpy as np
15
  import matplotlib.pyplot as plt
16
  import math
17
  from scipy.special import comb
18
 
19
- # --- Funções Matemáticas (O Coração do Teorema) ---
20
 
21
  def bernstein_poly(i, n, t):
22
  """ O polinômio de Bernstein, base para as curvas de Bézier. """
@@ -27,166 +16,111 @@ def bezier_curve(points, n_times=1000):
27
  n_points = len(points)
28
  x_points = np.array([p[0] for p in points])
29
  y_points = np.array([p[1] for p in points])
30
-
31
  t = np.linspace(0.0, 1.0, n_times)
32
  polynomial_array = np.array([bernstein_poly(i, n_points - 1, t) for i in range(0, n_points)])
33
-
34
  x_vals = np.dot(x_points, polynomial_array)
35
  y_vals = np.dot(y_points, polynomial_array)
36
-
37
  return x_vals, y_vals
38
 
39
  def aprender_com_o_eco(pontos_do_eco: list) -> dict:
40
- """
41
- Calcula a essência do movimento (direção e vetor) do eco.
42
- Esta é a função de "aprendizado" da Criança B.
43
- """
44
  if len(pontos_do_eco) < 2:
45
  return {"bearing_rad": 0, "velocity_vector": np.array([0, 0])}
46
-
47
- p1 = np.array(pontos_do_eco[0]) # Ponto de início da observação
48
- p2 = np.array(pontos_do_eco[-1]) # Ponto final da observação (ponto de handover)
49
-
50
  vetor_velocidade = p2 - p1
51
- delta_x, delta_y = vetor_velocidade
52
- bearing_radianos = math.atan2(delta_y, delta_x)
53
-
54
- return {
55
- "bearing_rad": bearing_radianos,
56
- "velocity_vector": vetor_velocidade
57
- }
58
 
59
- # --- Função Principal do Gradio (A Interface do Oráculo) ---
60
 
61
- def gerar_grafico_continuidade(p_inflexao_x, p_inflexao_y, p_b_x, p_b_y, tamanho_eco_percent=15):
62
  """
63
- Gera e plota a jornada completa das duas crianças, com a Criança B
64
- completando sua trajetória até um destino final.
65
  """
66
- # Pontos de controle da jornada
67
- PONTO_A = np.array([0, 0])
68
- PONTO_INFLEXAO = np.array([p_inflexao_x, p_inflexao_y])
69
- PONTO_B = np.array([p_b_x, p_b_y])
70
- PONTO_C_DESTINO = np.array([100, 100]) # O destino final da Criança B
 
 
 
 
71
 
72
- # 1. Gerar a curva da Criança A usando Bézier
73
- pontos_curva_a = [PONTO_A, PONTO_INFLEXAO, PONTO_B]
74
- x_a, y_a = bezier_curve(pontos_curva_a, n_times=1000)
75
 
76
- # 2. Isolar o Eco (a memória parcial)
77
- tamanho_eco_int = int(len(x_a) * (tamanho_eco_percent / 100))
78
- if tamanho_eco_int < 2: tamanho_eco_int = 2 # Garante um eco mínimo para o cálculo
 
 
 
 
 
 
 
79
 
80
- x_eco = x_a[-tamanho_eco_int:]
81
- y_eco = y_a[-tamanho_eco_int:]
 
82
  pontos_do_eco = list(zip(x_eco, y_eco))
83
 
84
- # 3. Criança B aprende com o Eco, extraindo a inércia do movimento
85
  essencia_movimento = aprender_com_o_eco(pontos_do_eco)
86
  vetor_aprendido = essencia_movimento["velocity_vector"]
87
 
88
- # 4. Gerar a curva da Criança B (A Jornada Completa)
89
- # O ponto de controle que define a tangente de saída de B é B + vetor_aprendido.
90
- # Este ponto "puxa" a curva na direção correta, garantindo a suavidade.
91
- ponto_controle_b = PONTO_B + vetor_aprendido
92
 
93
- # A curva da Criança B agora vai do Ponto B ao Ponto C (Destino),
94
- # sendo guiada pelo ponto de controle que representa a inércia aprendida.
95
- pontos_curva_b = [PONTO_B, ponto_controle_b, PONTO_C_DESTINO]
 
 
96
  x_b, y_b = bezier_curve(pontos_curva_b, n_times=1000)
97
-
98
- # 5. Plotagem e Visualização
99
- plt.style.use('dark_background')
100
- fig, ax = plt.subplots(figsize=(10, 10))
101
-
102
- # Plot das Curvas das Crianças
103
- ax.plot(x_a, y_a, label='Caminho da Criança A', color='cyan', linewidth=2.5, zorder=5)
104
- ax.plot(x_b, y_b, label='Continuidade da Criança B (Gerado)', color='lime', linewidth=2.5, linestyle='--', zorder=5)
105
 
106
- # Destaque do Eco de Aprendizado
107
- ax.plot(x_eco, y_eco, label=f'Eco de Aprendizado ({tamanho_eco_percent}%)', color='magenta', linewidth=5, zorder=10)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
- # Plot da Estrutura de Controle (para fins didáticos)
110
- pontos_de_controle_completos = np.array([PONTO_A, PONTO_INFLEXAO, PONTO_B, ponto_controle_b, PONTO_C_DESTINO])
111
- ax.plot(pontos_de_controle_completos[:, 0], pontos_de_controle_completos[:, 1], 'o--', color='lightcoral', markersize=8, alpha=0.6, label='Estrutura de Controle', zorder=2)
112
 
113
- # Destaque dos Pontos Principais
114
- ax.plot(PONTO_B[0], PONTO_B[1], 'o', color='yellow', markersize=12, markeredgecolor='black', label='Ponto de Handover (B)', zorder=15)
115
- ax.plot(PONTO_C_DESTINO[0], PONTO_C_DESTINO[1], 'X', color='red', markersize=12, markeredgecolor='white', label='Destino Final (C)', zorder=15)
116
-
117
- # Anotação do Vetor de Inércia Aprendido
118
- ax.annotate(f'Vetor de Inércia\n({vetor_aprendido[0]:.1f}, {vetor_aprendido[1]:.1f})',
119
- xy=PONTO_B,
120
- xytext=(PONTO_B[0] + 5, PONTO_B[1] + 15),
121
- arrowprops=dict(facecolor='yellow', shrink=0.05, width=1.5, headwidth=10, connectionstyle="arc3,rad=.2"),
122
- fontsize=11, color='yellow',
123
- bbox=dict(boxstyle="round,pad=0.3", fc="black", ec="yellow", lw=1),
124
- zorder=20)
125
-
126
- # Configurações Finais do Gráfico
127
- ax.set_title('O Oráculo da Continuidade: Jornada Completa', fontsize=18, pad=20)
128
- ax.legend(loc='best')
129
- ax.grid(True, linestyle='--', alpha=0.2)
130
  ax.set_aspect('equal', adjustable='box')
131
- ax.set_xlabel("Eixo X")
132
- ax.set_ylabel("Eixo Y")
133
-
134
- # Salva a figura para o Gradio exibir
135
- caminho_figura = "continuidade_completa.png"
136
- plt.savefig(caminho_figura, bbox_inches='tight', pad_inches=0.1, dpi=120, transparent=True)
137
- plt.close(fig)
138
 
139
- return caminho_figura
140
-
141
- # --- Interface Gradio ---
142
-
143
- with gr.Blocks(theme=gr.themes.Soft(primary_hue="cyan", secondary_hue="orange")) as demo:
144
- gr.Markdown(
145
- """
146
- # 🔮 O Oráculo da Continuidade
147
- ### Um laboratório interativo para o Teorema das Crianças
148
- Defina a trajetória da "Criança A" especificando dois pontos de controle. O Oráculo irá calcular a "inércia" do movimento final
149
- e gerar a continuação da "Criança B" até o destino final, garantindo uma transição perfeitamente suave.
150
- """
151
- )
152
-
153
- with gr.Row():
154
- with gr.Column(scale=1):
155
- gr.Markdown("**1. Defina o Caminho da Criança A**")
156
- gr.Markdown("O caminho começa em `[0,0]`, passa pelo `Ponto de Inflexão` e termina no `Ponto B`.")
157
-
158
- p_inflexao_x = gr.Slider(-100, 100, value=25, label="Ponto de Inflexão (X)")
159
- p_inflexao_y = gr.Slider(-100, 100, value=75, label="Ponto de Inflexão (Y)")
160
-
161
- p_b_x = gr.Slider(-100, 100, value=50, label="Ponto B (Final da Criança A)")
162
- p_b_y = gr.Slider(-100, 100, value=50, label="Ponto B (Final da Criança A)")
163
-
164
- tamanho_eco_percent = gr.Slider(1, 50, value=15, step=1, label="Tamanho do Eco de Aprendizado (%)")
165
-
166
- run_button = gr.Button("Gerar Continuidade", variant="primary")
167
-
168
- with gr.Column(scale=2):
169
- gr.Markdown("**2. Observe a Continuidade Gerada**")
170
- output_plot = gr.Image(label="Gráfico da Jornada", type="filepath")
171
-
172
- run_button.click(
173
- fn=gerar_grafico_continuidade,
174
- inputs=[p_inflexao_x, p_inflexao_y, p_b_x, p_b_y, tamanho_eco_percent],
175
- outputs=output_plot
176
- )
177
-
178
- gr.Examples(
179
- examples=[
180
- [50, 100, 100, 0, 10],
181
- [-50, 50, 0, 100, 20],
182
- [80, 20, 40, 90, 5],
183
- [25, -75, 75, -25, 30]
184
- ],
185
- inputs=[p_inflexao_x, p_inflexao_y, p_b_x, p_b_y, tamanho_eco_percent],
186
- outputs=output_plot,
187
- fn=gerar_grafico_continuidade,
188
- cache_examples=True
189
- )
190
 
 
191
  if __name__ == "__main__":
192
- demo.launch()
 
1
 
2
 
 
 
 
 
 
 
 
 
 
 
 
3
  import numpy as np
4
  import matplotlib.pyplot as plt
5
  import math
6
  from scipy.special import comb
7
 
8
+ # --- Funções Matemáticas (O Coração do Teorema - sem alterações) ---
9
 
10
  def bernstein_poly(i, n, t):
11
  """ O polinômio de Bernstein, base para as curvas de Bézier. """
 
16
  n_points = len(points)
17
  x_points = np.array([p[0] for p in points])
18
  y_points = np.array([p[1] for p in points])
 
19
  t = np.linspace(0.0, 1.0, n_times)
20
  polynomial_array = np.array([bernstein_poly(i, n_points - 1, t) for i in range(0, n_points)])
 
21
  x_vals = np.dot(x_points, polynomial_array)
22
  y_vals = np.dot(y_points, polynomial_array)
 
23
  return x_vals, y_vals
24
 
25
  def aprender_com_o_eco(pontos_do_eco: list) -> dict:
26
+ """ Calcula a essência do movimento (direção e vetor) do eco. """
 
 
 
27
  if len(pontos_do_eco) < 2:
28
  return {"bearing_rad": 0, "velocity_vector": np.array([0, 0])}
29
+ p1, p2 = np.array(pontos_do_eco[0]), np.array(pontos_do_eco[-1])
 
 
 
30
  vetor_velocidade = p2 - p1
31
+ bearing_radianos = math.atan2(vetor_velocidade[1], vetor_velocidade[0])
32
+ return {"bearing_rad": bearing_radianos, "velocity_vector": vetor_velocidade}
 
 
 
 
 
33
 
34
+ # --- Simulação com os Dados de Entrada Fornecidos ---
35
 
36
+ def simular_jornada_especifica():
37
  """
38
+ Executa a simulação com os pontos-chave definidos pelo Arquiteto
39
+ e plota o resultado.
40
  """
41
+ # 1. DEFINIÇÃO DOS PONTOS DA JORNADA
42
+ # A trajetória da Criança A é definida por estes 4 vetores (pontos)
43
+ p1 = np.array([0, 0]) # Vetor x1, y=0
44
+ p2 = np.array([25, 15]) # Vetor x2, y=15 (Assumindo um X para visualização)
45
+ p3 = np.array([50, 30]) # Vetor x3, y=30 (Assumindo um X para visualização)
46
+ p4_encontro = np.array([75, 45]) # Vetor x4, y=45 (Ponto de Handover)
47
+
48
+ # O destino da Criança B
49
+ p5_destino = np.array([100, 90]) # Vetor final, y=90 (Assumindo um X para o destino)
50
 
51
+ # Número de pontos a serem usados como "eco de memória"
52
+ NUMERO_DE_VETORES_ECO = 150 # Equivalente a 15% de 1000 pontos
 
53
 
54
+ print(f"--- DADOS DE ENTRADA ---")
55
+ print(f"Caminho da Criança A definido por: {p1}, {p2}, {p3}, {p4_encontro}")
56
+ print(f"Destino da Criança B: {p5_destino}")
57
+ print(f"Número de vetores no Eco de Memória: {NUMERO_DE_VETORES_ECO}")
58
+ print("------------------------\n")
59
+
60
+ # 2. GERAR A CURVA DA CRIANÇA A
61
+ # Usamos os 4 pontos para criar uma curva de Bézier cúbica, mais complexa.
62
+ pontos_curva_a = [p1, p2, p3, p4_encontro]
63
+ x_a, y_a = bezier_curve(pontos_curva_a, n_times=1000)
64
 
65
+ # 3. ISOLAR O ECO
66
+ x_eco = x_a[-NUMERO_DE_VETORES_ECO:]
67
+ y_eco = y_a[-NUMERO_DE_VETORES_ECO:]
68
  pontos_do_eco = list(zip(x_eco, y_eco))
69
 
70
+ # 4. CRIANÇA B APRENDE COM O ECO
71
  essencia_movimento = aprender_com_o_eco(pontos_do_eco)
72
  vetor_aprendido = essencia_movimento["velocity_vector"]
73
 
74
+ print("--- APRENDIZADO DA CRIANÇA B ---")
75
+ print(f"Vetor de Inércia aprendido no Eco: ({vetor_aprendido[0]:.2f}, {vetor_aprendido[1]:.2f})")
76
+ print(f"Direção final da Criança A: {math.degrees(essencia_movimento['bearing_rad']):.2f} graus")
77
+ print("------------------------------\n")
78
 
79
+ # 5. GERAR A CURVA DA CRIANÇA B
80
+ # O ponto de controle que define a tangente de saída é o ponto de encontro + o vetor aprendido
81
+ ponto_controle_b = p4_encontro + vetor_aprendido
82
+ # A curva vai do ponto de encontro ao destino, guiada pelo ponto de controle
83
+ pontos_curva_b = [p4_encontro, ponto_controle_b, p5_destino]
84
  x_b, y_b = bezier_curve(pontos_curva_b, n_times=1000)
 
 
 
 
 
 
 
 
85
 
86
+ # 6. PLOTAGEM COM FUNDO PRETO E EIXOS VISÍVEIS
87
+ fig, ax = plt.subplots(figsize=(12, 9))
88
+ fig.patch.set_facecolor('black')
89
+ ax.set_facecolor('black')
90
+
91
+ # Configuração dos eixos para serem visíveis
92
+ ax.spines['bottom'].set_color('white')
93
+ ax.spines['left'].set_color('white')
94
+ ax.spines['top'].set_color('black')
95
+ ax.spines['right'].set_color('black')
96
+ ax.tick_params(axis='x', colors='white')
97
+ ax.tick_params(axis='y', colors='white')
98
+
99
+ # Plot das curvas
100
+ ax.plot(x_a, y_a, label='Caminho da Criança A', color='cyan', linewidth=2)
101
+ ax.plot(x_b, y_b, label='Continuidade da Criança B', color='lime', linewidth=2, linestyle='--')
102
 
103
+ # Destaque do Eco
104
+ ax.plot(x_eco, y_eco, label=f'Eco de Memória ({NUMERO_DE_VETORES_ECO} vetores)', color='magenta', linewidth=4)
 
105
 
106
+ # Plot dos pontos chave
107
+ pontos_chave = np.array([p1, p2, p3, p4_encontro, p5_destino])
108
+ ax.plot(pontos_chave[:,0], pontos_chave[:,1], 'o', color='red', markersize=8, label='Pontos-Chave Definidos')
109
+ ax.plot(p4_encontro[0], p4_encontro[1], 'o', color='yellow', markersize=10, label='Ponto de Encontro')
110
+
111
+ # Títulos e legendas
112
+ ax.set_title('Demonstração do Teorema da Continuidade', color='white', fontsize=16)
113
+ ax.set_xlabel('Eixo X', color='white', fontsize=12)
114
+ ax.set_ylabel('Eixo Y', color='white', fontsize=12)
115
+ legend = ax.legend(facecolor='gray', edgecolor='white', framealpha=0.1)
116
+ for text in legend.get_texts():
117
+ text.set_color('white')
118
+
119
+ ax.grid(True, linestyle='--', color='gray', alpha=0.5)
 
 
 
120
  ax.set_aspect('equal', adjustable='box')
 
 
 
 
 
 
 
121
 
122
+ plt.show()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
+ # --- Execução do Script ---
125
  if __name__ == "__main__":
126
+ simular_jornada_especifica()