Pythagorean Pentagram Tesselation of the Great Stellated Dodecahedron
Pythagorean Pentagram Tesselation of the Great Stellated Dodecahedron
by Stewart Dickson
A recursive “graftal” procedure with self-similarity and infinite detail, which dates from circa 525 B.C.
1) The twenty vertices of the regular Pentagonal Dodecahedron -- the endpoints of the pentagramic faces are parallel to the faces of the Dodecahedron
1) The twenty vertices of the regular Pentagonal Dodecahedron -- the endpoints of the pentagramic faces are parallel to the faces of the Dodecahedron
scale=3.0;
dodecPoints=scale*{(*0*){1.0,1.0,1.0},(*1*){1.0,1.0,-1.0},(*2*){1.0,-1.0,-1.0},(*3*){1.0,-1.0,1.0},(*4*){-1.0,-1.0,1.0},(*5*){-1.0,-1.0,-1.0},(*6*){-1.0,1.0,-1.0},(*7*){-1.0,1.0,1.0},(*8*){0.0,0.61803401,1.618035},(*9*){0.0,0.61803401,-1.618035},(*10*){0.0,-0.61803401,-1.618035},(*11*){0.0,-0.61803401,1.618035},(*12*){1.618035,0.0,0.61803401},(*13*){1.618035,0.0,-0.61803401},(*14*){-1.618035,0.0,-0.61803401},(*15*){-1.618035,0.0,0.61803401},(*16*){0.61803401,1.618035,0.0},(*17*){0.61803401,-1.618035,0.0},(*18*){-0.61803401,-1.618035,0.0},(*19*){-0.61803401,1.618035,0.0}}
2) Intersect the diagonals of the pentagon/-gram pairwise with each other
2) Intersect the diagonals of the pentagon/-gram pairwise with each other
From: Wolfram MathWorld, “Line-Line Intersection.” Weisstein, Eric W.
http://mathworld.wolfram.com/Line-LineIntersection.html
http://mathworld.wolfram.com/Line-LineIntersection.html
intersect3D[seg0_List,seg1_List]:=Block[{begin=1,end=2,a,b,c,aCrossb,cCrossb},a=Part[seg0,end]-Part[seg0,begin];b=Part[seg1,end]-Part[seg1,begin];c=Part[seg1,begin]-Part[seg0,begin];aCrossb=Cross[a,b];cCrossb=Cross[c,b];result=Part[seg0,begin]+a*Dot[cCrossb,aCrossb]/(Norm[aCrossb]^2)]
subPentagon[prevPoints_List]:={intersect3D[{prevPoints[[5]],prevPoints[[2]]},{prevPoints[[1]],prevPoints[[3]]}],intersect3D[{prevPoints[[1]],prevPoints[[3]]},{prevPoints[[2]],prevPoints[[4]]}],intersect3D[{prevPoints[[2]],prevPoints[[4]]},{prevPoints[[3]],prevPoints[[5]]}],intersect3D[{prevPoints[[3]],prevPoints[[5]]},{prevPoints[[4]],prevPoints[[1]]}],intersect3D[{prevPoints[[4]],prevPoints[[1]]},{prevPoints[[5]],prevPoints[[2]]}]}
3) For each point of the “Pentagram0” (Gray) -- Project a Green pentagram from the level-2 pentagram outward into the arms of the “Pentagram0”. Extend the lines in “Pentagram2” (Green) to intersect with the diagonals of “Pentagram0” (Gray) and an edge of the pentagon1 (Blue)
3) For each point of the “Pentagram0” (Gray) -- Project a Green pentagram from the level-2 pentagram outward into the arms of the “Pentagram0”. Extend the lines in “Pentagram2” (Green) to intersect with the diagonals of “Pentagram0” (Gray) and an edge of the pentagon1 (Blue)
subPentagram[railApex_List,railBase0_List,railBase1_List,cross0_List,cross1_List,projectBase1_List,projectBase2_List,projectBase3_List,levels_Integer]:=Block[{seg0endp0,seg0endp1,seg1endp0,seg1endp1,result0,result1,pentPoints,subPentPoints},(*projectBase1,cross0,andcross1arethefirstthreeverticesoftheprojectedpentagram--thenexttwoverticesaretheintersectionoflines4)projectBase1,projectBase2andrailApex,railBase15)projectBase1,projectBase3andrailApex,railBase0*)seg0endp0=projectBase1;seg0endp1=projectBase2;seg1endp0=railApex;seg1endp1=railBase1;result0=intersect3D[{seg0endp0,seg0endp1},{seg1endp0,seg1endp1}];seg0endp0=projectBase1;seg0endp1=projectBase3;seg1endp0=railApex;seg1endp1=railBase0;result1=intersect3D[{seg0endp0,seg0endp1},{seg1endp0,seg1endp1}];pentPoints={cross0,projectBase1,cross1,result0,result1};(*generatethesub-pentagram*)subPentPoints=subPentagon[pentPoints];If[levels>0,{(*drawthepentagram*)If[EvenQ[levels],RGBColor[0,0,1],RGBColor[1,0,0]],Line[{pentPoints[[1]],pentPoints[[3]],pentPoints[[5]],pentPoints[[2]],pentPoints[[4]],pentPoints[[1]]}],(*drawthesub-pentagram*)If[EvenQ[levels],RGBColor[1,0,0],RGBColor[0,0,1]],Line[{subPentPoints[[1]],subPentPoints[[3]],subPentPoints[[5]],subPentPoints[[2]],subPentPoints[[4]],subPentPoints[[1]]}],(*recursetothenextlevelusingtheoriginalrailpointsandthetwolevelsofsub-pentagrampointsjustgenerated*)subPentagram[railApex,railBase0,railBase1,pentPoints[[5]],pentPoints[[4]],subPentPoints[[4]],subPentPoints[[1]],subPentPoints[[2]],levels-1]}]]
pentagram[pentPoints0_List,levels_Integer]:=Block[{pentPoints1,pentPoints2},pentPoints1=subPentagon[pentPoints0];(*Twolevelsdeep*)pentPoints2=subPentagon[pentPoints1];(*Drawthepentagrams*){RGBColor[0,0,0],Line[{pentPoints0[[1]],pentPoints0[[3]],pentPoints0[[5]],pentPoints0[[2]],pentPoints0[[4]],pentPoints0[[1]]}],RGBColor[0,0,1],Line[{pentPoints1[[1]],pentPoints1[[3]],pentPoints1[[5]],pentPoints1[[2]],pentPoints1[[4]],pentPoints1[[1]]}],RGBColor[0,1,0],Line[{pentPoints2[[1]],pentPoints2[[3]],pentPoints2[[5]],pentPoints2[[2]],pentPoints2[[4]],pentPoints2[[1]]}],Flatten[DeleteCases[Flatten[{subPentagram[pentPoints0[[1]],pentPoints0[[3]],pentPoints0[[4]],pentPoints1[[1]],pentPoints1[[5]],pentPoints2[[5]],pentPoints2[[2]],pentPoints2[[3]],levels],subPentagram[pentPoints0[[2]],pentPoints0[[4]],pentPoints0[[5]],pentPoints1[[2]],pentPoints1[[1]],pentPoints2[[1]],pentPoints2[[3]],pentPoints2[[4]],levels],subPentagram[pentPoints0[[3]],pentPoints0[[5]],pentPoints0[[1]],pentPoints1[[3]],pentPoints1[[2]],pentPoints2[[2]],pentPoints2[[4]],pentPoints2[[5]],levels],subPentagram[pentPoints0[[4]],pentPoints0[[1]],pentPoints0[[2]],pentPoints1[[4]],pentPoints1[[3]],pentPoints2[[3]],pentPoints2[[5]],pentPoints2[[1]],levels],subPentagram[pentPoints0[[5]],pentPoints0[[2]],pentPoints0[[3]],pentPoints1[[5]],pentPoints1[[4]],pentPoints2[[4]],pentPoints2[[1]],pentPoints2[[2]],levels]}],_Null]]}]