Skip to content

Instantly share code, notes, and snippets.

@gcr
Created July 11, 2011 00:27
Show Gist options
  • Select an option

  • Save gcr/1075131 to your computer and use it in GitHub Desktop.

Select an option

Save gcr/1075131 to your computer and use it in GitHub Desktop.
int 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 sini=sin(i),
cosj=cos(j),
sinA=sin(A),
sinj=sin(j),
cosA=cos(A),
cosj2=cosj+2,
mess=1/(sini*cosj2*sinA+sinj*cosA+5),
cosi=cos(i),
cosB=cos(B),
sinB=sin(B),
t=sini*cosj2*cosA-sinj* sinA;
int x=40+30*mess*(cosi*cosj2*cosB-t*sinB),
y= 12+15*mess*(cosi*cosj2*sinB +t*cosB),
o=x+80*y,
N=8*((sinj*sinA-sini*cosj*cosA)*cosB-sini*cosj*sinA-sinj*cosA-cosi *cosj*sinB);
if(22>y&&y>0&&x>0&&80>x&&mess>z[o]){
z[o]=mess;
b[o]=".,-~:;=!*#$@"[N>0?N:0];
}
}
}
printf("\x1b[d");
for(k=0; 1761>k; k++)
putchar(k%80?b[k]:10);
A+=0.04;
B+= 0.02;
}
}
@GillesSchippers
Copy link
Copy Markdown

in windows this donut spins way too slow

@mohamdhashim
Copy link
Copy Markdown

in windows this donut spins way too slow

to change rotation speed just decrease or increase the increment of A & B in the last 2 lines of code

@MishkatHossain
Copy link
Copy Markdown

how, am I suppose to run it in code block??
Its giving an infinite loop and does not stay in the frame;
what should I do?

I used all these header file;
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <unistd.h>

@serhatdog
Copy link
Copy Markdown

how, am I suppose to run it in code block??
Its giving an infinite loop and does not stay in the frame;
what should I do?

I used all these header file;
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <unistd.h>

replace printf("\x1b[2J"); with system("cls");

@Keksoj
Copy link
Copy Markdown

Keksoj commented Dec 18, 2021

Hi guys,

The headers should probably be present in the code with comments to explain wether they are necessary or not.

I had this issue:

