/* See {Icosahedron.h} */ #include /* Last edited on 2007-02-03 13:47:50 by stolfi */ #define Icosahedron_C_COPYRIGHT \ "Copyright © 2000,2007 Universidade Estadual de Campinas (UNICAMP)" #include #include #include #include #include #include #include #include #include TwentyPlaces_t OldMakeIcosahedronTriang(void) { EightPlaces_t a[20]; TwentyPlaces_t b; /* this variable will be retuned */ int i; for (i = 0; i < 20; i++) { a[i] = MakeTetraTopo(1,1); } /* first level */ Glue(Spin(a[ 1].p[1]), a[ 0].p[0], 1, TRUE); Glue(Spin(a[ 2].p[1]), a[ 1].p[0], 1, TRUE); Glue(Spin(a[ 3].p[1]), a[ 2].p[0], 1, TRUE); Glue(Spin(a[ 4].p[1]), a[ 3].p[0], 1, TRUE); Glue(Spin(a[ 0].p[1]), a[ 4].p[0], 1, TRUE); /* next level */ Glue(Spin(a[ 0].p[3]), a[5].p[2], 1, TRUE); Glue(Spin(a[ 1].p[3]), a[6].p[2], 1, TRUE); Glue(Spin(a[ 2].p[3]), a[7].p[2], 1, TRUE); Glue(Spin(a[ 3].p[3]), a[8].p[2], 1, TRUE); Glue(Spin(a[ 4].p[3]), a[9].p[2], 1, TRUE); Glue(Spin(a[10].p[1]), a[5].p[0], 1, TRUE); Glue(Spin(a[ 6].p[1]), PrevE(a[10].p[7]), 1, TRUE); Glue(Spin(a[11].p[1]), a[ 6].p[0], 1, TRUE); Glue(Spin(a[ 7].p[1]), PrevE(a[11].p[7]), 1, TRUE); Glue(Spin(a[12].p[1]), a[ 7].p[0], 1, TRUE); Glue(Spin(a[ 8].p[1]), PrevE(a[12].p[7]), 1, TRUE); Glue(Spin(a[13].p[1]), a[ 8].p[0], 1, TRUE); Glue(Spin(a[ 9].p[1]), PrevE(a[13].p[7]), 1, TRUE); Glue(Spin(a[14].p[1]), a[ 9].p[0], 1, TRUE); Glue(Spin(a[ 5].p[1]), PrevE(a[14].p[7]), 1, TRUE); /* Last level */ Glue(Spin(NextE(a[10].p[0])), a[15].p[2], 1, TRUE); Glue(Spin(NextE(a[11].p[0])), a[16].p[2], 1, TRUE); Glue(Spin(NextE(a[12].p[0])), a[17].p[2], 1, TRUE); Glue(Spin(NextE(a[13].p[0])), a[18].p[2], 1, TRUE); Glue(Spin(NextE(a[14].p[0])), a[19].p[2], 1, TRUE); Glue(Spin(a[16].p[1]), a[15].p[0], 1, TRUE); Glue(Spin(a[17].p[1]), a[16].p[0], 1, TRUE); Glue(Spin(a[18].p[1]), a[17].p[0], 1, TRUE); Glue(Spin(a[19].p[1]), a[18].p[0], 1, TRUE); Glue(Spin(a[15].p[1]), a[19].p[0], 1, TRUE); for (i = 0; i < 5; i++) { b.p[i] = a[i].p[2]; } for (i = 5; i < 10; i++) { b.p[i] = a[i].p[3]; } for (i = 10; i < 15; i++) { b.p[i] = a[i].p[3]; } for (i = 15; i < 20; i++) { b.p[i] = a[i].p[3]; } return b; } Place_t MakeIcosahedron(void) /* From MakePlatonic.c */ { /* Create twenty triangles {a[0..19]}: */ Place_t a[20]; int i; for (i = 0; i < 20; i++) { a[i] = MakeTriangle(); } /* Glue triangles in first level: */ for (i = 0; i < 5; i++) { SetNextF(PrevE(a[i]), Clock(NextE(a[(i+1) % 5]))); SetNextF(a[i+5], Clock(a[i])); } /* Glue triangles in second level: */ for (i = 5; i < 10; i++) { if (i == 9) {SetNextF(NextE(a[i]), Clock(NextE(a[10]))); } else { SetNextF(NextE(a[i]), Clock(NextE(a[i+6]))); } } for (i = 5; i < 10; i++) { SetNextF(PrevE(a[i]), Clock(PrevE(a[i+5]))); } /* Glue triangles in third level: */ for (i = 10; i < 15; i++) { SetNextF(a[i+5], Clock(a[i])); } for (i = 15; i < 19; i++) { SetNextF(NextE(a[i]), Clock(PrevE(a[i+1]))); } SetNextF(NextE(a[19]), Clock(PrevE(a[15]))); for (i = 0; i < 20; i++) { SetOrgAll(a[i], OrgV(a[i])); SetOrgAll(NextE(a[i]), OrgV(NextE(a[i]))); SetOrgAll(PrevE(a[i]), OrgV(PrevE(a[i]))); } return a[0]; } TwentyPlaces_t MakeIcosahedronTriang(bool_t original) { EightPlaces_t a[20]; TwentyPlaces_t b; /* this variable will be retuned */ int i; for (i = 0; i < 20; i++) { a[i] = MakeTetraTopo(1,1); } /* inside the first level */ Glue(Spin(a[1].p[1]), a[0].p[0], 1, TRUE); Glue(Spin(a[2].p[1]), a[1].p[0], 1, TRUE); Glue(Spin(a[3].p[1]), a[2].p[0], 1, TRUE); Glue(Spin(a[4].p[1]), a[3].p[0], 1, TRUE); Glue(Spin(a[0].p[1]), a[4].p[0], 1, TRUE); /* between the first and second level */ Glue(Spin(a[0].p[3]), a[5].p[2], 1, TRUE); Glue(Spin(a[1].p[3]), a[6].p[2], 1, TRUE); Glue(Spin(a[2].p[3]), a[7].p[2], 1, TRUE); Glue(Spin(a[3].p[3]), a[8].p[2], 1, TRUE); Glue(Spin(a[4].p[3]), a[9].p[2], 1, TRUE); /* inside the second level */ Glue(Spin(NextE(a[10].p[1])), a[ 5].p[0], 1, TRUE); Glue( Spin(a[ 6].p[1]), NextE(a[10].p[0]), 1, TRUE); Glue(Spin(NextE(a[11].p[1])), a[ 6].p[0], 1, TRUE); Glue( Spin(a[ 7].p[1]), NextE(a[11].p[0]), 1, TRUE); Glue(Spin(NextE(a[12].p[1])), a[ 7].p[0], 1, TRUE); Glue( Spin(a[ 8].p[1]), NextE(a[12].p[0]), 1, TRUE); Glue(Spin(NextE(a[13].p[1])), a[ 8].p[0], 1, TRUE); Glue( Spin(a[ 9].p[1]), NextE(a[13].p[0]), 1, TRUE); Glue(Spin(NextE(a[14].p[1])), a[ 9].p[0], 1, TRUE); Glue( Spin(a[ 5].p[1]), NextE(a[14].p[0]), 1, TRUE); /* between the second and third level */ Glue (Spin(a[10].p[3]), a[15].p[2], 1, TRUE); Glue (Spin(a[11].p[3]), a[16].p[2], 1, TRUE); Glue (Spin(a[12].p[3]), a[17].p[2], 1, TRUE); Glue (Spin(a[13].p[3]), a[18].p[2], 1, TRUE); Glue (Spin(a[14].p[3]), a[19].p[2], 1, TRUE); /* inside the third level */ Glue(Spin(a[16].p[1]), a[15].p[0], 1, TRUE); Glue(Spin(a[17].p[1]), a[16].p[0], 1, TRUE); Glue(Spin(a[18].p[1]), a[17].p[0], 1, TRUE); Glue(Spin(a[19].p[1]), a[18].p[0], 1, TRUE); Glue(Spin(a[15].p[1]), a[19].p[0], 1, TRUE); /* Rescue the @places to be returned */ for (i = 0; i < 5; i++){ b.p[i] = a[i].p[2]; } for (i = 5; i < 10; i++){ b.p[i] = a[i].p[3]; } for (i = 10; i < 15; i++){ b.p[i] = a[i].p[2]; } for (i = 15; i < 20; i++){ b.p[i] = a[i].p[3]; } if (original) { /* emphasize the original elements */ SetExWallsOfEdge(a[0].p[1], FALSE); SetExEdge(a[0].p[1], FALSE); SetExWallsOfEdge(a[15].p[1], FALSE); SetExEdge(a[15].p[1], FALSE); SetExNode(a[15].p[1], FALSE); for (i = 0; i < 5; i++) { SetExWallsOfEdge(NextE(a[i].p[1]), FALSE); } for (i = 5; i < 10; i++) { SetExEdge(PrevE(a[i].p[1]), FALSE); } for (i = 15; i < 20; i++) { SetExWallsOfEdge(PrevE(a[i].p[1]), FALSE); SetExEdge(PrevE(a[i].p[1]), FALSE); } } /* Check some assertions: */ for (i = 0; i < 5; i++) { assert(NextF(b.p[i+5]) == Spin(b.p[i]));} for (i = 10; i < 15; i++) { assert(NextF(b.p[i+5]) == Spin(b.p[i])); } return b; } Place_t MakeIcosahedronTriang1(void) { TwentyPlaces_t twp = MakeIcosahedronTriang(FALSE); return twp.p[0]; } #define Icosahedron_C_author \ "Modula-3 procedures created by L. A. P. Lozada, 2000.\n" \ "Modification history:\n" \ " 24-01-2007 : Converted to C by J. Stolfi;\n" \ " got {MakeIcosahedron} from {MakePlatonic.c};\n" \ " got {OldMakeIcosahedronTriang}, {MakeIcosahedronTriang}\n" \ " from {Squared.c}."