User:AndrewKepert/poly.pov

This is my modification of user:Cyp's povray macros. I don't know (yet) how to upload a .pov file - wikipedia complains that it is not a known image type. Oh well. It also screws up with html encoding. (too bad!)

Progress
Updated 01:37, 5 Nov 2004 (UTC) to include more cut+paste polyhedra and a new optimisation procedure to get the "sporadic" ones -- currently only the Snub_disphenoid.

Updated 00:14, 8 Nov 2004 (UTC)
 * Further sporadic Johnson solids (See Talk:Johnson solid) J85, J86, J88, J89
 * A rudimentary automatic-framing solution to minimise excess whitespace. This means a whole stack of poorly-framed images will need redoing.

Todo

 * Modify augment(n,a,b,c) to work with n=4,5 (square, pentagonal pyramid) n=6,8,10 (cupolae)
 * Finish sporadics using optimise
 * Finish set of cuboctahedron modifications (very similar to work already done)
 * Many not very interesting polyhedra from putting cupolae on various faces of archimedean solids.

//Picture  ***  Use flashiness=1 !!! *** // //  +w1024 +h1024 +a0.3 +am2 //  +w512 +h512 +a0.3 +am2 // //Movie  ***  Use flashiness=0.25 !!! *** // //  +kc +kff120 +w256 +h256 +a0.3 +am2 //  +kc +kff60 +w256 +h256 +a0.3 +am2 //"Fast" preview //  +w128 +h128 //PLATONIC SOLIDS *********** //tetrahedron #declare rotation=seed(1889/*1894*/); //hexahedron #declare rotation=seed(7122); //octahedron #declare rotation=seed(4193); //dodecahedron #declare rotation=seed(4412); //icosahedron #declare rotation=seed(7719); //weirdahedron #declare rotation=seed(7412); //ARCHIMEDIAN SOLIDS *********** //cuboctahedron #declare rotation=seed(1941); //icosidodecahedron #declare rotation=seed(2241); //truncatedtetrahedron(0) #declare rotation=seed(8717); //truncatedhexahedron(0) #declare rotation=seed(1345); //truncatedoctahedron #declare rotation=seed(7235); //truncateddodecahedron(0) #declare rotation=seed(9374); //truncatedicosahedron #declare rotation=seed(1666); //rhombicuboctahedron #declare rotation=seed(6124); //truncatedcuboctahedron #declare rotation=seed(1156); //rhombicosidodecahedron #declare rotation=seed(8266); //truncatedicosidodecahedron #declare rotation=seed(1422); //snubhexahedron(-1) #declare rotation=seed(7152); //snubhexahedron(1) #declare rotation=seed(1477); //snubdodecahedron(-1) #declare rotation=seed(5111); //snubdodecahedron(1) #declare rotation=seed(8154); //CATALAN SOLIDS *********** //rhombicdodecahedron #declare rotation=seed(7154); //rhombictriacontahedron #declare rotation=seed(1237); //triakistetrahedron #declare rotation=seed(7735); //triakisoctahedron #declare rotation=seed(5354); //tetrakishexahedron #declare rotation=seed(1788); //triakisicosahedron #declare rotation=seed(1044); //pentakisdodecahedron #declare rotation=seed(6100); //deltoidalicositetrahedron #declare rotation=seed(5643); //disdyakisdodecahedron #declare rotation=seed(1440); //deltoidalhexecontahedron #declare rotation=seed(1026); //disdyakistriacontahedron #declare rotation=seed(1556); //pentagonalicositetrahedron(-1) #declare rotation=seed(7771); //pentagonalicositetrahedron(1) #declare rotation=seed(3470); //pentagonalhexecontahedron(-1) #declare rotation=seed(1046); //pentagonalhexecontahedron(1) #declare rotation=seed(1096); //PRISMS, ANTIPRISMS, ETC... ***********  //rprism(5) #declare rotation=seed(6620); //antiprism(5) #declare rotation=seed(6620); //bipyramid(5) #declare rotation=seed(6620); //trapezohedron(17) #declare rotation=seed(6620); // JOHNSON SOLIDS (AGK) //square_pyramid #declare rotation=seed(84); // J1     //pentagonal_pyramid #declare rotation=seed(11); //  J2     //triangular_cupola #declare rotation=seed(11);  //  J3     //square_cupola #declare rotation=seed(19);  //  J4     //pentagonal_cupola #declare rotation=seed(19);  //  J5     //pentagonal_rotunda #declare rotation=seed(4);  //  J6     //elongated_pyramid(3) #declare rotation=seed(444);// J7     //elongated_pyramid(4) #declare rotation=seed(444);// J8     //elongated_pyramid(5) #declare rotation=seed(444);// J9     //gyroelongated_square_pyramid #declare rotation=seed(6621); //  J10 //gyroelongated_pentagonal_pyramid #declare rotation=seed(6621); // J11 //dipyramid(3) #declare rotation=seed(654);// J12 //dipyramid(5) #declare rotation=seed(654);// J13 //elongated_dipyramid(3) #declare rotation=seed(654);// J14 //elongated_dipyramid(4) #declare rotation=seed(654);// J15 //elongated_dipyramid(5) #declare rotation=seed(654);// J16 //gyroelongated_square_dipyramid #declare rotation=seed(6621);  //  J17 //elongated_triangular_cupola #declare rotation=seed(112358);   //J18 //elongated_square_cupola #declare rotation=seed(333);  //  J19 //elongated_pentagonal_cupola #declare rotation=seed(333);  //J20 //elongated_pentagonal_rotunda #declare rotation=seed(4);   //  J21 //gyroelongated_triangular_cupola #declare rotation=seed(112358);       //J22 //gyroelongated_square_cupola #declare rotation=seed(333);  //  J23 //gyroelongated_pentagonal_cupola #declare rotation=seed(333);  //J24 //gyroelongated_pentagonal_rotunda #declare rotation=seed(4);   //  J25 //gyrobifastigium #declare rotation=seed(112358);   //  J26 //triangular_orthobicupola #declare rotation=seed(112358);  //J27 //square_orthobicupola #declare rotation=seed(333); //  J28 //square_gyrobicupola #declare rotation=seed(333);  //  J29 //pentagonal_orthobicupola #declare rotation=seed(333); //J30 //pentagonal_gyrobicupola #declare rotation=seed(333);  //J31 //pentagonal_orthocupolarotunda #declare rotation=seed(4);  //J32 //pentagonal_gyrocupolarotunda #declare rotation=seed(4);   //J33 //pentagonal_orthobirotunda #declare rotation=seed(4);  //  J34 //elongated_triangular_orthobicupola #declare rotation=seed(112358); //J35 //elongated_triangular_gyrobicupola #declare rotation=seed(112358); //J36 //elongated_square_gyrobicupola #declare rotation=seed(333); // J37 //elongated_pentagonal_orthobicupola #declare rotation=seed(333);   //J38 //elongated_pentagonal_gyrobicupola #declare rotation=seed(333); //J39 //icosidodecahedron_mod(40) #declare rotation=seed(4); //J40: elongated_pentagonal_orthocupolarotunda //icosidodecahedron_mod(41) #declare rotation=seed(4); //J41: elongated_pentagonal_gyrocupolarotunda //elongated_pentagonal_orthobirotunda #declare rotation=seed(4); // J42 //elongated_pentagonal_gyrobirotunda #declare rotation=seed(4); //  J43 //gyroelongated_triangular_bicupola #declare rotation=seed(112358); //J44 //gyroelongated_square_bicupola #declare rotation=seed(333); // J45 //gyroelongated_pentagonal_bicupola #declare rotation=seed(333); //J46 //icosidodecahedron_mod(47) #declare rotation=seed(4); //J47: gyroelongated_pentagonal_cupolarotunda //gyroelongated_pentagonal_birotunda #declare rotation=seed(4); //  J48 //augmented_triangular_prism #declare rotation=seed(88);// J49 //biaugmented_triangular_prism #declare rotation=seed(88);// J50 //triaugmented_triangular_prism #declare rotation=seed(88);// J51 //augmented_pentagonal_prism #declare rotation=seed(5555);// J52 //biaugmented_pentagonal_prism #declare rotation=seed(5555);// J53 //augmented_hexagonal_prism #declare rotation=seed(5555);// J54 //parabiaugmented_hexagonal_prism #declare rotation=seed(5555);// J55 //metabiaugmented_hexagonal_prism #declare rotation=seed(5555);// J56 //triaugmented_hexagonal_prism #declare rotation=seed(5555);// J56 //augmented_dodecahedron #declare rotation=seed(4412);  //  J58 //parabiaugmented_dodecahedron #declare rotation=seed(4412); // J59 ////metabiaugmented_dodecahedron #declare rotation=seed(4412);  //  J60 //triaugmented_dodecahedron #declare rotation=seed(4412);   //  J61 //metabidiminished_icosahedron #declare rotation=seed(6621); // J62 //tridiminished_icosahedron #declare rotation=seed(6621);   //  J63 //augmented_tridiminished_icosahedron #declare rotation=seed(6621); //  J64 //truncatedtetrahedron(1) #declare rotation=seed(13); // J65 augmented_truncated_tetrahedron.png //truncatedhexahedron(1) #declare rotation=seed(1345); // J66 augmented_truncated_cube.png //truncatedhexahedron(2) #declare rotation=seed(1345); // J67 biaugmented_truncated_cube.png //truncateddodecahedron(1) #declare rotation=seed(19); // J68 augmented_truncated_dodecahedron.png //truncateddodecahedron(-2) #declare rotation=seed(19);   // J69 parabiaugmented_truncated_dodecahedron.png //truncateddodecahedron(2) #declare rotation=seed(19); // J70 metabiaugmented_truncated_dodecahedron.png truncateddodecahedron(3) #declare rotation=seed(19);  // J71 triaugmented_truncated_dodecahedron.png //mogrified_rhombicosidodecahedron("G...") #declare rotation=seed(19); // J72 gyrate_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("G..G") #declare rotation=seed(19); // J73 parabigyrate_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("GG..") #declare rotation=seed(19); // J74 metabigyrate_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("GGG.") #declare rotation=seed(19); // J75 trigyrate_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("D...") #declare rotation=seed(19); // J76 diminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("D..G") #declare rotation=seed(19); // J77 paragyrate_diminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("DG..") #declare rotation=seed(19); // J78 metagyrate_diminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("GDG.") #declare rotation=seed(19); // J79 bigyrate_diminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("D..D") #declare rotation=seed(19); // J80 parabidiminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("DD..") #declare rotation=seed(19); // J81 metabidiminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("GDD.") #declare rotation=seed(19); // J82 gyrate_bidiminished_rhombicosidodecahedron.png //mogrified_rhombicosidodecahedron("DDD.") #declare rotation=seed(19); // J83 tridiminished_rhombicosidodecahedron.png //gyrate_rhombicosidodecahedron #declare rotation=seed(19); //  J72 //trigyrate_rhombicosidodecahedron #declare rotation=seed(19);  //J75 //diminished_rhombicosidodecahedron #declare rotation=seed(19); //  J76 //parabidiminished_rhombicosidodecahedron #declare rotation=seed(19);   //J80 //metabidiminished_rhombicosidodecahedron #declare rotation=seed(19);   //J81 //tridiminished_rhombicosidodecahedron #declare rotation=seed(19);  //  J83 //snub_disphenoid #declare rotation=seed(142);  //  J84 //snub_square_antiprism #declare rotation=seed(418); // J85 //sphenocorona #declare rotation=seed(11);  //  J86 //augmented_sphenocorona #declare rotation=seed(11); // J87 //sphenomegacorona #declare rotation=seed(11);  //  J88 //hebesphenomegacorona #declare rotation=seed(11);  //  J89 //disphenocingulum #declare rotation=seed(11);  //  J90 //bilunabirotunda #declare rotation=seed(10); // J91 //triangular_hebesphenorotunda #declare rotation=seed(855); // J92 #end addpointsevensgn(<1,1,1>) autoface #end addpointssgn(<1,1,1>,<1,1,1>) autoface #end addevenpermssgn(<1,0,0>,<1,0,0>) autoface #end addpointssgn(<1,1,1>,<1,1,1>) addevenpermssgn(<0,1/tau,tau>,<0,1,1>) autoface #end addevenpermssgn(<0,1,tau>,<0,1,1>) autoface #end addpermssgn(<1,2,3>,<1,1,1>) autoface #end addevenpermssgn(<0,1,1>,<0,1,1>) autoface #end addevenpermssgn(<0,0,2*tau>,<0,0,1>) addevenpermssgn(<1,tau,1+tau>,<1,1,1>) autoface #end addevenpermsevensgn(<1,1,3>) #if (augmentation) // augment(6,points[3],points[0],points[1]) augment(6,points[0],points[1],points[4]) #end autoface #end addevenpermssgn(,<1,1,1>) #switch (augmentation) #case(2) augment(8,points[7],points[23],points[22]) #case(1) augment(8,points[16],points[0],points[1]) #end autoface #end addpermssgn(<0,1,2>,<0,1,1>) autoface #end addevenpermssgn(<0,1/tau,2+tau>,<0,1,1>) addevenpermssgn(<1/tau,tau,2*tau>,<1,1,1>) addevenpermssgn(,<1,1,1>) #if (augmentation) augment(10,points[50],points[58],points[34])  // towards (tau,-1,0) -- common to all #switch (augmentation) #case(3) augment(10,points[54],points[38],points[14]) // towards (-1,0,tau) -- on tri #case(2) augment(10,points[40],points[48],points[24]) // towards (0,phi,-1) -- on metadi and tri #break #case(-2) augment(10,points[32],points[10],points[9]) // towards (-tau,1,0) -- on paradi #end #end autoface #end addevenpermssgn(<0,1,3*tau>,<0,1,1>) addevenpermssgn(<2,1+2*tau,tau>,<1,1,1>) addevenpermssgn(<1,2+tau,2*tau>,<1,1,1>) autoface #end addevenpermssgn(<1+sq2,1,1>,<1,1,1>) autoface #end addpermssgn(<1,1+sq2,1+sq2*2>,<1,1,1>) autoface #end addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) addevenpermssgn(,<1,1,1>) addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) autoface #end addevenpermssgn(<1/tau,1/tau,3+tau>,<1,1,1>) addevenpermssgn(<2/tau,tau,1+2*tau>,<1,1,1>) addevenpermssgn(<1/tau,1+tau,3*tau-1>,<1,1,1>) addevenpermssgn(<2*tau-1,2,2+tau>,<1,1,1>) addevenpermssgn(,<1,1,1>) autoface #end addpermsaltsgn(<1,1/xi,xi>*s) autoface #end addevenpermsevensgn(<2*alfa,2,2*veta>*s) addevenpermsevensgn(*s) addevenpermsevensgn(<-alfa/tau+veta*tau+1,-alfa+veta/tau-tau,alfa*tau+veta-1/tau>*s) addevenpermsevensgn(<-alfa/tau+veta*tau-1,alfa-veta/tau-tau,alfa*tau+veta+1/tau>*s) addevenpermsevensgn(*s) autoface #end cuboctahedron dual #end icosidodecahedron dual #end truncatedtetrahedron(0) dual #end truncatedhexahedron(0) dual #end truncatedoctahedron dual #end truncateddodecahedron(0) dual #end truncatedicosahedron dual #end rhombicuboctahedron dual #end truncatedcuboctahedron dual #end rhombicosidodecahedron dual #end truncatedicosidodecahedron dual #end snubhexahedron(s) dual #end snubdodecahedron(s) dual #end //>>>>>>>>>>>>>>>>> changed AGK [20041101] #local i=0; #while (i) #local i=i+1; #end #end #local a=sqrt((1-cos(2*pi/n))/2); #local b=0; #while(b,<0,0,1>) #local b=b+1; #end #end #local a=sqrt((cos(pi/n)-cos(2*pi/n))/2); #local b=0; #while(b<2*n-.5) addpoint() #local a=-a; #local b=b+1; #end #end rprism_vtx(n) autoface #end antiprism_vtx(n) autoface #end //<<<<<<<<<<<<<<<<< changed AGK [20041101] rprism(n) dual #end antiprism(n) dual #end //>>>>>>>>>>>>>>>>> added AGK [20041101] #local veci=va-vb; #local vecj=vc-vb; #local veck=vlength(vc-vb)*vnormalize(vcross(vc-vb,va-vb)); #switch(n) #case (3) addpoint( (va+vb+vc)/3 + sqrt(2/3)*veck ) #break #case (4) addpoint( (va+vc)/2 + sqrt(1/2)*veck ) #break #case (5) addpoint( vb+(2+tau)/5*(veci+vecj) + sqrt((3-tau)/5)*veck ) #break #case (6) addpoint( vb+1/3*veci + 2/3*vecj + sqrt(2/3)*veck ) addpoint( vb+4/3*veci + 2/3*vecj + sqrt(2/3)*veck ) addpoint( vb+4/3*veci + 5/3*vecj + sqrt(2/3)*veck ) #break #case (8) addpoint( vb + sqrt(1/2)*veci + vecj + sqrt(1/2)*veck ) addpoint( vb + (1+sqrt(1/2))*veci + vecj + sqrt(1/2)*veck ) addpoint( vb + (1+sqrt(1/2))*veci + (1+sq2)*vecj + sqrt(1/2)*veck ) addpoint( vb + (2+sqrt(1/2))*veci + (1+sq2)*vecj + sqrt(1/2)*veck ) #break #case (10) addpoint( vb+(0.2+0.6*tau)*veci + (0.8+0.4*tau)*vecj + sqrt((3-tau)/5)*veck ) addpoint( vb+(1.2+0.6*tau)*veci + (0.8+0.4*tau)*vecj + sqrt((3-tau)/5)*veck ) addpoint( vb+(1.2+1.6*tau)*veci + (0.8+1.4*tau)*vecj + sqrt((3-tau)/5)*veck ) addpoint( vb+(1.2+1.6*tau)*veci + (1.8+1.4*tau)*vecj + sqrt((3-tau)/5)*veck ) addpoint( vb+(1.2+0.6*tau)*veci + (0.8+1.4*tau)*vecj + sqrt((3-tau)/5)*veck ) #break #end #end (vdot(raxis,va)*raxis        + cos(rangle)*(va-vdot(raxis,va)*raxis)         + sin(rangle)*(vcross(raxis,va))) #end #local i=0; #while (i (",str(vdot(points[i],normalvector),0,7),")\n") drop_vtx(i) #else #debug concat("Keep vtx ",str(i,0,0)," of ",str(npoints,0,0)," <",str(points[i].x,0,3),",",str(points[i].y,0,3),",",str(points[i].z,0,3),"> (",str(vdot(points[i],normalvector),0,7),")\n") #local i=i+1; #end #end #end #local cog=<0,0,0>; #local i=0; #while (i\n") #local i=i+1; #end #end #local i=0; #while (i } finish { ambient 0 diffuse 1 phong 1 } } #local j=0; #while (j #break #range (0.1,999)  colour <0,0,1>  #break #else colour <.3,.3,.3> #end #debug concat("Edge ",str(i,0,0)," & ",str(j,0,0)," has length ",str(dist,5,5)," want length ",str(edgelen[i][j],5,5),"\n") }                    finish { ambient 0 diffuse 1 phong 1 } } #end #local j=j+1; #end #local i=i+1; #end #end //--- macros to find "sporadic" Johnson solids via iterative optimisation kludge #declare edgelen[a][b]=len; #declare edgelen[b][a]=len; #end addedge(a,b,el)   addedge(a,c,el) addedge(b,c,el) #end addedge(a,b,el) addedge(b,c,el) addedge(c,d,el) addedge(d,a,el) addedge(a,c,sq2*el) addedge(b,d,sq2*el) #end make_triangle(a,b,f) make_square(b,c,e,f) make_triangle(c,d,e) #end #local gen=0; #local maxforce=force_threshold+1; #while ((genforce_threshold)) #debug concat("Gen ",str(gen,0,0)," ") //    showvtxs #local maxforce=-999; #local i=0; #while (i; #local j=0; #while (j<npoints) #ifdef(edgelen[i][j]) #local dist=vlength(points[i]-points[j]); #declare forces[i] = forces[i]+ (dist-edgelen[i][j])*(points[j]-points[i]); //                #debug concat("Edge ",str(i,0,0)," & ",str(j,0,0)," has length ",str(dist,5,5)," want length ",str(edgelen[i][j],5,5),"\n") #end #local j=j+1; #end #if (maxforce,<1,0,0>) drop_vtx(99) autobalance autoface #end // J2 = pentagonal_pyramid (six vtxs of an icosahedron) addevenpermssgn(<0,1,tau>,<0,1,1>) drop_halfspace(points[0],0) autobalance autoface #end // - cuboctahedron modifications J - 3, 18, 22, 27, 35, 36, 44 // J3 = triangular_cupola (9 vtxs of a cuboctahedron) polygon_vtx(6) augment(6,points[0],points[1],points[2]) autobalance autoface #end polygon_vtx(6) augment(6,points[0],points[1],points[2]) augment(6,points[2],points[1],points[0]) autobalance autoface #end rprism_vtx(6) augment(6,points[1],points[3],points[5]) autobalance autoface #end antiprism_vtx(6) augment(6,points[1],points[3],points[5]) autobalance autoface #end polygon_vtx(6) augment(6,points[0],points[1],points[2]) augment(6,points[3],points[2],points[1]) autobalance autoface #end rprism_vtx(6) augment(6,points[1],points[3],points[5]) augment(6,points[6],points[4],points[2]) autobalance autoface #end rprism_vtx(6) augment(6,points[1],points[3],points[5]) augment(6,points[4],points[2],points[0]) autobalance autoface #end antiprism_vtx(6) augment(6,points[1],points[3],points[5]) augment(6,points[4],points[2],points[0]) autobalance autoface #end // two triangular prisms addpointssgn(<1,1,0>,<1,1,0>) addpointssgn(<1,0,sqrt(3)>,<1,0,0>) addpointssgn(<0,1,-sqrt(3)>,<0,1,0>) autobalance autoface // miscellaneous cut and pasting rprism_vtx(n) augment(n,points[4],points[2],points[0]) autobalance autoface #end polygon_vtx(n) augment(n,points[0],points[1],points[2]) augment(n,points[2],points[1],points[0]) autobalance autoface #end rprism_vtx(n) augment(n,points[4],points[2],points[0]) augment(n,points[1],points[3],points[5]) autobalance autoface #end // - rhombicuboctahedron modifications J - 4, 19, 23, 28, 29, 37, 45 addevenpermssgn(<1+sq2,1,1>,<1,1,1>) #local raxis=x; #local edgelen=2; #local oct_radius=sqrt(2*sq2+4); // drop hemisphere for 6, 21, 25 (have single rotunda) #if(j_number=4)   drop_halfspace(raxis,1) #end #if(j_number<=23) drop_halfspace(raxis,-1)    #end // stretch and twist #local stretch=0; #local twist=0; #switch(j_number) #case(29) #local twist=45; #case(28) #local stretch=-edgelen; #break #case(37) #local twist=45; #break #case(23) #case(45) #local twist=22.5; #local stretch=oct_radius*2*sqrt((cos(pi/8)-cos(2*pi/8))/2)-edgelen; // borrowed from antiprism_vtx #end  //switch #if (stretch!=0)      // lower northern hemisphere #local i=0; #while (i<npoints-.5) #if ((stretch = -2) & ( vdot(points[i],raxis)=1)) drop_vtx(i) #else #if (vdot(points[i],raxis)>0) #declare points[i]=points[i] + stretch*raxis; #end  // if                 #local i=i+1; #end //if #end  //while #end  //if #if (twist!=0)    // rotate southern hemisphere (incl equator) rotate_vtxs(raxis,twist,-1) #end autobalance #end // Now the named macros of these modified rhombicuboctahedron rprism_vtx(8) augment(8,points[4],points[2],points[0]) autoface #end // J10. (cap a square antiprism) antiprism_vtx(4) #local va=points[1]; addpoint(<0,0,-(abs(va.z)+1)>) autoface #end // J17. (bicap a square antiprism) antiprism_vtx(4) #local va=points[1]; addpoint(<0,0,abs(va.z)+1>) addpoint(<0,0,-(abs(va.z)+1)>) autoface #end // - icosahedron modifications // J11. (drop a vertex from an icosahedron) addevenpermssgn(<0,1,tau>,<0,1,1>) drop_vtx(99) autoface #end // J62. (drop 2 vertices from an icosahedron) addevenpermssgn(<0,1,tau>,<0,1,1>) drop_vtx(99) drop_vtx(6) autoface #end // J63. (drop 3 vertices from an icosahedron) addevenpermssgn(<0,1,tau>,<0,1,1>) drop_vtx(99) drop_vtx(6) drop_vtx(0) // 5 OK too autoface #end // J64. (drop 3 vertices from an icosahedron, add a tetrahedron) addevenpermssgn(<0,1,tau>,<0,1,1>) drop_vtx(99) drop_vtx(6) drop_vtx(0) augment(3,points[1],points[7],points[8]) autoface #end // dodecahedron modifications: J58-61 addpointssgn(<1,1,1>,<1,1,1>) addevenpermssgn(<0,1/tau,tau>,<0,1,1>) augment(5,points[4],points[13],points[12]) showvtxs autobalance autoface #end addpointssgn(<1,1,1>,<1,1,1>) addevenpermssgn(<0,1/tau,tau>,<0,1,1>) augment(5,points[4],points[13],points[12]) #local a=points[npoints-1]; addpoint(-a) showvtxs autobalance autoface #end addpointssgn(<1,1,1>,<1,1,1>) addevenpermssgn(<0,1/tau,tau>,<0,1,1>) augment(5,points[4],points[13],points[12]) #local a=points[npoints-1]; addpoint(<a.y,a.z,a.x>) showvtxs autobalance autoface #end addpointssgn(<1,1,1>,<1,1,1>) addevenpermssgn(<0,1/tau,tau>,<0,1,1>) augment(5,points[4],points[13],points[12]) #local a=points[npoints-1]; drop_vtx(999) addevenperms(a) showvtxs autobalance autoface #end // - icosidodecahedron modifications // Modified icosidodecahedron, for J- 6, 21, 25, 34, 42, 43, 48; J32,33,40,41,47 addevenpermssgn(<0,0,2*tau>,<0,0,1>) addevenpermssgn(<1,tau,1+tau>,<1,1,1>) #local raxis=vnormalize(<tau,1,0>); #local edgelen=vlength(<0,0,2*tau>-<1,tau,1+tau>); #local id_radius=2*tau; // drop hemisphere for 6, 21, 25 (have single rotunda) #if((j_number<=33) | (j_number=40) | (j_number=41) | (j_number=47)) drop_halfspace(raxis,0) #if (j_number>=32) // form a cupolarotunda augment(10,points[0],points[7],points[15]) #end #end // stretch and twist #local stretch=0; #local twist=0; #switch(j_number) #case(42) #case(40) #local stretch=edgelen; #case(34) #case(33) #local twist=36; #break #case(21) #case(43) #case(41) #local stretch=edgelen; #break #case(25) #case(48) #case(47) #local twist=18; #local stretch=id_radius*2*sqrt((cos(pi/10)-cos(2*pi/10))/2); // borrowed from antiprism_vtx #end  //switch #if (stretch>0)       // raise northern hemisphere, duplicate equator #local i=0;   #local np=npoints; #while (i<np-.5) #switch (vdot(points[i],raxis)) #range(-0.01,0.01) //            #debug concat("Dupl. vtx ",str(i,0,0)," of ",str(npoints,0,0)," <",str(points[i].x,0,3),",",str(points[i].y,0,3),",",str(points[i].z,0,3),">\n") addpoint(points[i] + stretch*raxis) #break #range(0.01,999) //            #debug concat("Raise vtx ",str(i,0,0)," of ",str(npoints,0,0)," <",str(points[i].x,0,3),",",str(points[i].y,0,3),",",str(points[i].z,0,3),">\n") #declare points[i]=points[i] + stretch*raxis; #break #end  // switch #local i=i+1; #end  //while #end  //if #if (twist!=0)    // rotate southern hemisphere (incl equator) rotate_vtxs(raxis,twist,0) #end showvtxs autobalance autoface #end //-- pentagonal cupolae, bicupolae rprism_vtx(10) augment(10,points[4],points[2],points[0]) autobalance autoface #end antiprism_vtx(10) augment(10,points[4],points[2],points[0]) autobalance autoface #end polygon_vtx(10) augment(10,points[0],points[1],points[2]) augment(10,points[3],points[2],points[1]) autobalance autoface #end polygon_vtx(10) augment(10,points[0],points[1],points[2]) augment(10,points[2],points[1],points[0]) autobalance autoface #end rprism_vtx(10) augment(10,points[4],points[2],points[0]) augment(10,points[3],points[5],points[7]) autobalance autoface #end rprism_vtx(10) augment(10,points[4],points[2],points[0]) augment(10,points[1],points[3],points[5]) showvtxs autobalance autoface #end antiprism_vtx(10) augment(10,points[4],points[2],points[0]) augment(10,points[1],points[3],points[5]) autobalance autoface #end // side-capped prisms : J49-57 rprism_vtx(n) #local i=1; #while(i<=strlen(facelist)) #local facenum=mod(val(substr(facelist,i,1)),n);  // convert ith char given to a number 0..(n-1) augment(4,points[2*facenum+1],points[2*facenum],points[mod(2*facenum+2,2*n)]) //    #debug concat("Augment face ",str(facenum,0,0)," of ",str(n,0,0), " <",str(points[npoints-1].x,0,3),",",str(points[npoints-1].y,0,3),",",str(points[npoints-1].z,0,3),"> \n") #local i=i+1; #end autobalance autoface #end // - rhombicosidodecahedron modifications addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) #local raxis=vnormalize(<tau,-1,0>); drop_halfspace(raxis,3.077) autobalance autoface #end // mods is a 4-character string of D (drop), G (gyrate) and other (leave alone) addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) #local raxis=array[5]; #local raxis[1]=vnormalize(<tau,-1,0>); #local raxis[2]=vnormalize(<-1,0,tau>); #local raxis[3]=vnormalize(<-1,0,-tau>); #local raxis[4]=-raxis[1]; #local i=1; #while(i<=min(4,strlen(mods))) #local modchar=substr(mods,i,1); #if (strcmp(modchar,"D")=0) drop_halfspace(-raxis[i],-3.077) #end #if (strcmp(modchar,"G")=0) rotate_vtxs(-raxis[i],36,-3.077) #end #local i=i+1; #end autobalance autoface #end // #macro diminished_rhombicosidodecahedron //J76 //  addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) //  addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) //  addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) //  #local raxis=vnormalize(<tau,-1,0>); //  drop_halfspace(-raxis,-3.077) //  autobalance  autoface // #end // #macro tridiminished_rhombicosidodecahedron  //J83 //  addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) //  addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) //  addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) //  #local raxis=vnormalize(<tau,-1,0>); //  drop_halfspace(-raxis,-3.077) //  #local raxis=vnormalize(<-1,0,-tau>); //  drop_halfspace(-raxis,-3.077) //  #local raxis=vnormalize(<-1,0,tau>); //  drop_halfspace(-raxis,-3.077) //  autobalance  autoface // #end // #macro metabidiminished_rhombicosidodecahedron   //J81 //  addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) //  addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) //  addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) //  #local raxis=vnormalize(<tau,-1,0>); //  drop_halfspace(-raxis,-3.077) //  #local raxis=vnormalize(<-1,0,tau>); //  drop_halfspace(-raxis,-3.077) //  autobalance  autoface // #end // #macro parabidiminished_rhombicosidodecahedron   //J80 //  addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) //  addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) //  addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) //  #local raxis=vnormalize(<tau,-1,0>); //  drop_halfspace(-raxis,-3.077) //  drop_halfspace( raxis,-3.077) //  autobalance  autoface // #end // // #macro gyrate_rhombicosidodecahedron  //J72 //  addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) //  addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) //  addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) //  #local raxis=vnormalize(<tau,-1,0>); //  rotate_vtxs(-raxis,36,-3.077) //  autobalance  autoface // #end // #macro trigyrate_rhombicosidodecahedron  //J75 //  addevenpermssgn(<1,1,1+2*tau>,<1,1,1>) //  addevenpermssgn(<tau,2*tau,1+tau>,<1,1,1>) //  addevenpermssgn(<2+tau,0,1+tau>,<1,0,1>) //  #local raxis=vnormalize(<tau,-1,0>); //  rotate_vtxs(-raxis,36,-3.077) //  #local raxis=vnormalize(<-1,0,-tau>); //  rotate_vtxs(-raxis,36,-3.077) //  #local raxis=vnormalize(<-1,0,tau>); //  rotate_vtxs(-raxis,36,-3.077) //  autobalance  autoface // #end ////////////// sporadics addpoint(<1,0,0>) #local EQTR1=npoints-1; addpoint(<0,1,0>) #local EQTR2=npoints-1; addpoint(<-1,0,0>) #local EQTR3=npoints-1; addpoint(<0,-1,0>) #local EQTR4=npoints-1; addpoint(<1,0,1>) #local NORTH1=npoints-1; addpoint(<-1,0,1>) #local NORTH2=npoints-1; addpoint(<0,1,-1>) #local SOUTH1=npoints-1; addpoint(<0,-1,-1>)   #local SOUTH2=npoints-1; make_triangle(EQTR1,EQTR2,NORTH1) make_triangle(EQTR1,EQTR2,SOUTH1) make_triangle(EQTR1,EQTR4,NORTH1) make_triangle(EQTR1,EQTR4,SOUTH2) make_triangle(EQTR2,EQTR3,NORTH2) make_triangle(EQTR2,EQTR3,SOUTH1) make_triangle(EQTR3,EQTR4,NORTH2) make_triangle(EQTR3,EQTR4,SOUTH2) addedge(NORTH1,NORTH2,1) addedge(SOUTH1,SOUTH2,1) optimise(100,0.000001) autobalance autoface #end addpoint(<sq2,0,0>)   #local E1=npoints-1; addpoint(<1,1,0>) #local E2=npoints-1; addpoint(<0,sq2,0>)   #local E3=npoints-1; addpoint(<-1,1,0>) #local E4=npoints-1; addpoint(<-sq2,0,0>)  #local E5=npoints-1; addpoint(<-1,-1,0>)   #local E6=npoints-1; addpoint(<0,-sq2,0>)  #local E7=npoints-1; addpoint(<1,-1,0>) #local E8=npoints-1; addpoint(<.5,.5,1>)   #local N1=npoints-1; addpoint(<-.5,.5,1>)  #local N2=npoints-1; addpoint(<-.5,-.5,1>) #local N3=npoints-1; addpoint(<.5,-.5,1>)  #local N4=npoints-1; addpoint(<1/sq2,0,-1>) #local S1=npoints-1; addpoint(<0,1/sq2,-1>) #local S2=npoints-1; addpoint(<-1/sq2,0,-1>)   #local S3=npoints-1; addpoint(<0,-1/sq2,-1>)   #local S4=npoints-1; make_triangle(E1,E2,N1)   make_triangle(E1,E2,S1) make_triangle(E2,E3,N1)   make_triangle(E2,E3,S2) make_triangle(E3,E4,N2)   make_triangle(E3,E4,S2) make_triangle(E4,E5,N2)   make_triangle(E4,E5,S3) make_triangle(E5,E6,N3)   make_triangle(E5,E6,S3) make_triangle(E6,E7,N3)   make_triangle(E6,E7,S4) make_triangle(E7,E8,N4)   make_triangle(E7,E8,S4) make_triangle(E8,E1,N4)   make_triangle(E8,E1,S1) addedge(N1,N2,1)      addedge(N2,N3,1)    addedge(N1,N3,sq2) addedge(N3,N4,1)      addedge(N4,N1,1)    addedge(N2,N4,sq2) addedge(S1,S2,1)      addedge(S2,S3,1)    addedge(S1,S3,sq2) addedge(S3,S4,1)      addedge(S4,S1,1)    addedge(S2,S4,sq2) optimise(400,0.00000001) autobalance autoface #end addpoint(<1,0,0>) #local E1=npoints-1; addpoint(<.5,1,0>) #local E2=npoints-1; addpoint(<-.5,1,0>)   #local E3=npoints-1; addpoint(<-1,0,0>) #local E4=npoints-1; addpoint(<-.5,-1,0>)  #local E5=npoints-1; addpoint(<.5,-1,0>)   #local E6=npoints-1; addpoint(<.5,0,1>) #local N1=npoints-1; addpoint(<-.5,0,1>)   #local N2=npoints-1; addpoint(<0,.5,-1>)   #local S1=npoints-1; addpoint(<0,-.5,-1>)  #local S2=npoints-1; make_lune(E1,E2,E3,E4,N2,N1) make_lune(E4,E5,E6,E1,N1,N2) make_triangle(E1,E2,S1) make_triangle(E2,E3,S1) make_triangle(E3,E4,S1) make_triangle(E4,E5,S2) make_triangle(E5,E6,S2) make_triangle(E6,E1,S2) addedge(S1,S2,1) optimise(400,0.00000001) #if(n=87) augment(4,points[E2],points[E3],points[N2]) #end autobalance autoface #end sphenocoronae(86) #end sphenocoronae(87) #end addpoint(<1,0,0>) #local E1=npoints-1; addpoint(<.5,1,0>) #local E2=npoints-1; addpoint(<-.5,1,0>)   #local E3=npoints-1; addpoint(<-1,0,0>) #local E4=npoints-1; addpoint(<-.5,-1,0>)  #local E5=npoints-1; addpoint(<.5,-1,0>)   #local E6=npoints-1; addpoint(<.5,0,1>) #local N1=npoints-1; addpoint(<-.5,0,1>)   #local N2=npoints-1; addpoint(<0,.5,-1>)   #local S1=npoints-1; addpoint(<0,-.5,-1>)  #local S2=npoints-1; make_lune(E1,E2,E3,E4,N2,N1) make_lune(E4,E5,E6,E1,N1,N2) make_triangle(E1,E2,S1) make_triangle(E2,E3,S1) make_triangle(E3,E4,S1) make_triangle(E4,E5,S2) make_triangle(E5,E6,S2) make_triangle(E6,E1,S2) addedge(S1,S2,1) addpoint(<0,1,1>) #local A=npoints-1; make_triangle(A,E2,E3) make_triangle(A,N2,N1) optimise(400,0.00000001) autobalance autoface #end addpoint(<1.3,0,0.1>) #local E1=npoints-1; addpoint(<.5,.6,0>)   #local E2=npoints-1; addpoint(<-.5,.6,0>)  #local E3=npoints-1; addpoint(<-1.3,0,0.1>) #local E4=npoints-1; addpoint(<-.5,-.6,0>) #local E5=npoints-1; addpoint(<.5,-.6,0>)  #local E6=npoints-1; addpoint(<.5,0,.7>)   #local N1=npoints-1; addpoint(<-.5,0,.7>)  #local N2=npoints-1; addpoint(<0,.5,-.9>)  #local S1=npoints-1; addpoint(<-.8,0,-.8>) #local S2=npoints-1; addpoint(<0,-.5,-.9>) #local S3=npoints-1; addpoint(<.8,0,-.8>)  #local S4=npoints-1; make_lune(E1,E2,E3,E4,N2,N1) make_lune(E4,E5,E6,E1,N1,N2) make_triangle(E1,E2,S4) make_triangle(E2,E3,S1) make_triangle(E3,E4,S2) make_triangle(E4,E5,S2) make_triangle(E5,E6,S3) make_triangle(E6,E1,S4) make_triangle(S1,S2,S3)   make_triangle(S3,S4,S1) optimise(400,0.000001) // showvtxs autobalance autoface #end addpoint(< 1.10, 0.00, 0.20>) #local E1=npoints-1; addpoint(< 0.50, 0.72,-0.15>) #local E2=npoints-1; addpoint(<-0.50, 0.72,-0.15>) #local E3=npoints-1; addpoint(<-1.10, 0.00, 0.20>) #local E4=npoints-1; addpoint(<-0.50,-0.72,-0.15>) #local E5=npoints-1; addpoint(< 0.50,-0.72,-0.15>) #local E6=npoints-1; addpoint(< 0.50, 0.50, 0.83>) #local N1=npoints-1; addpoint(<-0.50, 0.50, 0.83>) #local N2=npoints-1; addpoint(<-0.50,-0.50, 0.83>) #local N3=npoints-1; addpoint(< 0.50,-0.50, 0.83>) #local N4=npoints-1; addpoint(< 0.00, 0.50,-0.99>) #local S1=npoints-1; addpoint(<-0.84, 0.00,-0.76>) #local S2=npoints-1; addpoint(< 0.00,-0.50,-0.99>) #local S3=npoints-1; addpoint(< 0.84, 0.00,-0.76>) #local S4=npoints-1; make_lune(E1,E2,E3,E4,N2,N1) make_lune(E4,E5,E6,E1,N4,N3) make_lune(E1,N1,N2,E4,N3,N4) make_triangle(E1,E2,S4) make_triangle(E2,E3,S1) make_triangle(E3,E4,S2) make_triangle(E4,E5,S2) make_triangle(E5,E6,S3) make_triangle(E6,E1,S4) make_triangle(S1,S2,S3) make_triangle(S3,S4,S1) optimise(400,0.000001) showvtxs autobalance autoface #end addpoint(< 0.00, 0.50, 1.10>) #local NN1=npoints-1; addpoint(< 0.00,-0.50, 1.10>) #local NN2=npoints-1; addpoint(< 0.00, 1.12, 0.33>) #local N1=npoints-1; addpoint(< 0.77, 0.50, 0.46>) #local N2=npoints-1; addpoint(< 0.77,-0.50, 0.46>) #local N3=npoints-1; addpoint(< 0.00,-1.12, 0.33>) #local N4=npoints-1; addpoint(<-0.77,-0.50, 0.46>) #local N5=npoints-1; addpoint(<-0.77, 0.50, 0.46>) #local N6=npoints-1; addpoint(< 0.50, 0.77,-0.46>) #local S1=npoints-1; addpoint(< 1.12, 0.00,-0.33>) #local S2=npoints-1; addpoint(< 0.50,-0.77,-0.46>) #local S3=npoints-1; addpoint(<-0.50,-0.77,-0.46>) #local S4=npoints-1; addpoint(<-1.12, 0.00,-0.33>) #local S5=npoints-1; addpoint(<-0.50, 0.77,-0.46>) #local S6=npoints-1; addpoint(< 0.50, 0.00,-1.10>) #local SS1=npoints-1; addpoint(<-0.50, 0.00,-1.10>) #local SS2=npoints-1; make_lune(N1,N2,N3,N4,NN2,NN1) make_lune(N4,N5,N6,N1,NN1,NN2) make_lune(S2,SS1,SS2,S5,S6,S1) make_lune(S2,S3,S4,S5,SS2,SS1) make_triangle(N1,S1,N2) make_triangle(N2,S2,N3) make_triangle(N3,S3,N4) make_triangle(N4,S4,N5) make_triangle(N5,S5,N6) make_triangle(N6,S6,N1) optimise(400,0.000001) showvtxs autobalance autoface #end // start with icosahedron addevenpermssgn(<0,1,tau>,<0,1,1>) //  showvtxs // trim back to 8 vertices drop_halfspace(<-1,-tau,0>,-tau) drop_halfspace(<-1,tau,0>,-tau) drop_halfspace(<1,0,0>,-1) // now shift all vertices into halfspace x >= 0, and mirror #local i=0;#local minx=999; #while (i<npoints) #local minx=min(minx,points[i].x); //#if (minx>points[i].x) #local minx=points[i].x; #end #local i=i+1; #end // (while loop) #local i=0; #local np=npoints; #while (i<np) #declare points[i]=points[i]+<-minx,0,0>; #if (points[i].x>0) addpoint(<-points[i].x,points[i].y,points[i].z>) #end #local i=i+1; #end // (while loop) autoface #end // Coords found by taking 7 vtxs of an icosahedron, placing one vtx // at origin, which is centre of the one hexagonal face. addevenperms( <1,tau,0>-<tau,0,1>) addevenperms( <0,1,tau>-<tau,0,1>) addevenperms( <-1,tau,0>-<tau,0,1>) addevenperms( <-tau,0,1>-<tau,0,1>) addevenperms( <0,1,-tau>-<tau,0,1>) addevenperms(-<1,tau,0>-<tau,0,1>) autobalance autoface #end //<<<<<<<<<<<<<<<<< added AGK [20041101] #declare points[npoints]=a; #declare npoints=npoints+1; #end addpoint(a) addpoint(<a.y,a.z,a.x>) addpoint(<a.z,a.x,a.y>) #end addevenperms(a) addevenperms(<a.x,a.z,a.y>) #end addpoint(a) #if(s.x) addpointssgn(a*<-1,1,1>,s*<0,1,1>) #end #if(s.y) addpointssgn(a*<1,-1,1>,s*<0,0,1>) #end #if(s.z) addpoint(a*<1,1,-1>) #end #end addpointssgn(a,s) addpointssgn(<a.y,a.z,a.x>,<s.y,s.z,s.x>) addpointssgn(<a.z,a.x,a.y>,<s.z,s.x,s.y>) #end addevenpermssgn(a,s) addevenpermssgn(<a.x,a.z,a.y>,<s.x,s.z,s.y>) #end addpoint(a) addpoint(a*<-1,-1,1>) addpoint(a*<-1,1,-1>) addpoint(a*<1,-1,-1>) #end addevenperms(a) addevenperms(a*<-1,-1,1>) addevenperms(a*<-1,1,-1>) addevenperms(a*<1,-1,-1>) #end addevenpermsevensgn(a) addevenpermsevensgn(<a.x,a.z,-a.y>) #end /*#macro addevenpermssgn(a,s) //Calls addevenperms with, for each 1 in s, a.{x,y,z} replaced with {+,-}a.{x,y,z} addevenperms(a) #if(s.x) addevenpermssgn(a*<-1,1,1>,s*<0,1,1>) #end #if(s.y) addevenpermssgn(a*<1,-1,1>,s*<0,0,1>) #end #if(s.z) addevenperms(a*<1,1,-1>) #end #local a=vnormalize(d)/l; #local f=1; #local n=0; #while(n<nfaces-.5) #if(vlength(faces[n]-a)<0.00001) #local f=0; #end #local n=n+1; #end #if(f) #declare faces[nfaces]=a; #declare nfaces=nfaces+1; #end #end #declare temp=faces; #declare faces=points; #declare points=temp; #declare temp=nfaces; #declare nfaces=npoints; #declare npoints=temp; #end //Find edge length #declare elength=1000; #local a=0; #while(a<npoints-.5) #local b=0; #while(b<npoints-.5) #local c=vlength(points[a]-points[b]); #if(c>0.00001 & c<elength) #local elength=c; #end #local b=b+1; #end #local a=a+1; #end #debug concat("elength=",str(elength,9,9),"\n")   showvtxs //Find planes //#macro planes #local a=0; #while(a<npoints-.5) #local b=a+1; #while(b<npoints-.5) #if(vlength(points[a]-points[b])<elength+0.00001) #local c=b+1; #while(c<npoints-.5) #if(vlength(points[a]-points[c])<elength+0.00001) #local n=vnormalize(vcross(points[b]-points[a],points[c]-points[a])); #local d=vdot(n,points[a]); #if(d<0) #local n=-n; #local d=-d; #end #local f=1; #local e=0; #while(e<npoints-.5) #if(vdot(n, points[e])>d+0.00001) #local f=0; #end #local e=e+1; #end #if(f) #declare ld=d; addface(n,d) //plane { n, d } #end #end #local c=c+1; #end #end #local b=b+1; #end #local a=a+1; #end #end This_shape_will_be_drawn //Random rotations are (hopefully) equally distributed... rotate rot1*180/pi*y rotate rot2*180/pi*x rotate rot3*180/pi*y #end // drawit //Scale shape to fit in unit sphere #local b=0; #local a=0; #while(a<npoints-.5) #local c=vlength(points[a]); #if(c>b) #local b=c; #end #local a=a+1; #end #local a=0; #while(a<npoints-.5) #local points[a]=points[a]/b; #local a=a+1; #end #local a=0; #while(a<nfaces-.5) #local faces[a]=faces[a]*b; #local a=a+1; #end #end //Draw edges #declare p[np]=a; #declare np=np+1; #end #declare p=array[20]; #declare np=0; #local b=0; #while(b<npoints-.5) #if(vdot(faces[a],points[b])>1-0.00001) addp(b) #end #local b=b+1; #end #local c=0; #while(c<np-.5) #local d=0; #while(d<np-.5) #if(p[c]<p[d]-.5) #local f=1; #local e=0; #while(e<np-.5) #if(e!=c & e!=d & vdot(vcross(points[p[c]],points[p[d]]),points[p[e]])<0) #local f=0; #end #local e=e+1; #end #if(f) object { cylinder { points[p[c]], points[p[d]], .01 dorot } pigment { colour <.3,.3,.3> } finish { ambient 0 diffuse 1 phong 1 } }      #end #end #local d=d+1; #end #local c=c+1; #end /*#local a=0; #while(a<npoints-.5) #local b=a+1; #while(b<npoints-.5) #if(vlength(points[a]-points[b])<elength+0.00001) object { cylinder { points[a], points[b], .01 dorot } pigment { colour <.3,.3,.3> } finish { ambient 0 diffuse 1 phong 1 } }    #end #local b=b+1; #end //>>>>>>>>>>>>>>>>> changed AGK [20041101] //Draw points #local a=0; #while(a<npoints-.5) object { sphere { points[a], .01 dorot } pigment { colour <.3,.3,.3> } finish { ambient 0 diffuse 1 phong 1 } }    #local a=a+1; #end #local a=0; #while(a<npoints-.5) #local i=0; #while(i<=a) object { sphere { (1+i/10)*points[a], .01 dorot } pigment { colour <.3,.3,.3> } finish { ambient 0 diffuse 1 phong 1 } }        #local i=i+1; #end #local a=a+1; #end #end //<<<<<<<<<<<<<<<<< changed AGK [20041101] //Draw planes object { intersection { #local a=0; #while(a<nfaces-.5) plane { faces[a], 1/vlength(faces[a]) } #local a=a+1; #end //planes //sphere { <0,0,0>, 1 } //sphere { <0,0,0>, ld+.01 inverse } dorot }  pigment { colour rgbt <.8,.8,.8,.4> } finish { ambient 0 diffuse 1 phong flashiness #if(withreflection) reflection { .2 } #end } //interior { ior 1.5 } photons { target on    refraction on     reflection on     collect on   } } #end // CCC Y Y PP //  C   Y Y P P //  C    Y  PP //  C    Y  P //  CCC  Y  P   light_source { <4*sin(a*pi*2/11), 5*cos(a*pi*6/11), -4*cos(a*pi*2/11)> colour (1+<sin(a*pi*2/11),sin(a*pi*2/11+pi*2/3),sin(a*pi*2/11+pi*4/3)>)*2/11 } // light_source { <4*sin(a*pi*2/11), 5*cos(a*pi*6/11), -4*cos(a*pi*2/11)> //       colour (1+<sin(a*pi*2/11),sin(a*pi*2/11+pi*2/3),sin(a*pi*2/11+pi*4/3)>)*2/11 } #local a=a+1; #end background { color <1,1,1> } camera { perspective location <0,0,0> direction <0,0,1> right x/2 up y/2 sky <0,1,0> location <0,0,-4.8> // location <0,0,-10> look_at <0,0,0> }    // some auto-framing. Not for animated versions. #declare camera_loc=<0,0,-4.8>; #declare max_elevation=0; #declare max_bearing=0; #declare i=0; #while (i<npoints) #declare sighting=points[i]; #declare sighting=vaxis_rotate(sighting,y,rot1*180/pi); #declare sighting=vaxis_rotate(sighting,x,rot2*180/pi); #declare sighting=vaxis_rotate(sighting,y,rot3*180/pi); #declare sighting=sighting-camera_loc; #declare elevation=sighting.y/sighting.z;        #declare bearing=sighting.x/sighting.z;         #declare max_elevation = max(max_elevation,abs(elevation)); #declare max_bearing = max(max_bearing,abs(bearing)); //    sphere{ (camera_loc+<bearing,elevation,1>*10), 0.2 //        pigment{ colour rgb <1,0,1> } } #declare i=i+1; #end #debug concat("Maximum: Elevation = ",str(max_elevation,4,4)," Bearing = ",str(max_bearing,4,4),"\n") #if(1) // 1:1 aspect ratio #declare max_bearing = max(max_elevation,max_bearing); #declare max_elevation=max_bearing; #end #if(1) // 5% border #declare max_bearing=1.05*max_bearing; #declare max_elevation=1.05*max_elevation; #end camera { perspective location camera_loc direction <0,0,.5> right x*max_bearing up y*max_elevation } #end global_settings { max_trace_level 40 photons { count 200000 autostop 0 } }
 * 1) declare notwireframe=1;
 * 2) declare withreflection=0;
 * 3) declare flashiness=0.25; //Still pictures use 1, animated should probably be about 0.25.
 * 1) macro This_shape_will_be_drawn
 * 1) declare tau=(1+sqrt(5))/2;
 * 2) declare sq2=sqrt(2);
 * 3) declare sq297=sqrt(297);
 * 4) declare xi=(pow(sq297+17,1/3)-pow(sq297-17,1/3)-1)/3;
 * 5) declare sqweird=sqrt(tau-5/27);
 * 6) declare ouch=pow((tau+sqweird)/2,1/3)+pow((tau-sqweird)/2,1/3);
 * 7) declare alfa=ouch-1/ouch;
 * 8) declare veta=(ouch+tau+1/ouch)*tau;
 * 1) macro tetrahedron
 * 1) macro hexahedron
 * 1) macro octahedron
 * 1) macro dodecahedron
 * 1) macro icosahedron
 * 1) macro weirdahedron
 * 1) macro cuboctahedron
 * 1) macro icosidodecahedron
 * 1) macro truncatedtetrahedron(augmentation)
 * 1) macro truncatedhexahedron(augmentation)
 * 1) macro truncatedoctahedron
 * 1) macro truncateddodecahedron(augmentation)
 * 1) macro truncatedicosahedron
 * 1) macro rhombicuboctahedron
 * 1) macro truncatedcuboctahedron
 * 1) macro rhombicosidodecahedron
 * 1) macro truncatedicosidodecahedron
 * 1) macro snubhexahedron(s)
 * 1) macro snubdodecahedron(s)
 * 1) macro rhombicdodecahedron
 * 1) macro rhombictriacontahedron
 * 1) macro triakistetrahedron
 * 1) macro triakisoctahedron
 * 1) macro tetrakishexahedron
 * 1) macro triakisicosahedron
 * 1) macro pentakisdodecahedron
 * 1) macro deltoidalicositetrahedron
 * 1) macro disdyakisdodecahedron
 * 1) macro deltoidalhexecontahedron
 * 1) macro disdyakistriacontahedron
 * 1) macro pentagonalicositetrahedron(s)
 * 1) macro pentagonalhexecontahedron(s)
 * 1) macro polygon_vtx(n)
 * 1) macro rprism_vtx(n)
 * 1) macro antiprism_vtx(n)
 * 1) macro rprism(n)
 * 1) macro antiprism(n)
 * 1) macro bipyramid(n)
 * 1) macro trapezohedron(n)
 * 1) macro augment(n,va,vb,vc) // on an n-face with 3 adjacent vtxs, add a pyramid or a cupola
 * 1) macro rotateabout(raxis,rangle,va)   // raxis must be a unit vector
 * 1) macro rotate_vtxs(raxis,rangle,thresh) // all points in the halfspace v.raxis <= tresh
 * 1) macro drop_vtx(n)
 * 1) macro drop_halfspace(normalvector,thresh) // all points in the halfspace v.raxis < tresh
 * 1) macro autobalance  // moves the centre of gravity (cog) of the vertices to the origin
 * 1) macro showvtxs
 * 1) macro drawit
 * 1) declare el=1;
 * 2) declare edgelen=array[120][120];
 * 3) declare forces=array[120];
 * 4) macro addedge(a,b,len)
 * 1) macro make_triangle(a,b,c)
 * 1) macro make_square(a,b,c,d)
 * 1) macro make_lune(a,b,c,d,e,f) // a and d are points of lune
 * 1) macro optimise(gen_threshold,force_threshold)
 * 1) macro square_pyramid
 * 1) macro pentagonal_pyramid
 * 1) macro triangular_cupola
 * 1) macro triangular_gyrobicupola  //actually a cuboctahedron
 * 1) macro elongated_triangular_cupola  //J18
 * 1) macro gyroelongated_triangular_cupola  //J22
 * 1) macro triangular_orthobicupola //J27
 * 1) macro elongated_triangular_orthobicupola   //J35
 * 1) macro elongated_triangular_gyrobicupola //J36
 * 1) macro gyroelongated_triangular_bicupola //J44
 * 1) macro gyrobifastigium // J26
 * 1) end
 * 1) macro elongated_pyramid(n)   // J7-9 (for n=3,4,5)
 * 1) macro dipyramid(n)   // J12 (n=3) and J13 (n=5)
 * 1) macro elongated_dipyramid(n) // J14-16 (for n=3,4,5)
 * 1) macro elongated_triangular_dipyramid elongated_dipyramid(3) #end   // J7
 * 2) macro elongated_square_dipyramid elongated_dipyramid(3) #end   // J8
 * 3) macro elongated_pentagonal_dipyramid elongated_dipyramid(3) #end   // J9
 * 1) macro rhombicuboctahedron_mod(j_number)
 * 1) macro square_cupola                rhombicuboctahedron_mod(4)  autoface #end //  J4
 * 2) macro elongated_square_cupola      rhombicuboctahedron_mod(19) autoface #end //  J19
 * 3) macro gyroelongated_square_cupola  rhombicuboctahedron_mod(23) autoface #end //  J23
 * 4) macro square_orthobicupola         rhombicuboctahedron_mod(28) autoface #end //  J28
 * 5) macro square_gyrobicupola          rhombicuboctahedron_mod(29) autoface #end //  J29
 * 6) macro elongated_square_gyrobicupola rhombicuboctahedron_mod(37) autoface #end // J37
 * 7) macro gyroelongated_square_bicupola rhombicuboctahedron_mod(45) autoface #end // J45
 * 1) macro elongated_square_cupola_alt  //  J19
 * 1) macro gyroelongated_square_pyramid
 * 1) macro gyroelongated_square_dipyramid
 * 1) macro gyroelongated_pentagonal_pyramid
 * 1) macro metabidiminished_icosahedron
 * 1) macro tridiminished_icosahedron
 * 1) macro augmented_tridiminished_icosahedron
 * 1) macro augmented_dodecahedron //J58
 * 1) macro parabiaugmented_dodecahedron //J59
 * 1) macro metabiaugmented_dodecahedron //J60
 * 1) macro triaugmented_dodecahedron //J61
 * 1) macro icosidodecahedron_mod(j_number)
 * 1) macro pentagonal_rotunda icosidodecahedron_mod(6)   #end // J6. Half an icosidodecahedron
 * 2) macro elongated_pentagonal_rotunda icosidodecahedron_mod(21)   #end // J21. Half an icosidodecahedron on a prism
 * 3) macro gyroelongated_pentagonal_rotunda icosidodecahedron_mod(25)   #end // J25. Half an icosidodecahedron on an antiprism
 * 4) macro pentagonal_orthobirotunda icosidodecahedron_mod(34) #end // J34. Twisted icosidodecahedron
 * 5) macro elongated_pentagonal_gyrobirotunda icosidodecahedron_mod(43) #end // J43. Elongated icosidodecahedron
 * 6) macro elongated_pentagonal_orthobirotunda icosidodecahedron_mod(42) #end // J42. Elongated twisted icosidodecahedron
 * 7) macro gyroelongated_pentagonal_birotunda icosidodecahedron_mod(48) #end // J48. Elongated semitwisted icosidodecahedron
 * 1) macro pentagonal_orthocupolarotunda icosidodecahedron_mod(32)  #end    //J32
 * 2) macro pentagonal_gyrocupolarotunda icosidodecahedron_mod(33)  #end //J32
 * 1) macro elongated_pentagonal_cupola  //J20
 * 1) macro gyroelongated_pentagonal_cupola  //J24
 * 1) macro pentagonal_orthobicupola //J30
 * 1) macro pentagonal_gyrobicupola  //J31
 * 1) macro elongated_pentagonal_orthobicupola   //J38
 * 1) macro elongated_pentagonal_gyrobicupola //J39
 * 1) macro gyroelongated_pentagonal_bicupola //J46
 * 1) macro augmented_prisms(n,facelist)   // n=prism base, facelist=string with faces to cap
 * 1) macro augmented_triangular_prism augmented_prisms(3,"0") #end  // J49
 * 2) macro biaugmented_triangular_prism augmented_prisms(3,"01") #end   // J50
 * 3) macro triaugmented_triangular_prism augmented_prisms(3,"012") #end // J51
 * 4) macro augmented_pentagonal_prism   augmented_prisms(5,"0") #end    // J52
 * 5) macro biaugmented_pentagonal_prism augmented_prisms(5,"02") #end   // J53
 * 6) macro augmented_hexagonal_prism augmented_prisms(6,"0") #end   // J54
 * 7) macro parabiaugmented_hexagonal_prism  augmented_prisms(6,"03")    #end    // J55
 * 8) macro metabiaugmented_hexagonal_prism  augmented_prisms(6,"02")    #end    // J56
 * 9) macro triaugmented_hexagonal_prism augmented_prisms(6,"024")   #end    // J57
 * 1) macro pentagonal_cupola //J5
 * 1) macro mogrified_rhombicosidodecahedron(mods) //J72-J83
 * 1) macro snub_disphenoid  // J84
 * 1) macro snub_square_antiprism // J85
 * 1) macro sphenocoronae(n)   // J86 & J87
 * 1) macro sphenocorona // J86
 * 1) macro augmented_sphenocorona   // J87
 * 1) macro augmented_sphenocorona_old   // J87
 * 1) macro sphenomegacorona // J88
 * 1) macro hebesphenomegacorona // J89
 * 1) macro disphenocingulum //  J90
 * 1) macro bilunabirotunda // J91
 * 1) macro triangular_hebesphenorotunda // J91
 * 1) declare points=array[1000];
 * 2) declare tpoints=array[1000];
 * 3) declare npoints=0;
 * 4) declare faces=array[1000];
 * 5) declare nfaces=0;
 * 6) macro addpoint(a)
 * 1) macro addevenperms(a)
 * 1) macro addperms(a)
 * 1) macro addpointssgn(a,s)
 * 1) macro addevenpermssgn(a,s)
 * 1) macro addpermssgn(a,s)
 * 1) macro addpointsevensgn(a)
 * 1) macro addevenpermsevensgn(a)
 * 1) macro addpermsaltsgn(a)
 * 1) end*/
 * 2) macro addface(d,l)
 * 1) macro dual
 * 1) macro autoface //WARNING: ONLY WORKS IF ALL EDGES HAVE EQUAL LENGTH
 * 1) declare rot1=rand(rotation)*pi*2;
 * 2) declare rot2=acos(1-2*rand(rotation));
 * 3) declare rot3=(rand(rotation)+clock)*pi*2;
 * 4) macro dorot
 * 1) if(1)
 * 1) macro addp(a)
 * 1) local a=0; #while(a<nfaces-.5)
 * 1) local a=a+1; #end
 * 1) local a=a+1; #end*/
 * 1) if (1)
 * 1) else
 * 1) if(notwireframe)
 * 1) local a=0;
 * 2) while(a<11.0001)
 * 1) if (0)   // default framing vs auto-framing
 * 1) else