➤ gcc donut.c
/usr/bin/ld: /tmp/ccvhXcuq.o: in function `main':
donut.c:(.text+0xb1): undefined reference to `sin'
/usr/bin/ld: donut.c:(.text+0xd8): undefined reference to `cos'
/usr/bin/ld: donut.c:(.text+0xff): undefined reference to `sin'
/usr/bin/ld: donut.c:(.text+0x126): undefined reference to `sin'
/usr/bin/ld: donut.c:(.text+0x14d): undefined reference to `cos'
/usr/bin/ld: donut.c:(.text+0x1df): undefined reference to `cos'
/usr/bin/ld: donut.c:(.text+0x206): undefined reference to `cos'
/usr/bin/ld: donut.c:(.text+0x22d): undefined reference to `
collect2: error: ld returned 1 exit status

solved here on Stack Overflow with doing:

gcc donut.c -lm

and now it works.

I now you guys are proficient in C, but please think of the noobs like me who can't have their donuts for lack of knowledge and frustration.

@sugamkarki
Copy link
Copy Markdown

@Keksoj thanks man!

@aliquazi1009
Copy link
Copy Markdown

@Kareem-negm You can write in python like this, n if n>0 else 0

@0FFSTYLE
Copy link
Copy Markdown

0FFSTYLE commented Mar 5, 2022

#include<stdio.h>
#include<string.h>
int k;
double sin() ,cos();
int 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 sini=sin(i),
cosj=cos(j),
sinA=sin(A),
sinj=sin(j),
cosA=cos(A),
cosj2=cosj+2,
mess=1/(sinicosj2sinA+sinjcosA+5),
cosi=cos(i),
cosB=cos(B),
sinB=sin(B),
t=sini
cosj2cosA-sinj sinA;
int x=40+30mess(cosicosj2cosB-tsinB),
y= 12+15
mess*(cosicosj2sinB +tcosB),
o=x+80
y,
N=8*((sinjsinA-sinicosjcosA)cosB-sinicosjsinA-sinjcosA-cosi cosjsinB);
if(22>y&&y>0&&x>0&&80>x&&mess>z[o]){
z[o]=mess;
b[o]=".,-~:;=!
#$@"[N>0?N:0];
}
}
}
printf("\x1b[d");
for(k=0; 1761>k; k++)
putchar(k%80?b[k]:10);
A+=0.04;
B+= 0.02;
}
}

//'gcc -o dount donut.c -lm'
// '/ .dount'

//enjoy

@sujal-luhar
Copy link
Copy Markdown

int x=40+30mess(cosicosj2cosB-tsinB),
y= 12+15
mess*(cosicosj2sinB +tcosB),
o=x+80
y,

I can't understand here what is the meaning of magic numbers: 30, 15 & 80?
can anyone explain me plz!!!

@Ekk-0
Copy link
Copy Markdown

Ekk-0 commented Mar 9, 2022

You have to change the A and B's values at the end of the code:
A+=0.002;
B+= 0.001;
This worked for me.

@Solar-Stacer
Copy link
Copy Markdown

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

int k;
double sin(), cos();
int main()
{
float A = 0, B = 0, i, j, z[1760];
char b[1760];
system("cls");
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 sini = sin(i),
cosj = cos(j),
sinA = sin(A),
sinj = sin(j),
cosA = cos(A),
cosj2 = cosj + 2,
mess = 1 / (sini * cosj2 * sinA + sinj * cosA + 5),
cosi = cos(i),
cosB = cos(B),
sinB = sin(B),
t = sini * cosj2 * cosA - sinj * sinA;
int x = 40 + 30 * mess * (cosi * cosj2 * cosB - t * sinB),
y = 12 + 15 * mess * (cosi * cosj2 * sinB + t * cosB),
o = x + 80 * y,
N = 8 * ((sinj * sinA - sini * cosj * cosA) * cosB - sini * cosj * sinA - sinj * cosA - cosi * cosj * sinB);
if (22 > y && y > 0 && x > 0 && 80 > x && mess > z[o])
{
z[o] = mess;
b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];
}
}
}
printf("\x1b[d");
for (k = 0; 1761 > k; k++)
putchar(k % 80 ? b[k] : 10);
A += 0.08;
B += 0.06;
}
}

This code is what worked for me and made the spin a little bit faster

@gem-ai
Copy link
Copy Markdown

gem-ai commented Aug 7, 2022

How can i change the FOV and the distance to the viewer of the donut?
and somehow usleep nor changing the A B in 36,37 slow the spin for me, but decreasing i+= and j+= in 14,15 did it for me.

@serhatdog
Copy link
Copy Markdown

How can written [N > 0 ? N : 0]; with python

[N if N > 0 else 0]
or
[0, N][N > 0]

@Rudxain
Copy link
Copy Markdown

Rudxain commented Sep 6, 2022

Copy link
Copy Markdown

ghost commented Sep 29, 2022

thank you so much it did finaly work

@SWATcomi
Copy link
Copy Markdown

How can I make it spin slower

@youcantseeyong
Copy link
Copy Markdown

./donut : The term './donut' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:2 char:1

  • ./donut
  •   + CategoryInfo          : ObjectNotFound: (./donut:String) [], CommandNotFoundException
      + FullyQualifiedErrorId : CommandNotFoundException
    

what happen with dis?

@Rudxain
Copy link
Copy Markdown

Rudxain commented Dec 25, 2022

@youcantseeken it seems you haven't compiled "donut.c", or the compiled .exe isn't located in the same working-directory as the terminal

@hirendhola
Copy link
Copy Markdown

**
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <unistd.h>

int main() {
float A = 0, B = 0;
float i, j;
int k;
float z[1760];
char b[1760];
printf("\x1b[2J");
for (;;) {
memset(b, 32, 1760);
memset(z, 0, 7040);
for (j = 0; j < 6.28; j += 0.07) {
for (i = 0; i < 6.28; i += 0.02) {
float c = sin(i);
float d = cos(j);
float e = sin(A);
float f = sin(j);
float g = cos(A);
float h = d + 2;
float D = 1 / (c * h * e + f * g + 5);
float l = cos(i);
float m = cos(B);
float n = sin(B);
float t = c * h * g - f * e;
int x = 40 + 30 * D * (l * h * m - t * n);
int y = 12 + 15 * D * (l * h * n + t * m);
int o = x + 80 * y;
int 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; k < 1761; k++) {
putchar(k % 80 ? b[k] : 10);
A += 0.00004;
B += 0.00002;
}
usleep(30000);
}
return 0;
}

**

@ahnaf12c
Copy link
Copy Markdown

My code runs, but thereseems to be a flickering issue.

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

int k;
double sin(), cos();
int 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 sini = sin(i),
cosj = cos(j),
sinA = sin(A),
sinj = sin(j),
cosA = cos(A),
cosj2 = cosj + 2,
mess = 1 / (sini * cosj2 * sinA + sinj * cosA + 5),
cosi = cos(i),
cosB = cos(B),
sinB = sin(B),
t = sini * cosj2 * cosA - sinj * sinA;
int x = 40 + 30 * mess * (cosi * cosj2 * cosB - t * sinB),
y = 12 + 15 * mess * (cosi * cosj2 * sinB + t * cosB),
o = x + 80 * y,
N = 8 * ((sinj * sinA - sini * cosj * cosA) * cosB - sini * cosj * sinA - sinj * cosA - cosi * cosj * sinB);
if (22 > y && y > 0 && x > 0 && 80 > x && mess > z[o])
{
z[o] = mess;
b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];
}
}
}
system("cls");
for (k = 0; 1761 > k; k++)
putchar(k % 80 ? b[k] : 10);
A += 0.08;
B += 0.03;
}
}

@brunocrt
Copy link
Copy Markdown

brunocrt commented Jan 10, 2024

@Empitrix
Copy link
Copy Markdown

Empitrix commented Jul 9, 2024

in windows this donut spins way too slow

use clang compiler it's a little better than gcc or zig cc.

@abirHossin-99
Copy link
Copy Markdown

system("cls");

that gives an error

@Lord8877kk
Copy link
Copy Markdown

Lord8877kk commented Dec 13, 2025

in windows this donut spins way too slow

to change rotation speed just decrease or increase the increment of A & B in the last 2 lines of code

I just found a quick solution to make it faster on windows (using claude to help me)
and it used fwrite instead of using putchar
here is the full code :

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <windows.h>

int main() {
    float A = 0, B = 0;
    float i, j;
    int k;
    float z[1760];
    char b[1760];
    
    // Set console to UTF-8 for better performance
    SetConsoleOutputCP(CP_UTF8);
    
    printf("\x1b[2J");
    for(;;) {
        memset(b,32,1760);
        memset(z,0,7040);
        for(j=0; j < 6.28; j += 0.07) {
            for(i=0; i < 6.28; i += 0.02) {
                float c = sin(i);
                float d = cos(j);
                float e = sin(A);
                float f = sin(j);
                float g = cos(A);
                float h = d + 2;
                float D = 1 / (c * h * e + f * g + 5);
                float l = cos(i);
                float m = cos(B);
                float n = sin(B);
                float t = c * h * g - f * e;
                int x = 40 + 30 * D * (l * h * m - t * n);
                int y= 12 + 15 * D * (l * h * n + t * m);
                int o = x + 80 * y;
                int 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");
        
        // Use fwrite instead of putchar for better performance
        for(k = 0; k < 1760; k++) {
            if(k % 80 == 79) {
                b[k] = '\n';
            }
        }
        fwrite(b, 1, 1760, stdout);
        fflush(stdout);
        
        A += 0.08 ;
        B += 0.04 ;
        
        Sleep(30);
    }
    return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment