/////////////
// Output
/////////////
                     ####
                  ### #  #
               ###    #   #
            ####      #    ##
          ##         #     ##
         ##          #       ##
         # ##        #         #
        ##  #       ##          ##
        #    ##     ##            #
        #      #    #             ##
        #       #   #               #
       #         ###              ###
       #          ##           #### #
       #           ##       ####    #
      #           ## ##   ###       #
      #           #   # ##         #
      #         ## #   #           #
     #       ###   ## ##           #
     #    ####       ##           #
     # ####           ##          #
     ###              ###         #
     #               #   #       #
      ##             #    #      #
       #            ##     ##    #
        ##          ##       #  ##
          #         #        ## #
           #        #          ##
            ##     #         ###
             ##    #      ####
               #   #    ###
                #  # ###
                 ####

/////////////
// Compile
/////////////

gcc ascii_cube.c -lm

/////////////
// ascii_cube.c
/////////////

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>

void line(double a, double b, double c, double d){

        double dx,dy;
        printf("\033[36m"); //Cyan color

        for (double i = 1; i < 18; i++){
                dx = (c-a)*(i/18.0);
                dy = (d-b)*(i/18.0);

                printf("\033[%d;%dH",  (int)(b+dy),   (int)(a+dx));
                printf("#");
        }
}

void rotate(double* a, double* b, double theta){
        double s = sin(theta);
        double c = cos(theta);
        double aa = *a;
        double bb = *b;
        *a = aa*c + bb*s;
        *b = c*bb - s*aa;
}
int main() {
        srand(time(0));

        double x[8];
        double y[8];
        double z[8];
        double sz = 10.0;
        double p = 22;
        double q = 22;
        int loop = 0;

        x[0]=-sz; y[0]=-sz; z[0]=-sz;
        x[1]=sz;  y[1]=-sz; z[1]=-sz;
        x[2]=-sz; y[2]=sz;  z[2]=-sz;
        x[3]=sz;  y[3]=sz;  z[3]=-sz;

        x[4]=-sz; y[4]=-sz; z[4]=sz;
        x[5]=sz;  y[5]=-sz; z[5]=sz;
        x[6]=-sz; y[6]=sz;  z[6]=sz;
        x[7]=sz;  y[7]=sz;  z[7]=sz;

        double rotX = (rand() / (double) RAND_MAX - .5) / 1000;
        double rotY = (rand() / (double) RAND_MAX - .5) / 1000;

        while(1==1){
                loop=loop+1;

                line(x[0]+p, y[0]+q, x[1]+p, y[1]+q);
                line(x[0]+p, y[0]+q, x[2]+p, y[2]+q);
                line(x[0]+p, y[0]+q, x[4]+p, y[4]+q);
                line(x[3]+p, y[3]+q, x[1]+p, y[1]+q);
                line(x[3]+p, y[3]+q, x[2]+p, y[2]+q);
                line(x[3]+p, y[3]+q, x[7]+p, y[7]+q);
                line(x[6]+p, y[6]+q, x[2]+p, y[2]+q);
                line(x[6]+p, y[6]+q, x[4]+p, y[4]+q);
                line(x[6]+p, y[6]+q, x[7]+p, y[7]+q);
                line(x[5]+p, y[5]+q, x[7]+p, y[7]+q);
                line(x[5]+p, y[5]+q, x[4]+p, y[4]+q);
                line(x[5]+p, y[5]+q, x[1]+p, y[1]+q);

                for (int i = 0; i < 8; i++){
                        rotate(&x[i], &z[i], rotX);
                        rotate(&y[i], &z[i], rotY);
                }
                //Clear screen every 15 loops
                if (loop%15 == 0){
                    printf("\033[H\033[J");
                }
        }
}