Skip to content

One of the most beautiful and old ASCII animations on C by Andy Sloane

Notifications You must be signed in to change notification settings

Fifirex/donut.c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 

Repository files navigation

Donut math: how donut.c works

This famous code was written by Andy Sloane. It was written in the year 2006 but has recently been re surfacing on the internet.

This beautiful and elegant code has great mathematical principles. It is also one of the most famous ASCII animations.

This is the code:

                                       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;}}/*****####*******!!=;:~
                                 ~::==!!!**********!!!==::-
                                   .,~~;;;========;;;:~-.
                                       ..,--------,*/

…and the animated output, on my terminal is:

Alt Text

At its core, it’s a framebuffer and a Z-buffer into which the pixels are render. Since it’s just rendering relatively low-resolution ASCII art, its a cheeky cheat. All it does is plot pixels along the surface of the torus at fixed-angle increments, and does it densely enough that the final result looks solid. The “pixels” it plots are ASCII characters corresponding to the illumination value of the surface at each point: .,-~:;=!*#$@ from dimmest to brightest. No raytracing required.

The Javascript source for both the ASCII and canvas rendering is right here.

The complete explanation is provided by the creator himself at a1k0n.net

About

One of the most beautiful and old ASCII animations on C by Andy Sloane

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages