Código
0,B=0,i,j,z[1760];char b[ 1760];printf("\x1b[2J");for(;; ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28 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];}}/*#****!!-*/ 0.02;}}/*****####*******!!=;:~ ~::==!!!**********!!!==::- .,~~;;;========;;;:~-. ..,--------,*/
Código
#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; }