Skip to content

Instantly share code, notes, and snippets.

@jarvist
Created April 27, 2012 17:41
Show Gist options
  • Save jarvist/2511138 to your computer and use it in GitHub Desktop.
Save jarvist/2511138 to your computer and use it in GitHub Desktop.
Generates a 'pi trumpet' with circles coloured by the base 12 digits of Pi, circles shrinking as you go along the series.
/* C99 so compile with 'c99 -o pi pi.c'
/* From http://www.codecodex.com/wiki/Calculate_digits_of_pi#C */
#include "stdio.h"
#include "stdlib.h"
//now generates in base 12...
#define SCALE 12 //4096 //8*8*8*8
#define ARRINIT 2 //1024
void pi_digits(int digits) {
int carry = 0;
int digit;
float radius=250; float X=500, Y=500;
int arr[digits + 1];
for (int i = 0; i <= digits; ++i)
arr[i] = ARRINIT;
for (int i = digits; i > 0; i-= 14) {
int sum = 0;
for (int j = i; j > 0; --j) {
sum = sum * j + SCALE * arr[j];
arr[j] = sum % (j * 2 - 1);
sum /= j * 2 - 1;
}
printf(" <circle cx=\"%f\" cy=\"%f\" r=\"%f\" fill=\"",X,Y,radius);
// Colours: http://www.rapidtables.com/web/color/Web_Color.htm
digit=carry + sum / SCALE;
switch(digit){
case 0: printf("#FF3333"); break;
case 1: printf("#FF9933"); break;
case 2: printf("#FFFF33"); break;
case 3: printf("#99FF33"); break;
case 4: printf("#33FF33"); break;
case 5: printf("#33FF99"); break;
case 6: printf("#33FFFF"); break;
case 7: printf("#3399FF"); break;
case 8: printf("#3333FF"); break;
case 9: printf("#9933FF"); break;
case 10: printf("#FF33FF"); break;
case 11: printf("#FF3399"); break;
}
printf("\"/>\n");
//printf("%01X", carry + sum / SCALE);
radius/=1.02;
X+=radius/20;
//X+=radius*0.005*(digit-5.5);
//Y-=radius*0.005*(digit-5.5);
carry = sum % SCALE;
}
}
int main(int argc, char** argv) {
int n = argc == 2 ? atoi(argv[1]) : 10000;
printf("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n");
pi_digits(n);
printf("</svg>\n");
return 0;
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
/* C99 so compile/run with c99 -o pi pi.c -lm && ./pi > pi.svg
/* From http://www.codecodex.com/wiki/Calculate_digits_of_pi#C */
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
//now generates in base 12...
#define SCALE 6 //4096 //8*8*8*8
#define ARRINIT 2 //1024
//varying base checks against generator:
//http://www.virtuescience.com/pi-in-other-bases.html
void pi_digits(int digits) {
int carry = 0;
int digit,colour=1,delta;
float radius=300; float X=500, Y=500;
float spiraltheta=0.0, spiralradius=300;
int arr[digits + 1];
for (int i = 0; i <= digits; ++i)
arr[i] = ARRINIT;
for (int i = digits; i > 0; i-= 14) {
int sum = 0;
for (int j = i; j > 0; --j) {
sum = sum * j + SCALE * arr[j];
arr[j] = sum % (j * 2 - 1);
sum /= j * 2 - 1;
}
X-=400; Y-=400;
spiralradius=hypot(X,Y)/1.02;
spiraltheta=spiraltheta-0.3;
X=spiralradius*cos(spiraltheta);
Y=spiralradius*sin(spiraltheta);
X+=400; Y+=400;
printf(" <circle cx=\"%f\" cy=\"%f\" r=\"%f\" fill=\"",X,Y,radius);
digit=carry + sum / SCALE;
//colour wheel info:
//http://msdn.microsoft.com/en-us/library/bb263947(v=vs.85).aspx
//deltas are which direction to jump on 12-member colourwheel
if (digit==0) delta=6; //Compl
if (digit==1) delta=+5; //Split Compl
if (digit==2) delta=-5; //Split Compl
if (digit==3) delta=+4; //Triad
if (digit==4) delta=-4; //Triad
if (digit==5) delta=1; //similar
colour=(colour+delta+12)%12;
// fprintf(stderr,"%d %d %d \t", digit,delta,colour);
fprintf(stderr,"%d ",digit);
//colours from here: http://www.rapidtables.com/web/color/Web_Color.htm
switch(colour){
case 0: printf("#FF3333"); break;
case 1: printf("#FF9933"); break;
case 2: printf("#FFFF33"); break;
case 3: printf("#99FF33"); break;
case 4: printf("#33FF33"); break;
case 5: printf("#33FF99"); break;
case 6: printf("#33FFFF"); break;
case 7: printf("#3399FF"); break;
case 8: printf("#3333FF"); break;
case 9: printf("#9933FF"); break;
case 10: printf("#FF33FF"); break;
case 11: printf("#FF3399"); break;
}
printf("\"/>\n");
//printf("%01X", carry + sum / SCALE);
radius/=1.03;
//X+=radius/20;
//X+=radius*0.005*(digit-5.5);
//Y-=radius*0.005*(digit-5.5);
carry = sum % SCALE;
}
}
int main(int argc, char** argv) {
int n = argc == 2 ? atoi(argv[1]) : 20000;
printf("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n");
pi_digits(n);
printf("</svg>\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment