Desofuscar codigo

Iniciado por _TTFH_3500, 22 Noviembre 2018, 03:17 AM

0 Miembros y 1 Visitante están viendo este tema.

_TTFH_3500

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.


             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;
}