/* sphereh.c find coordinates of vertices and edge lengths */ /* of Buckminster Fuller sphere */ #include #include static double pi = 3.141592653589793238462643383279502884197; typedef struct{double x, y, z;} point; double dist(point p1, point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+ (p1.y-p2.y)*(p1.y-p2.y)+ (p1.z-p2.z)*(p1.z-p2.z)); } point norm(point p) { point c; double r = sqrt(p.x*p.x+p.y*p.y+p.z*p.z); c.x = p.x / r; c.y = p.y / r; c.z = p.z / r; return c; } point plus(point a, point b) { point c; c.x = a.x + b.x; c.y = a.y + b.y; c.z = a.z + b.z; return c; } point coord(double phi, double theta) { point c; c.x = sin(phi)*cos(theta); c.y = sin(phi)*sin(theta); c.z = cos(phi); /* down from vertical */ return c; } point rotate(point p) { point c; double sinp = sin(pi/5.0); /* rotate 36 degrees, pi/5.0 */ double cosp = cos(pi/5.0); c.x = p.x*cosp - p.y*sinp; c.y = p.y*cosp + p.x*sinp; c.z = -p.z; /* down from vertical */ return c; } int main(int argc, char *argv[]) { point vert[100]; int nvert = 1; /* .dat numbering starts with 1 */ int i, tvert; printf("sphereh.c Buckminster Fuller top half sphere\n"); vert[nvert].x = 0.0; /* top of sphere */ vert[nvert].y = 0.0; vert[nvert].z = 1.0; nvert++; /* top pentagon */ vert[nvert] = coord(pi/5.6751, 0.0*pi/5.0); nvert++; vert[nvert] = coord(pi/5.6751, 2.0*pi/5.0); nvert++; vert[nvert] = coord(pi/5.6751, 4.0*pi/5.0); nvert++; vert[nvert] = coord(pi/5.6751, 6.0*pi/5.0); nvert++; vert[nvert] = coord(pi/5.6751, 8.0*pi/5.0); nvert++; /* equator */ for(i=0; i<10; i++) { vert[nvert].x = cos(i*pi/5.0 + pi/10.0); vert[nvert].y = sin(i*pi/5.0 + pi/10.0); vert[nvert].z = 0.0; nvert++; } /* northern 1/2 */ vert[nvert] = norm(plus(plus(vert[2],vert[8]),plus(vert[3],vert[7]))); nvert++; vert[nvert] = norm(plus(plus(vert[3],vert[10]),plus(vert[4],vert[9]))); nvert++; vert[nvert] = norm(plus(plus(vert[4],vert[12]),plus(vert[5],vert[11]))); nvert++; vert[nvert] = norm(plus(plus(vert[5],vert[14]),plus(vert[6],vert[13]))); nvert++; vert[nvert] = norm(plus(plus(vert[6],vert[16]),plus(vert[2],vert[15]))); nvert++; /* northern 2/2 */ vert[nvert] = norm(plus(plus(plus(vert[2],vert[17]),plus(vert[7],vert[16])),vert[21])); nvert++; vert[nvert] = norm(plus(plus(plus(vert[3],vert[18]),plus(vert[9],vert[8])),vert[17])); nvert++; vert[nvert] = norm(plus(plus(plus(vert[4],vert[19]),plus(vert[11],vert[10])),vert[18])); nvert++; vert[nvert] = norm(plus(plus(plus(vert[5],vert[20]),plus(vert[13],vert[12])),vert[19])); nvert++; vert[nvert] = norm(plus(plus(plus(vert[6],vert[21]),plus(vert[15],vert[14])),vert[20])); nvert++; tvert = nvert; printf("top vertex number and coordinates \n"); for(i=1; i