This is my modification of user:Cyp's image:Poly.pov 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
editUpdated 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
edit- 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 #declare notwireframe=1; #declare withreflection=0; #declare flashiness=0.25; //Still pictures use 1, animated should probably be about 0.25. #macro This_shape_will_be_drawn() //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 #declare tau=(1+sqrt(5))/2; #declare sq2=sqrt(2); #declare sq297=sqrt(297); #declare xi=(pow(sq297+17,1/3)-pow(sq297-17,1/3)-1)/3; #declare sqweird=sqrt(tau-5/27); #declare ouch=pow((tau+sqweird)/2,1/3)+pow((tau-sqweird)/2,1/3); #declare alfa=ouch-1/ouch; #declare veta=(ouch+tau+1/ouch)*tau; #macro tetrahedron() addpointsevensgn(<1,1,1>) autoface() #end #macro hexahedron() addpointssgn(<1,1,1>,<1,1,1>) autoface() #end #macro octahedron() addevenpermssgn(<1,0,0>,<1,0,0>) autoface() #end #macro dodecahedron() addpointssgn(<1,1,1>,<1,1,1>) addevenpermssgn(<0,1/tau,tau>,<0,1,1>) autoface() #end #macro icosahedron() addevenpermssgn(<0,1,tau>,<0,1,1>) autoface() #end #macro weirdahedron() addpermssgn(<1,2,3>,<1,1,1>) autoface() #end #macro cuboctahedron() addevenpermssgn(<0,1,1>,<0,1,1>) autoface() #end #macro icosidodecahedron() addevenpermssgn(<0,0,2*tau>,<0,0,1>) addevenpermssgn(<1,tau,1+tau>,<1,1,1>) autoface() #end #macro truncatedtetrahedron(augmentation) 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 #macro truncatedhexahedron(augmentation) addevenpermssgn(<sq2-1,1,1>,<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 #macro truncatedoctahedron() addpermssgn(<0,1,2>,<0,1,1>) autoface() #end #macro truncateddodecahedron(augmentation) addevenpermssgn(<0,1/tau,2+tau>,<0,1,1>) addevenpermssgn(<1/tau,tau,2*tau>,<1,1,1>) addevenpermssgn(<tau,2,1+tau>,<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 #macro truncatedicosahedron() 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 #macro rhombicuboctahedron() addevenpermssgn(<1+sq2,1,1>,<1,1,1>) autoface() #end #macro truncatedcuboctahedron() addpermssgn(<1,1+sq2,1+sq2*2>,<1,1,1>) autoface() #end #macro rhombicosidodecahedron() 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>) autoface() #end #macro truncatedicosidodecahedron() 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(<tau,3,2*tau>,<1,1,1>) autoface() #end #macro snubhexahedron(s) addpermsaltsgn(<1,1/xi,xi>*s) autoface() #end #macro snubdodecahedron(s) addevenpermsevensgn(<2*alfa,2,2*veta>*s) addevenpermsevensgn(<alfa+veta/tau+tau,-alfa*tau+veta+1/tau,alfa/tau+veta*tau-1>*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(<alfa+veta/tau-tau,alfa*tau-veta+1/tau,alfa/tau+veta*tau+1>*s) autoface() #end #macro rhombicdodecahedron() cuboctahedron() dual() #end #macro rhombictriacontahedron() icosidodecahedron() dual() #end #macro triakistetrahedron() truncatedtetrahedron(0) dual() #end #macro triakisoctahedron() truncatedhexahedron(0) dual() #end #macro tetrakishexahedron() truncatedoctahedron() dual() #end #macro triakisicosahedron() truncateddodecahedron(0) dual() #end #macro pentakisdodecahedron() truncatedicosahedron() dual() #end #macro deltoidalicositetrahedron() rhombicuboctahedron() dual() #end #macro disdyakisdodecahedron() truncatedcuboctahedron() dual() #end #macro deltoidalhexecontahedron() rhombicosidodecahedron() dual() #end #macro disdyakistriacontahedron() truncatedicosidodecahedron() dual() #end #macro pentagonalicositetrahedron(s) snubhexahedron(s) dual() #end #macro pentagonalhexecontahedron(s) snubdodecahedron(s) dual() #end //>>>>>>>>>>>>>>>>> changed AGK [20041101] #macro polygon_vtx(n) #local i=0; #while (i<n-.5) addpoint(<cos(i*2*pi/n),sin(i*2*pi/n),0>) #local i=i+1; #end #end #macro rprism_vtx(n) #local a=sqrt((1-cos(2*pi/n))/2); #local b=0; #while(b<n-.5) addpointssgn(<sin(2*pi*b/n),cos(2*pi*b/n),a>,<0,0,1>) #local b=b+1; #end #end #macro antiprism_vtx(n) #local a=sqrt((cos(pi/n)-cos(2*pi/n))/2); #local b=0; #while(b<2*n-.5) addpoint(<sin(pi*b/n),cos(pi*b/n),a>) #local a=-a; #local b=b+1; #end #end #macro rprism(n) rprism_vtx(n) autoface() #end #macro antiprism(n) antiprism_vtx(n) autoface() #end //<<<<<<<<<<<<<<<<< changed AGK [20041101] #macro bipyramid(n) rprism(n) dual() #end #macro trapezohedron(n) antiprism(n) dual() #end //>>>>>>>>>>>>>>>>> added AGK [20041101] #macro augment(n,va,vb,vc) // on an n-face with 3 adjacent vtxs, add a pyramid or a cupola #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 #macro rotateabout(raxis,rangle,va) // raxis must be a unit vector (vdot(raxis,va)*raxis + cos(rangle)*(va-vdot(raxis,va)*raxis) + sin(rangle)*(vcross(raxis,va))) #end #macro rotate_vtxs(raxis,rangle,thresh) // all points in the halfspace v.raxis <= tresh #local i=0; #while (i<npoints-.5) #if (vdot(points[i],raxis) < thresh+0.01) #declare points[i]=rotateabout(raxis,pi*rangle/180,points[i]); #end // if #local i=i+1; #end //while #end #macro drop_vtx(n) #declare npoints=npoints-1; #if(n<npoints) #declare points[n]=points[npoints]; #end #end #macro drop_halfspace(normalvector,thresh) // all points in the halfspace v.raxis < tresh #local i=0; #while (i<npoints-.5) #if (vdot(points[i],normalvector)<thresh-0.01) #debug concat("Drop 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") 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 #macro autobalance() // moves the centre of gravity (cog) of the vertices to the origin #local cog=<0,0,0>; #local i=0; #while (i<npoints-.5) #local cog=cog+points[i]; #local i=i+1; #end #local cog=cog/npoints; #local i=0; #while (i<npoints-.5) #declare points[i]=points[i] - cog; #local i=i+1; #end #end #macro showvtxs() #local i=0; #while (i<npoints-.5) #debug concat("Vtx ",str(i,0,0)," of ",str(npoints,0,0),"= <",str(points[i].x,0,7),",",str(points[i].y,0,7),",",str(points[i].z,0,7),">\n") #local i=i+1; #end #end #macro drawit() #local i=0; #while (i<npoints) sphere { points[i], .05 dorot() pigment { colour <.3,.3,.3> } finish { ambient 0 diffuse 1 phong 1 } } #local j=0; #while (j<npoints) #ifdef(edgelen[i][j]) #local dist=vlength(points[i]-points[j]); cylinder { points[i],points[j], .02 dorot() pigment { #switch (dist-edgelen[i][j]) #range (-999,-0.1) colour <1,0,0> #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 el=1; #declare edgelen=array[120][120]; #declare forces=array[120]; #macro addedge(a,b,len) #declare edgelen[a][b]=len; #declare edgelen[b][a]=len; #end #macro make_triangle(a,b,c) addedge(a,b,el) addedge(a,c,el) addedge(b,c,el) #end #macro make_square(a,b,c,d) 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 #macro make_lune(a,b,c,d,e,f) // a and d are points of lune make_triangle(a,b,f) make_square(b,c,e,f) make_triangle(c,d,e) #end #macro optimise(gen_threshold,force_threshold) #local gen=0; #local maxforce=force_threshold+1; #while ((gen<gen_threshold) & (maxforce>force_threshold)) #debug concat("Gen ",str(gen,0,0)," ") // showvtxs() #local maxforce=-999; #local i=0; #while (i<npoints) #declare forces[i]=<0,0,0>; #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<vlength(forces[i])) #local maxforce=vlength(forces[i]); #end #local i=i+1; #end #debug concat("maxforce=",str(maxforce,9,9),"\n") #local i=0; #while (i<npoints) #declare points[i]=points[i]+.1*forces[i]; #local i=i+1; #end #local gen=gen+1; #end #end // Johnson solids // J1 = square_pyramid (octahedron with vtx dropped) #macro square_pyramid() addevenpermssgn(<1,0,0>,<1,0,0>) drop_vtx(99) autobalance() autoface() #end // J2 = pentagonal_pyramid (six vtxs of an icosahedron) #macro pentagonal_pyramid() 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) #macro triangular_cupola() polygon_vtx(6) augment(6,points[0],points[1],points[2]) autobalance() autoface() #end #macro triangular_gyrobicupola() //actually a cuboctahedron polygon_vtx(6) augment(6,points[0],points[1],points[2]) augment(6,points[2],points[1],points[0]) autobalance() autoface() #end #macro elongated_triangular_cupola() //J18 rprism_vtx(6) augment(6,points[1],points[3],points[5]) autobalance() autoface() #end #macro gyroelongated_triangular_cupola() //J22 antiprism_vtx(6) augment(6,points[1],points[3],points[5]) autobalance() autoface() #end #macro triangular_orthobicupola() //J27 polygon_vtx(6) augment(6,points[0],points[1],points[2]) augment(6,points[3],points[2],points[1]) autobalance() autoface() #end #macro elongated_triangular_orthobicupola() //J35 rprism_vtx(6) augment(6,points[1],points[3],points[5]) augment(6,points[6],points[4],points[2]) autobalance() autoface() #end #macro elongated_triangular_gyrobicupola() //J36 rprism_vtx(6) augment(6,points[1],points[3],points[5]) augment(6,points[4],points[2],points[0]) autobalance() autoface() #end #macro gyroelongated_triangular_bicupola() //J44 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 #macro gyrobifastigium() // J26 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() #end //---------------- miscellaneous cut and pasting #macro elongated_pyramid(n) // J7-9 (for n=3,4,5) rprism_vtx(n) augment(n,points[4],points[2],points[0]) autobalance() autoface() #end #macro dipyramid(n) // J12 (n=3) and J13 (n=5) polygon_vtx(n) augment(n,points[0],points[1],points[2]) augment(n,points[2],points[1],points[0]) autobalance() autoface() #end #macro elongated_dipyramid(n) // J14-16 (for n=3,4,5) rprism_vtx(n) augment(n,points[4],points[2],points[0]) augment(n,points[1],points[3],points[5]) autobalance() autoface() #end #macro elongated_triangular_dipyramid() elongated_dipyramid(3) #end // J7 #macro elongated_square_dipyramid() elongated_dipyramid(3) #end // J8 #macro elongated_pentagonal_dipyramid() elongated_dipyramid(3) #end // J9 // ----------------- rhombicuboctahedron modifications J - 4, 19, 23, 28, 29, 37, 45 #macro rhombicuboctahedron_mod(j_number) 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 #macro square_cupola() rhombicuboctahedron_mod(4) autoface() #end // J4 #macro elongated_square_cupola() rhombicuboctahedron_mod(19) autoface() #end // J19 #macro gyroelongated_square_cupola() rhombicuboctahedron_mod(23) autoface() #end // J23 #macro square_orthobicupola() rhombicuboctahedron_mod(28) autoface() #end // J28 #macro square_gyrobicupola() rhombicuboctahedron_mod(29) autoface() #end // J29 #macro elongated_square_gyrobicupola() rhombicuboctahedron_mod(37) autoface() #end // J37 #macro gyroelongated_square_bicupola() rhombicuboctahedron_mod(45) autoface() #end // J45 #macro elongated_square_cupola_alt() // J19 rprism_vtx(8) augment(8,points[4],points[2],points[0]) autoface() #end // J10. (cap a square antiprism) #macro gyroelongated_square_pyramid() antiprism_vtx(4) #local va=points[1]; addpoint(<0,0,-(abs(va.z)+1)>) autoface() #end // J17. (bicap a square antiprism) #macro gyroelongated_square_dipyramid() 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) #macro gyroelongated_pentagonal_pyramid() addevenpermssgn(<0,1,tau>,<0,1,1>) drop_vtx(99) autoface() #end // J62. (drop 2 vertices from an icosahedron) #macro metabidiminished_icosahedron() addevenpermssgn(<0,1,tau>,<0,1,1>) drop_vtx(99) drop_vtx(6) autoface() #end // J63. (drop 3 vertices from an icosahedron) #macro tridiminished_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) #macro augmented_tridiminished_icosahedron() 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 #macro augmented_dodecahedron() //J58 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 #macro parabiaugmented_dodecahedron() //J59 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 #macro metabiaugmented_dodecahedron() //J60 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 #macro triaugmented_dodecahedron() //J61 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 #macro icosidodecahedron_mod(j_number) 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 #macro pentagonal_rotunda() icosidodecahedron_mod(6) #end // J6. Half an icosidodecahedron #macro elongated_pentagonal_rotunda() icosidodecahedron_mod(21) #end // J21. Half an icosidodecahedron on a prism #macro gyroelongated_pentagonal_rotunda() icosidodecahedron_mod(25) #end // J25. Half an icosidodecahedron on an antiprism #macro pentagonal_orthobirotunda() icosidodecahedron_mod(34) #end // J34. Twisted icosidodecahedron #macro elongated_pentagonal_gyrobirotunda() icosidodecahedron_mod(43) #end // J43. Elongated icosidodecahedron #macro elongated_pentagonal_orthobirotunda() icosidodecahedron_mod(42) #end // J42. Elongated twisted icosidodecahedron #macro gyroelongated_pentagonal_birotunda() icosidodecahedron_mod(48) #end // J48. Elongated semitwisted icosidodecahedron #macro pentagonal_orthocupolarotunda() icosidodecahedron_mod(32) #end //J32 #macro pentagonal_gyrocupolarotunda() icosidodecahedron_mod(33) #end //J32 //---------------------- pentagonal cupolae, bicupolae #macro elongated_pentagonal_cupola() //J20 rprism_vtx(10) augment(10,points[4],points[2],points[0]) autobalance() autoface() #end #macro gyroelongated_pentagonal_cupola() //J24 antiprism_vtx(10) augment(10,points[4],points[2],points[0]) autobalance() autoface() #end #macro pentagonal_orthobicupola() //J30 polygon_vtx(10) augment(10,points[0],points[1],points[2]) augment(10,points[3],points[2],points[1]) autobalance() autoface() #end #macro pentagonal_gyrobicupola() //J31 polygon_vtx(10) augment(10,points[0],points[1],points[2]) augment(10,points[2],points[1],points[0]) autobalance() autoface() #end #macro elongated_pentagonal_orthobicupola() //J38 rprism_vtx(10) augment(10,points[4],points[2],points[0]) augment(10,points[3],points[5],points[7]) autobalance() autoface() #end #macro elongated_pentagonal_gyrobicupola() //J39 rprism_vtx(10) augment(10,points[4],points[2],points[0]) augment(10,points[1],points[3],points[5]) showvtxs() autobalance() autoface() #end #macro gyroelongated_pentagonal_bicupola() //J46 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 #macro augmented_prisms(n,facelist) // n=prism base, facelist=string with faces to cap 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 #macro augmented_triangular_prism() augmented_prisms(3,"0") #end // J49 #macro biaugmented_triangular_prism() augmented_prisms(3,"01") #end // J50 #macro triaugmented_triangular_prism() augmented_prisms(3,"012") #end // J51 #macro augmented_pentagonal_prism() augmented_prisms(5,"0") #end // J52 #macro biaugmented_pentagonal_prism() augmented_prisms(5,"02") #end // J53 #macro augmented_hexagonal_prism() augmented_prisms(6,"0") #end // J54 #macro parabiaugmented_hexagonal_prism() augmented_prisms(6,"03") #end // J55 #macro metabiaugmented_hexagonal_prism() augmented_prisms(6,"02") #end // J56 #macro triaugmented_hexagonal_prism() augmented_prisms(6,"024") #end // J57 // ----------------- rhombicosidodecahedron modifications #macro pentagonal_cupola() //J5 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 mogrified_rhombicosidodecahedron(mods) //J72-J83 // 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 #macro snub_disphenoid() // J84 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 #macro snub_square_antiprism() // J85 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 #macro sphenocoronae(n) // J86 & J87 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 #macro sphenocorona() // J86 sphenocoronae(86) #end #macro augmented_sphenocorona() // J87 sphenocoronae(87) #end #macro augmented_sphenocorona_old() // J87 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 #macro sphenomegacorona() // J88 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 #macro hebesphenomegacorona() // J89 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 #macro disphenocingulum() // J90 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 #macro bilunabirotunda() // J91 // 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 #macro triangular_hebesphenorotunda() // J91 // 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=array[1000]; #declare tpoints=array[1000]; #declare npoints=0; #declare faces=array[1000]; #declare nfaces=0; #macro addpoint(a) #declare points[npoints]=a; #declare npoints=npoints+1; #end #macro addevenperms(a) addpoint(a) addpoint(<a.y,a.z,a.x>) addpoint(<a.z,a.x,a.y>) #end #macro addperms(a) addevenperms(a) addevenperms(<a.x,a.z,a.y>) #end #macro addpointssgn(a,s) 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 #macro addevenpermssgn(a,s) 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 #macro addpermssgn(a,s) addevenpermssgn(a,s) addevenpermssgn(<a.x,a.z,a.y>,<s.x,s.z,s.y>) #end #macro addpointsevensgn(a) addpoint(a) addpoint(a*<-1,-1,1>) addpoint(a*<-1,1,-1>) addpoint(a*<1,-1,-1>) #end #macro addevenpermsevensgn(a) addevenperms(a) addevenperms(a*<-1,-1,1>) addevenperms(a*<-1,1,-1>) addevenperms(a*<1,-1,-1>) #end #macro addpermsaltsgn(a) 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 #end*/ #macro addface(d,l) #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 #macro dual() #declare temp=faces; #declare faces=points; #declare points=temp; #declare temp=nfaces; #declare nfaces=npoints; #declare npoints=temp; #end #macro autoface() //WARNING: ONLY WORKS IF ALL EDGES HAVE EQUAL LENGTH //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... #declare rot1=rand(rotation)*pi*2; #declare rot2=acos(1-2*rand(rotation)); #declare rot3=(rand(rotation)+clock)*pi*2; #macro dorot() rotate rot1*180/pi*y rotate rot2*180/pi*x rotate rot3*180/pi*y #end // drawit() #if(1) //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 #macro addp(a) #declare p[np]=a; #declare np=np+1; #end #local a=0; #while(a<nfaces-.5) #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=a+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 #local a=a+1; #end*/ //>>>>>>>>>>>>>>>>> changed AGK [20041101] //Draw points #if (1) #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 #else #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] #if(notwireframe) //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 #local a=0; #while(a<11.0001) 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> } #if (0) // default framing vs auto-framing 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> } #else // 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 } }