There is no word to say, we would like to share this Amazing 3D Spinning Donut by Andy Sloane . This full post explains what is mathematic behind this. Please visit his awesome post here. There is also another video of his codes by Professor Lex Fridman here.
We just made few changes on codes for the C++ Builder Console VCL Application, it runs well as in original.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
void rotate_donut_3D(void) { // Originally Code by Andy Sloane https://www.a1k0n.net/2011/07/20/donut-math.html int k; //by Andy Sloane system("cls"); //C++ Builder 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;}/*****####*******!!=;:~ ~::==!!!**********!!!==::- .,~~;;;========;;;:~-. ..,--------,*/ } |
To apply this awesome code;
1. Create a new C++ Builder Console Application. Choice VCL Framework, and modify lines as below;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <vcl.h> #include <windows.h> #pragma hdrstop #pragma argsused #include <tchar.h> #include <stdio.h> void rotate_donut_3D(void) { // Originally Code by Andy Sloane https://www.a1k0n.net/2011/07/20/donut-math.html int k; //by Andy Sloane system("cls"); //C++ Builder 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;}/*****####*******!!=;:~ ~::==!!!**********!!!==::- .,~~;;;========;;;:~-. ..,--------,*/ } int _tmain(int argc, _TCHAR* argv[]) { rotate_donut_3D(); return 0; } |
2. Hit F9. You will see that donut rotates in 3D form in console as below. You will see blend of mathematics and art of programming.
This procedure is running well on C++ Builder Console Application with FireMonkey Framework too;
To do this code on C++ Builder FMX Project;
1. Create a new C++ Builder Console Application. Choice FMX Framework, and modify lines as same like above;
2. Hit F9. You will see that donut rotates in 3D form in console as below. You will se blend of mathematics and art of programming.
It is also possible to run this code on Visual VCL or FMX applications, it may require some more changes in its procedure to show on Memo. In C++ Builder it is also possible to draw texts or shapes on a bitmap image which may make it much more smooth.