Queria compartir el siguiente codigo que genera un Donut 3D (solo funciona en la terminal de Linux o la de MinGW) y mi intento por desofuscarlo.
Código (c) [Seleccionar]
k;double sin()
,cos();main(){float A=
0,B=0,i,j,z[1760];char b[
1760];printf("\x1b[2J");for(;;
){memset(b,32,1760);memset(z,0,7040)
;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
>i;i+=0.02){float c=sin(i),d=cos(j),e=
sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
h*e+f*g+5),l=cos (i),m=cos(B),n=s\
in(B),t=c*h*g-f* e;int x=40+30*D*
(l*h*m-t*n),y= 12+15*D*(l*h*n
+t*m),o=x+80*y, N=8*((f*e-c*d*g
)*m-c*d*e-f*g-l *d*n);if(22>y&&
y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
printf("\x1b[H");for(k=0;1761>k;k++)
putchar(k%80?b[k]:10);A+=0.04;B+=
0.02;}}/*****####*******!!=;:~
~::==!!!**********!!!==::-
.,~~;;;========;;;:~-.
..,--------,*/
Código (cpp) [Seleccionar]
#include <math.h>
#include <stdio.h>
#include <string.h>
#define PI 3.14
#define HEIGHT 22
#define WIDTH 80
const float R2 = 2; // Distancia del centro del Toroide a la mitad: ( ) |---(-. )
const char* illumination = ".,-~:;=!*#$@";
int main(){
float zbuffer[HEIGHT][WIDTH];
char framebuffer[HEIGHT][WIDTH];
float A = 0, C = 0; // Ejes X y Z sobre los que rota el Toroide
printf("\x1b[2J"); // Borrar Pantalla
while (true) {
memset(zbuffer, 0.0, HEIGHT * WIDTH * sizeof(float)); // Fondo a distancia infinita
memset(framebuffer, ' ', HEIGHT * WIDTH * sizeof(char)); // Pantalla vacia
for (float B = 0; B < 2 * PI; B += 0.07) // Eje Y sobre el que rota el Toroide
for (float phi = 0; phi < 2 * PI; phi += 0.02) { // Eje del toroide (perpendicular al centro)
float
sin_phi = sin(phi),
cos_phi = cos(phi),
sinA = sin(A),
cosA = cos(A),
sinB = sin(B),
cosB = cos(B),
sinC = sin(C),
cosC = cos(C),
// Solo otro par de valores que precalculamos
h = cosB + R2,
t = h * sin_phi * cosA - sinA * sinB,
// Distancia inversa del observador al centro del Toroide
D = 1 / (h * sin_phi * sinA + cosA * sinB + 5);
int
// Posicion de la pantalla donde se renderiza un punto del Toroide
x = 40 + 30 * D * (h * cos_phi * cosC - sinC * t),
y = 12 + 15 * D * (h * cos_phi * sinC + cosC * t),
/* La luz proviene de arriba y atras del observador (0, 1, -1)
que tiene modulo 2, hay 12 tonos de luz: 0..11, 11 / sqrt(2) = 8
L = 8 * (y - z); */
L = 8 * ((sinA * sinB - sin_phi * cosA * cosB) * cosC -
sin_phi * sinA * cosB - cosA * sinB - cos_phi * cosB * sinC);
// LAS MATRICES TIENEN INDICES i VERTICAL Y j HORIZONTAL
// MIENTRAS QUE LAS GRAFICAS TIENEN x HORIZONTAL E y VERTICAL
if (x > 0 && x < WIDTH && y > 0 && y < HEIGHT && zbuffer[y][x] < D) {
/* Si el punto actual es mas cercano a la pantalla que alguno calculado
previamente entonces sobrescribir al anterior */
if (L < 0) L = 0; // Sombra
framebuffer[y][x] = illumination[L];
zbuffer[y][x] = D; // Guardar profundidad
}
}
printf("\x1b[H"); // Mover el cursor a la esquina superior izquierda
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++)
putchar(framebuffer[i][j]); // Mostrar Toroide
putchar('\n');
}
A += 0.04;
C += 0.02;
}
return 0;
}