#include #include #include typedef double R; typedef struct{R x; R y; R z;} P; typedef struct{char a; char b; char c;} T; // typedef struct{R m[3][3];} M; static R t; P q[12]; static int ndx = 0; T Q[20]; static int ndq = 0; static void w(R x, R y, R z){q[ndx++] = (P){x, y, z}; assert(fabs(x*x + y*y + z*z - (1+t*t)) < 1.e-15);} // R sq(R x){return x*x;} static void v(R o, R t){w(o, t, 0); w(t, 0, o); w(0, o, t);} static void x(R o){v(o, t); v(o, -t);} static R ip(int i, int j){return q[i].x*q[j].x + q[i].y*q[j].y + q[i].z*q[j].z;} static int ln(int i, int j){return (fabs(ip(i, j) - (1 - t*t)) < 1.e-15);} static int tri(int i, int j, int k){return ln(i, j) && ln(i, k) && ln(j, k);} R det(P a, P b, P c){ return a.x*(b.y*c.z - b.z*c.y) + a.y*(b.z*c.x - b.x*c.z) + a.z*(b.x*c.y - b.y*c.x);} void initIcosa(){t = 0.5*(sqrt(5) - 1); x(1); x(-1); assert (ndx==12); if(0) for(int j=0; j<12; ++j) printf("%2d %10.7f %10.7f %10.7f\n", j, q[j].x, q[j].y, q[j].z); {int n=0; int vc[12]; for(int k=0; k<12; ++k) vc[k]=0; for(int i=0; i<12; ++i) for(int j=i+1; j<12; ++j) for(int k=j+1; k<12; ++k) if(tri(i, j, k)) {++n; R v = det(q[i], q[j], q[k]); assert(fabs(fabs(v) - (sqrt(5)-1)) < 1.e-15); Q[ndq++] = (v<0)? (T){i, k, j}:(T){i, j, k}; ++vc[i]; ++vc[j]; ++vc[k];} assert(n==20); for(int y=0; y<12; ++y) assert(vc[y] == 5);} if(0) for(int i=0; i<20; ++i) printf("%2d %2d %2d %2d\n", i, Q[i].a, Q[i].b, Q[i].c); } // Unit test: #if 0 int main(){initIcosa(); return 0;} #endif