// polyhedra.inc version 1 // POV-Ray version 3.1 // Dan Johnson zapob@hotmail.com // This is a collection of my best functions and shapes. // The reason why there are two size variables is if you were to just use the povray Scale function // the spheres and cylinders would also be Scaled, and I went to significant trouble to make so many shapes // nest together nicely it would be a shame to have to do extra calculations to maintain things. // Angle_between_vectors // returns the angle in degrees between two vectors #macro Angle_between_vectors(U,V) (degrees (acos(vdot(U,V)/(vlength(U)*vlength(V))))) #end #macro Arrange_3d (A,B,C,N) ( (mod(N+A-1,A))*x + (B-mod(div(N+A-1,A)+B-1,B))*y + (mod(div(N+B*A-1,B*A)+C-1,C))*z -/2) #end // use only natural numbers aka 1,2,3,4,5,6... no fractions 0 or negative numbers #declare Tetrahedron1 = <1,1,1>;// Tetrahedron vertex points #declare Tetrahedron2 = <1,-1,-1>; #declare Tetrahedron3 = <-1,1,-1>; #declare Tetrahedron4 = <-1,-1,1>; #declare TetrahedronFaceLength = (vlength ( Tetrahedron1+Tetrahedron2+Tetrahedron3)/3); //distance from origin to a tetrahedrons face #declare TetrahedronFace1 = <1,1,-1>;// vector in the direction of the faces of the tetrahedron #declare TetrahedronFace2 = <1,-1,1>; #declare TetrahedronFace3 = <-1,1,1>; #declare TetrahedronFace4 = <-1,-1,-1>; #declare Cube1 = <1,1,1>; // Cube vertexes #declare Cube2 = <1,1,-1>; #declare Cube3 = <1,-1,1>; #declare Cube4 = <1,-1,-1>; #declare Cube5 = <-1,1,1>; #declare Cube6 = <-1,1,-1>; #declare Cube7 = <-1,-1,1>; #declare Cube8 = <-1,-1,-1>; #declare OctahedronFaceLength = (vlength (<1,1,1>)/3); #declare Golden = ((1+ pow(5,.5))/2); // the golden section... 1 + the square root of 5 over 2 #declare Golden2 = (Golden -1); // the golden ratio is the only ratio where one is the difference between it and its inverse #declare Golden3 = pow (Golden2,2); //Golden2 Squared #declare Golden4 = pow (Golden,2); //Golden Squared #declare Icosahedron1 = ; //Icosahedron vertexes #declare Icosahedron2 = ; #declare Icosahedron3 = ; #declare Icosahedron4 = ; #declare Icosahedron5 = <0,Golden3,Golden2>; #declare Icosahedron6 = <0,Golden3,-Golden2>; #declare Icosahedron7 = <0,-Golden3,Golden2>; #declare Icosahedron8 = <0,-Golden3,-Golden2>; #declare Icosahedron9 = <-Golden3,Golden2,0>; #declare Icosahedron10 = <-Golden3,-Golden2,0>; #declare Icosahedron11 = <-Golden2,0,Golden3>; #declare Icosahedron12 = <-Golden2,0,-Golden3>; #declare Dodecahedron1 = ; // Dodecahedron vertexes #declare Dodecahedron2 = ; #declare Dodecahedron3 = Cube1; #declare Dodecahedron4 = Cube2; #declare Dodecahedron5 = Cube3; #declare Dodecahedron6 = Cube4; #declare Dodecahedron7 = ; #declare Dodecahedron8 = ; #declare Dodecahedron9 = <0,Golden,Golden2>; #declare Dodecahedron10 = <0,Golden,-Golden2>; #declare Dodecahedron11 = <0,-Golden,Golden2>; #declare Dodecahedron12 = <0,-Golden,-Golden2>; #declare Dodecahedron13 = <-Golden2,0,Golden>; #declare Dodecahedron14 = <-Golden2,0,-Golden>; #declare Dodecahedron15 = Cube5; #declare Dodecahedron16 = Cube6; #declare Dodecahedron17 = Cube7; #declare Dodecahedron18 = Cube8; #declare Dodecahedron19 = <-Golden,Golden2,0>; #declare Dodecahedron20 = <-Golden,-Golden2,0>; #declare IcasahedronFaceLength = (vlength(Icosahedron1+Icosahedron2+Icosahedron3)/3); // length from origin to face of Icosahedron #declare DodecahedronFaceLength = (vlength(Dodecahedron1+Dodecahedron2+Dodecahedron3+Dodecahedron5+Dodecahedron7)/5);// lengh from origin to Dodecahedron face #macro Tetrahedron_vertexes (Scale,Sphere_size) //Scale: size of tetrahedron, a value of 1 fits in a 2x2x2 box union { //centered at the origin sphere { Tetrahedron1 * Scale, Sphere_size} // sphere { Tetrahedron2 * Scale, Sphere_size} //Sphere_size: diameter of the spheres used for vertexes sphere { Tetrahedron3 * Scale, Sphere_size} sphere { Tetrahedron4 * Scale, Sphere_size} } #end #macro Tetrahedron_edges (Scale, Cylinder_size) //Scale: size of tetrahedron value of 1 fits in a 2x2x2 box union { //centered at the origin cylinder { Tetrahedron1 * Scale ,Tetrahedron2 * Scale , Cylinder_size} // cylinder { Tetrahedron1 * Scale ,Tetrahedron3 * Scale , Cylinder_size} //Cylinder_size: diameter of cylinders used as edges cylinder { Tetrahedron1 * Scale ,Tetrahedron4 * Scale , Cylinder_size} cylinder { Tetrahedron2 * Scale ,Tetrahedron3 * Scale , Cylinder_size} cylinder { Tetrahedron2 * Scale ,Tetrahedron4 * Scale , Cylinder_size} cylinder { Tetrahedron3 * Scale ,Tetrahedron4 * Scale , Cylinder_size} } #end #declare Tetrahedron_faces = // can't think of a good reason to make this a macro intersection { // plane { TetrahedronFace1, TetrahedronFaceLength } // solid tetrahedron centered at the origin plane { TetrahedronFace2, TetrahedronFaceLength } // inscribe diameter = TetrahedronFaceLenth plane { TetrahedronFace3, TetrahedronFaceLength } // circumscribe diameter = the square root of three plane { TetrahedronFace4, TetrahedronFaceLength } bounded_by {sphere {<0,0,0>,pow (3,.5)}}} #macro Cube_vertexes (Scale, Sphere_size) // box vertexes Scale value of 1 is a 2x2x2 box union { sphere { Cube1 * Scale, Sphere_size} sphere { Cube2 * Scale, Sphere_size} sphere { Cube3 * Scale, Sphere_size} sphere { Cube4 * Scale, Sphere_size} sphere { Cube5 * Scale, Sphere_size} sphere { Cube6 * Scale, Sphere_size} sphere { Cube7 * Scale, Sphere_size} sphere { Cube8 * Scale, Sphere_size} } #end #macro Cube_edges (Scale, Cylinder_size) // box edges Scale value of 1 is a 2x2x2 box union { cylinder { Cube1 * Scale ,Cube2 * Scale , Cylinder_size} cylinder { Cube1 * Scale ,Cube3 * Scale , Cylinder_size} cylinder { Cube2 * Scale ,Cube4 * Scale , Cylinder_size} cylinder { Cube3 * Scale ,Cube4 * Scale , Cylinder_size} cylinder { Cube1 * Scale ,Cube5 * Scale , Cylinder_size} cylinder { Cube2 * Scale ,Cube6 * Scale , Cylinder_size} cylinder { Cube3 * Scale ,Cube7 * Scale , Cylinder_size} cylinder { Cube4 * Scale ,Cube8 * Scale , Cylinder_size} cylinder { Cube5 * Scale ,Cube6 * Scale , Cylinder_size} cylinder { Cube5 * Scale ,Cube7 * Scale , Cylinder_size} cylinder { Cube6 * Scale ,Cube8 * Scale , Cylinder_size} cylinder { Cube7 * Scale ,Cube8 * Scale , Cylinder_size} } #end #declare Cube_faces = box { <-1,-1,-1>, <1,1,1> } // 2x2x2 box why bother... I don't know #macro Octahedron_vertexes (Scale, Sphere_size) //Scale size of 1 fits inside a 2x2x2 box union { //Scale size of 2 fits around a 2x2x2 box sphere { x * Scale, Sphere_size} sphere { y * Scale, Sphere_size} sphere { z * Scale, Sphere_size} sphere { -z * Scale, Sphere_size} sphere { -y * Scale, Sphere_size} sphere { -x * Scale, Sphere_size} } #end #macro Octahedron_edges (Scale, Cylinder_size) union { cylinder { x * Scale, y * Scale, Cylinder_size} //Scale size of 1 fits inside a 2x2x2 box cylinder { x * Scale, z * Scale, Cylinder_size} //Scale size of 2 fits around a 2x2x2 box cylinder { x * Scale, -z * Scale, Cylinder_size} cylinder { x * Scale, -y * Scale, Cylinder_size} cylinder { y * Scale, z * Scale, Cylinder_size} cylinder { y * Scale, -z * Scale, Cylinder_size} cylinder { -y * Scale, z * Scale, Cylinder_size} cylinder { -y * Scale, -z * Scale, Cylinder_size} cylinder { -x * Scale, y * Scale, Cylinder_size} cylinder { -x * Scale, z * Scale, Cylinder_size} cylinder { -x * Scale, -z * Scale, Cylinder_size} cylinder { -x * Scale, -y * Scale, Cylinder_size} } #end #declare Octahedron_faces = intersection { plane { Cube1, OctahedronFaceLength} //inscribe diameter = OctahedronFaceLength plane { Cube2, OctahedronFaceLength} //cicumscribe diameter = 1 plane { Cube3, OctahedronFaceLength} plane { Cube4, OctahedronFaceLength} plane { Cube5, OctahedronFaceLength} plane { Cube6, OctahedronFaceLength} plane { Cube7, OctahedronFaceLength} plane { Cube8, OctahedronFaceLength} bounded_by {sphere {<0,0,0>,1}}} #macro Dodecahedron_vertexes (Scale, Sphere_size) // Scale size of 1 fits around a 2x2x2 box union { // Scale size of Golden2 fits inside a 2x2x2 box sphere { Dodecahedron1 * Scale, Sphere_size} sphere { Dodecahedron2 * Scale, Sphere_size} sphere { Dodecahedron3 * Scale, Sphere_size} sphere { Dodecahedron4 * Scale, Sphere_size} sphere { Dodecahedron5 * Scale, Sphere_size} sphere { Dodecahedron6 * Scale, Sphere_size} sphere { Dodecahedron7 * Scale, Sphere_size} sphere { Dodecahedron8 * Scale, Sphere_size} sphere { Dodecahedron9 * Scale, Sphere_size} sphere { Dodecahedron10 * Scale, Sphere_size} sphere { Dodecahedron11 * Scale, Sphere_size} sphere { Dodecahedron12 * Scale, Sphere_size} sphere { Dodecahedron13 * Scale, Sphere_size} sphere { Dodecahedron14 * Scale, Sphere_size} sphere { Dodecahedron15 * Scale, Sphere_size} sphere { Dodecahedron16 * Scale, Sphere_size} sphere { Dodecahedron17 * Scale, Sphere_size} sphere { Dodecahedron18 * Scale, Sphere_size} sphere { Dodecahedron19 * Scale, Sphere_size} sphere { Dodecahedron20 * Scale, Sphere_size} } #end #macro Dodecahedron_edges (Scale, Cylinder_size) union { cylinder { Dodecahedron1 * Scale, Dodecahedron2 * Scale, Cylinder_size } // Scale size of 1 fits around a 2x2x2 box cylinder { Dodecahedron1 * Scale, Dodecahedron3 * Scale, Cylinder_size } // Scale size of Golden2 fits inside a 2x2x2 box cylinder { Dodecahedron1 * Scale, Dodecahedron4 * Scale, Cylinder_size } cylinder { Dodecahedron2 * Scale, Dodecahedron5 * Scale, Cylinder_size } cylinder { Dodecahedron2 * Scale, Dodecahedron6 * Scale, Cylinder_size } cylinder { Dodecahedron3 * Scale, Dodecahedron7 * Scale, Cylinder_size } cylinder { Dodecahedron4 * Scale, Dodecahedron8 * Scale, Cylinder_size } cylinder { Dodecahedron5 * Scale, Dodecahedron7 * Scale, Cylinder_size } cylinder { Dodecahedron6 * Scale, Dodecahedron8 * Scale, Cylinder_size } cylinder { Dodecahedron3 * Scale, Dodecahedron9 * Scale, Cylinder_size } cylinder { Dodecahedron4 * Scale, Dodecahedron10 * Scale, Cylinder_size } cylinder { Dodecahedron5 * Scale, Dodecahedron11 * Scale, Cylinder_size } cylinder { Dodecahedron6 * Scale, Dodecahedron12 * Scale, Cylinder_size } cylinder { Dodecahedron9 * Scale, Dodecahedron10 * Scale, Cylinder_size } cylinder { Dodecahedron7 * Scale, Dodecahedron13 * Scale, Cylinder_size } cylinder { Dodecahedron8 * Scale, Dodecahedron14 * Scale, Cylinder_size } cylinder { Dodecahedron11 * Scale, Dodecahedron12 * Scale, Cylinder_size } cylinder { Dodecahedron9 * Scale, Dodecahedron15 * Scale, Cylinder_size } cylinder { Dodecahedron10 * Scale, Dodecahedron16 * Scale, Cylinder_size } cylinder { Dodecahedron11 * Scale, Dodecahedron17 * Scale, Cylinder_size } cylinder { Dodecahedron12 * Scale, Dodecahedron18 * Scale, Cylinder_size } cylinder { Dodecahedron13 * Scale, Dodecahedron15 * Scale, Cylinder_size } cylinder { Dodecahedron14 * Scale, Dodecahedron16 * Scale, Cylinder_size } cylinder { Dodecahedron13 * Scale, Dodecahedron17 * Scale, Cylinder_size } cylinder { Dodecahedron14 * Scale, Dodecahedron18 * Scale, Cylinder_size } cylinder { Dodecahedron15 * Scale, Dodecahedron19 * Scale, Cylinder_size } cylinder { Dodecahedron16 * Scale, Dodecahedron19 * Scale, Cylinder_size } cylinder { Dodecahedron17 * Scale, Dodecahedron20 * Scale, Cylinder_size } cylinder { Dodecahedron18 * Scale, Dodecahedron20 * Scale, Cylinder_size } cylinder { Dodecahedron19 * Scale, Dodecahedron20 * Scale, Cylinder_size } } #end #declare Dodecahedron_faces = intersection { plane { Icosahedron1, DodecahedronFaceLength} // inscribe diameter = DodecahedronFaceLength plane { Icosahedron2, DodecahedronFaceLength} // circumscribe diameter = the square root of three plane { Icosahedron3, DodecahedronFaceLength} plane { Icosahedron4, DodecahedronFaceLength} plane { Icosahedron5, DodecahedronFaceLength} plane { Icosahedron6, DodecahedronFaceLength} plane { Icosahedron7, DodecahedronFaceLength} plane { Icosahedron8, DodecahedronFaceLength} plane { Icosahedron9, DodecahedronFaceLength} plane { Icosahedron10, DodecahedronFaceLength} plane { Icosahedron11, DodecahedronFaceLength} plane { Icosahedron12, DodecahedronFaceLength} bounded_by {sphere {<0,0,0>,pow(3,.5)}}} #macro Icosahedron_vertexes (Scale, Sphere_size) union { // Scale size of 1 fits in a octahedron of Scale size 1 sphere { Icosahedron1 * Scale, Sphere_size} // Scale size of Golden fits in a 2x2x2 box sphere { Icosahedron2 * Scale, Sphere_size} // Scale size of Golden4 intersects a Dodecahedron of Scale 1 sphere { Icosahedron3 * Scale, Sphere_size} sphere { Icosahedron4 * Scale, Sphere_size} sphere { Icosahedron5 * Scale, Sphere_size} sphere { Icosahedron6 * Scale, Sphere_size} sphere { Icosahedron7 * Scale, Sphere_size} sphere { Icosahedron8 * Scale, Sphere_size} sphere { Icosahedron9 * Scale, Sphere_size} sphere { Icosahedron10 * Scale, Sphere_size} sphere { Icosahedron11 * Scale, Sphere_size} sphere { Icosahedron12 * Scale, Sphere_size} } #end #macro Icosahedron_edges (Scale, Cylinder_size) union { cylinder { Icosahedron1 * Scale, Icosahedron2 * Scale, Cylinder_size} // Scale size of 1 fits in a octahedron of Scale size 1 // Scale size of Golden fits in a 2x2x2 box cylinder { Icosahedron1 * Scale, Icosahedron3 * Scale, Cylinder_size} // Scale size of Golden4 intersects a Dodecahedron of Scale 1 cylinder { Icosahedron2 * Scale, Icosahedron3 * Scale, Cylinder_size} cylinder { Icosahedron1 * Scale, Icosahedron4 * Scale, Cylinder_size} cylinder { Icosahedron2 * Scale, Icosahedron4 * Scale, Cylinder_size} cylinder { Icosahedron1 * Scale, Icosahedron5 * Scale, Cylinder_size} cylinder { Icosahedron2 * Scale, Icosahedron6 * Scale, Cylinder_size} cylinder { Icosahedron1 * Scale, Icosahedron7 * Scale, Cylinder_size} cylinder { Icosahedron2 * Scale, Icosahedron8 * Scale, Cylinder_size} cylinder { Icosahedron3 * Scale, Icosahedron5 * Scale, Cylinder_size} cylinder { Icosahedron3 * Scale, Icosahedron6 * Scale, Cylinder_size} cylinder { Icosahedron4 * Scale, Icosahedron7 * Scale, Cylinder_size} cylinder { Icosahedron4 * Scale, Icosahedron8 * Scale, Cylinder_size} cylinder { Icosahedron3 * Scale, Icosahedron9 * Scale, Cylinder_size} cylinder { Icosahedron5 * Scale, Icosahedron7 * Scale, Cylinder_size} cylinder { Icosahedron6 * Scale, Icosahedron8 * Scale, Cylinder_size} cylinder { Icosahedron4 * Scale, Icosahedron10 * Scale, Cylinder_size} cylinder { Icosahedron5 * Scale, Icosahedron9 * Scale, Cylinder_size} cylinder { Icosahedron6 * Scale, Icosahedron9 * Scale, Cylinder_size} cylinder { Icosahedron7 * Scale, Icosahedron10 * Scale, Cylinder_size} cylinder { Icosahedron8 * Scale, Icosahedron10 * Scale, Cylinder_size} cylinder { Icosahedron5 * Scale, Icosahedron11 * Scale, Cylinder_size} cylinder { Icosahedron6 * Scale, Icosahedron12 * Scale, Cylinder_size} cylinder { Icosahedron7 * Scale, Icosahedron11 * Scale, Cylinder_size} cylinder { Icosahedron8 * Scale, Icosahedron12 * Scale, Cylinder_size} cylinder { Icosahedron9 * Scale, Icosahedron11 * Scale, Cylinder_size} cylinder { Icosahedron9 * Scale, Icosahedron12 * Scale, Cylinder_size} cylinder { Icosahedron10 * Scale, Icosahedron11 * Scale, Cylinder_size} cylinder { Icosahedron10 * Scale, Icosahedron12 * Scale, Cylinder_size} cylinder { Icosahedron11 * Scale, Icosahedron12 * Scale, Cylinder_size} } #end #declare Icosahedron_faces = intersection { plane {Dodecahedron1,IcasahedronFaceLength} // inscribe diameter = IcosahedronFaceLength plane {Dodecahedron2,IcasahedronFaceLength} // circumscribe diameter = vlength(Icosahedron1) plane {Dodecahedron3,IcasahedronFaceLength} plane {Dodecahedron4,IcasahedronFaceLength} plane {Dodecahedron5,IcasahedronFaceLength} plane {Dodecahedron6,IcasahedronFaceLength} plane {Dodecahedron7,IcasahedronFaceLength} plane {Dodecahedron8,IcasahedronFaceLength} plane {Dodecahedron9,IcasahedronFaceLength} plane {Dodecahedron10,IcasahedronFaceLength} plane {Dodecahedron11,IcasahedronFaceLength} plane {Dodecahedron12,IcasahedronFaceLength} plane {Dodecahedron13,IcasahedronFaceLength} plane {Dodecahedron14,IcasahedronFaceLength} plane {Dodecahedron15,IcasahedronFaceLength} plane {Dodecahedron16,IcasahedronFaceLength} plane {Dodecahedron17,IcasahedronFaceLength} plane {Dodecahedron18,IcasahedronFaceLength} plane {Dodecahedron19,IcasahedronFaceLength} plane {Dodecahedron20,IcasahedronFaceLength} bounded_by {sphere { <0,0,0>, vlength (Icosahedron1)}}} #declare Icosidodecahedron = intersection { object {Dodecahedron_faces} object {Icosahedron_faces scale Golden4} } #declare Cuboctahedron = intersection { object {Cube_faces} object {Octahedron_faces scale 2} } #macro Pentagram (Major_radius,Minor_radius) merge { torus {Major_radius,Minor_radius rotate 90*x} cylinder {<0,Major_radius,0>,,Minor_radius} cylinder {,,Minor_radius} cylinder {,,Minor_radius} cylinder {,,Minor_radius} cylinder {,<0,Major_radius,0>,Minor_radius} } #end #macro Torus_rotate1 (V) // wanted to combine these two functions into a single matrix transformation (-Angle_between_vectors(y,V)*z) // don't know how POV-Ray combines two matrix's internally. One web page said #end // that it was a matrix multiplication, but from my memory you can't multiply // a 3x4 matrix by a 3x4 matrix. You can add or subtract them though. Hmm #macro Torus_rotate2 (V) ((degrees (atan2(V.z,V.x)))*y) #end #macro Cube_loops(Major_radius,Minor_radius) union { torus {Major_radius,Minor_radius rotate Torus_rotate1 (Cube1) rotate Torus_rotate2 (Cube1)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Cube2) rotate Torus_rotate2 (Cube2)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Cube3) rotate Torus_rotate2 (Cube3)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Cube4) rotate Torus_rotate2 (Cube4)} } #end #macro Octahedron_loops(Major_radius,Minor_radius) union { torus {Major_radius,Minor_radius} torus {Major_radius,Minor_radius rotate 90*x} torus {Major_radius,Minor_radius rotate 90*z} } #end #macro Icosahedron_loops(Major_radius,Minor_radius) union { torus {Major_radius,Minor_radius rotate Torus_rotate1 (Icosahedron1) rotate Torus_rotate2 (Icosahedron1)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Icosahedron2) rotate Torus_rotate2 (Icosahedron2)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Icosahedron3) rotate Torus_rotate2 (Icosahedron3)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Icosahedron4) rotate Torus_rotate2 (Icosahedron4)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Icosahedron5) rotate Torus_rotate2 (Icosahedron5)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Icosahedron6) rotate Torus_rotate2 (Icosahedron6)} } #end #macro Dodecahedron_loops(Major_radius,Minor_radius) union { torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron1) rotate Torus_rotate2 (Dodecahedron1)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron2) rotate Torus_rotate2 (Dodecahedron2)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron3) rotate Torus_rotate2 (Dodecahedron3)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron4) rotate Torus_rotate2 (Dodecahedron4)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron5) rotate Torus_rotate2 (Dodecahedron5)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron6) rotate Torus_rotate2 (Dodecahedron6)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron7) rotate Torus_rotate2 (Dodecahedron7)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron8) rotate Torus_rotate2 (Dodecahedron8)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron9) rotate Torus_rotate2 (Dodecahedron9)} torus {Major_radius,Minor_radius rotate Torus_rotate1 (Dodecahedron10) rotate Torus_rotate2 (Dodecahedron10)} } #end