Os autoestereogramas de imagem única (SIRDS) utilizam a paralaxe binocular para criar a ilusão de profundidade tridimensional a partir de uma superfície bidimensional. Quando adaptados para ambientes de terminal ou interfaces de texto puro, essa técnica é conhecida como estereograma ASCII. Em vez de manipular pixels coloridos, o algoritmo desloca caracteres tipográficos com base em um mapa de profundidade matemático.
O princípio fundamental baseia-se na repetição de um padrão de texto com variações sutis de espaçamento horizontal. O cérebro humano funde essas repetições quando os olhos convergem ou divergem além do plano focal do monitor. A distância entre caracteres idênticos determina a profundidade percebida: deslocamentos menores fazem o objeto parecer mais próximo do observader, enquanto deslocamentos maiores o empurram para o plano de fundo.
Implementação do Algoritmo de Deslocamento
Para construir um estereograma em texto programaticamente, é necessário um mapa de profundidade (uma matriz bidimensional onde valores mais altos representam objetos mais próximos) e um conjunto de carcateres para o padrão de ruído. O algoritmo itera sobre cada linha, mantendo um buffer de referência. Para cada coluna, o caractere é copiado de uma posição anterior na mesma linha, ajustada dinamicamente pelo valer de profundidade.
import random
import string
def renderizar_autoestereograma(matriz_profundidade, alfabeto, largura_bloco=14):
total_linhas = len(matriz_profundidade)
total_colunas = len(matriz_profundidade[0])
malha_visual = []
for y in range(total_linhas):
linha_buffer = []
semente_aleatoria = [random.choice(alfabeto) for _ in range(largura_bloco)]
for x in range(total_colunas):
nivel_z = matriz_profundidade[y][x]
fator_deslocamento = max(1, int(nivel_z * 0.75))
indice_referencia = x - largura_bloco + fator_deslocamento
if indice_referencia < 0:
caractere_atual = semente_aleatoria[x % largura_bloco]
else:
caractere_atual = linha_buffer[indice_referencia]
linha_buffer.append(caractere_atual)
malha_visual.append("".join(linha_buffer))
return malha_visual
# Exemplo de uso com mapa de profundidade simples
mapa_z = [[0]*50 for _ in range(20)]
for i in range(5, 15):
for j in range(15, 35):
mapa_z[i][j] = 5 # Região elevada (mais próxima)
padrao_chars = string.ascii_uppercase + string.digits
resultado = renderizar_autoestereograma(mapa_z, padrao_chars)
for linha in resultado:
print(linha)
Padrões de Interferência e Renderização de Malha
A saída gerada pelo script resulta em blocos de texto que, à primeira vista, parecem ruído aleatório. Abaixo estão exemplos de como a manipulação de espaçamento de caracteres e a utilização de matrizes de pontos podem formar volumes ocultos. O primeiro bloco demonstra o deslocamento de texto contínuo, enquanto o segundo utiliza uma malha de pontos para projetar uma superfície esférica.
A8S2D5F9G3H6J1K4L7P0O3I8U5Y8T2R6E9W3Q7A4S1D8F5G2H3J6K9L2Z5X8
3B5N8V1C6X9ZW4E7R2T9Y5U1A8S2D5F9G3H6J1K4L7P0O3I8U5Y8T2R6E9W3
Q7A4S1D8F5G2H3J6K9L2Z5X8C1V4B7N0M3Q6X7K9P2M4Q8R1W4E7R2T9Y5U1
W4E7R2T9Y5U1A8S2D5F9G3H6J1K4L7P0O3I8U5Y8T2R6E9W3Q7A4S1D8F5G2
H3J6K9L2Z5X8C1V4B7N0M3Q6X7K9P2M4Q8R13B5N8V1C6X9ZW4E7R2T9Y5U1
C1V4B7N0M3Q6X7K9P2M4Q8R1W4E7R2T9Y5U1A8S2D5F9G3H6J1K4L7P0O3I8
X7K9P2M4Q8R13B5N8V1C6X9ZW4E7R2T9Y5U1A8S2D5F9G3H6J1K4L7P0O3I8
U5Y8T2R6E9W3Q7A4S1D8F5G2H3J6K9L2Z5X8C1V4B7N0M3Q6X7K9P2M4Q8R1
J1K4L7P0O3I8U5Y8T2R6E9W3Q7A4S1D8F5G2H3J6K9L2Z5X8C1V4B7N0M3Q6
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . .
. . . .
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
. . . .
. . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .