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

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}}
A very large output was generated. Showing a sample of it.
{{3.,3.,3.},{3.,3.,-3.},{3.,-3.,-3.},{3.,-3.,3.},{-3.,-3.,3.},{-3.,-3.,-3.},{-3.,3.,-3.},7
,{-4.85411,0.,-1.8541},{-4.85411,0.,1.8541},{1.8541,4.85411,0.},{1.8541,-4.85411,0.},{-1.8541,
-4.85411,0.},{-1.8541,4.85411,0.}}
show less
show more
show all
set size limit...

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
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)

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,andcross1​​arethefirstthreeverticesoftheprojectedpentagram--thenexttwoverticesaretheintersectionoflines​​4)projectBase1,projectBase2andrailApex,railBase1​​5)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]]}],​​(*recursetothenextlevelusingtheoriginalrailpointsandthe​​twolevelsofsub-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]]}​​]