PLATONIC POLYHEDRON
MODELS

Instructions:

Print  this notebook.   Xerox the diagrams onto heavy card stock, with as much 
magnification as possible.   Cut out the figures with a construction knife or scissors,  score and fold at the lines.  The grey tabs are for gluing; use a slow drying library paste rather than contact cement in order to insure proper alignment.   

For the icosahedron and dodecahedron, there are two dual pieces,  each piece for  making a "hemisphere" of the polyhedron.   (The two pieces are mirror images; it is only because of the glue tabs that the chirality is necessary.)

You can resize the graphics for the tetrahedron, octahedron and cube, using the mathematica front end,  but it might prove tricky to do the same for the 
icosahedron and dodecahedron and still have the two pieces match exactly.

Author's notice

This tutorial was written by 

Fred Goodman
Department of Mathematics
University of Iowa
Iowa City, IA 52242
goodman@math.uiowa.edu

This material may be freely copied and used for non-commercial purposes.
Please retain this author's notice, and do not distribute any altered version
of this material without the author's permission  (unless  the material is altered beyond recognition).

This material  supplements  the text  Algebra: Symmetry Groups, Rings, and Fields,
Prentice-Hall, 1997.

Programming

Triangle /: Vertices[Triangle] := 
      N[{{1, 0}, {Re[Exp[((2 π I)/3)]], Im[Exp[((2 π I)/3)]]}, {
            Re[Exp[((4 π I)/3)]], Im[Exp[((4 π I)/3)]]}}]

Triangle /: Edges[Triangle] := {{1, 2}, {2, 3}, {1, 3}}

DualVertices[polygon_] := 
      Module[{vertices, edges}, vertices = Vertices[polygon]; 
        edges = Edges[polygon]; 
        (1/2) Apply[Plus, 
            (vertices[[#1]]&)/@
              edges, 1]]

Norm[vector_] := (Sqrt[Plus])@@(#(1^2)&)/@vector

DualTriangle /: Vertices[DualTriangle] := 2 DualVertices[Triangle]DualTriangle /: Edges[DualTriangle] = Edges[Triangle];

complexToCartesian[z_] := {Re[z], Im[z]}

Pentagon /: Vertices[Pentagon] := 
      complexToCartesian/@Table[N[Exp[((2 π I k)/5)]], {k, 0, 4}]DualPentagon /: Vertices[DualPentagon] := 
      complexToCartesian/@
        Table[N[Exp[π I + ((2 π I k)/5)]], {k, 0, 4}]Pentagon /: 
      Edges[Pentagon] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 1}}; DualPentagon /: Edges[DualPentagon] = Edges[Pentagon];

Square /: 
      Vertices[Square] := {{1, 1}, {-1, 1}, {-1, -1}, {1, -1}}
        Square /: Edges[Square] := {{1, 2}, {2, 3}, {3, 4}, {4, 1}}

skeleton2D[polygon_, edgecolor_, vertexcolor_] := 
      skeleton2D[polygon, edgecolor, vertexcolor, {0, 0}, 1.]skeleton2D[polygon_, edgecolor_, vertexcolor_, translation_, scale_] := 
      Module[{vertices, edges, lines, points}, 
        vertices = (translation + #1&)/@(scale Vertices[polygon]); 
        edges = Edges[polygon]; 
        lines = Line/@
            (vertices[[#1]]&)/@
              edges; points = Point/@vertices; 
        Graphics[{{Thickness[.005], edgecolor, lines}, {PointSize[.01], 
              vertexcolor, points}}]]

tab[a_, b_] := 
      Module[{alpha, v0, v1}, alpha = (1/10); 
        v0 = (1/10) 
            ((b - a)[[1]] + 
                I (b - a)[[2]]) 
            Exp[-((π I)/4)]; v0 = {Re[v0], Im[v0]}; 
        v1 = (1/10) 
            ((b - a)[[1]] + 
                I (b - a)[[2]]) 
            Exp[((π I)/4)]; v1 = {Re[v1], Im[v1]}; 
        Graphics[{grey, 
            Polygon[{(1 - alpha) a + alpha b, 
                (1 - alpha) a + alpha b + v0, 
                (1 - alpha) b + alpha a - v1, 
                (1 - alpha) b + alpha a}]}]]dualtab[a_, b_] := 
      Module[{alpha, v0, v1}, alpha = (1/10); 
        v0 = (1/10) 
            ((b - a)[[1]] + 
                I (b - a)[[2]]) 
            Exp[((π I)/4)]; v0 = {Re[v0], Im[v0]}; 
        v1 = (1/10) 
            ((b - a)[[1]] + 
                I (b - a)[[2]]) 
            Exp[-((π I)/4)]; v1 = {Re[v1], Im[v1]}; 
        Graphics[{grey, 
            Polygon[{(1 - alpha) a + alpha b, 
                (1 - alpha) a + alpha b + v0, 
                (1 - alpha) b + alpha a - v1, 
                (1 - alpha) b + alpha a}]}]]

red = RGBColor[.8, 0, 0]; blue = RGBColor[0, 0, .8]; black = RGBColor[0, 0, 0]; green = RGBColor[0, .5, .2]; grey = RGBColor[.6, .6, .6];

tetrahedron[] := 
      Module[{basicvectors}, basicvectors = 2 DualVertices[Triangle]; 
        Show[{tab[
              basicvectors[[1]] + 
                Vertices[DualTriangle][[1
                  ]], 
              basicvectors[[1]] + 
                Vertices[DualTriangle][[2
                  ]]], 
            tab[basicvectors[[1]] + 
                Vertices[DualTriangle][[3
                  ]], 
              basicvectors[[1]] + 
                Vertices[DualTriangle][[1
                  ]]], 
            tab[basicvectors[[2]] + 
                Vertices[DualTriangle][[2
                  ]], 
              basicvectors[[2]] + 
                Vertices[DualTriangle][[3
                  ]]], 
            skeleton2D[Triangle, red, red, {0, 0}, 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[2]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[3]], 1]}, 
          AspectRatio -> Automatic]]

cube[] := 
      Module[{basicvectors}, basicvectors = 2 DualVertices[Square]; 
        Show[{Table[
              tab[basicvectors[[i]] + 
                  Vertices[Square][[Mod[i - 1 + j, 4] + 
                      1]], 
                basicvectors[[i]] + 
                  Vertices[Square][[Mod[i + j, 4] + 1
                      ]]], {i, 2, 4}, {j, 0, 1}], 
            tab[basicvectors[[2]] + 
                Vertices[Square][[1
                  ]], 
              basicvectors[[2]] + 
                Vertices[Square][[2
                  ]]], 
            skeleton2D[Square, red, red, {0, 0}, 1], 
            Table[skeleton2D[Square, red, red, 
                basicvectors[[i]], 1], {
                i, 1, 4}], 
            skeleton2D[Square, red, red, 
              2 basicvectors[[1]], 1]}, 
          AspectRatio -> Automatic]]

octahedron[] := 
      Module[{basicvectors}, basicvectors = 2 DualVertices[Triangle]; 
        Show[{tab[
              basicvectors[[3]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[1
                  ]], 
              basicvectors[[3]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[2
                  ]]], 
            tab[basicvectors[[3]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[3
                  ]], 
              basicvectors[[3]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[1
                  ]]], 
            tab[basicvectors[[3]] - 
                basicvectors[[1]] + 
                Vertices[Triangle][[2
                  ]], 
              basicvectors[[3]] - 
                basicvectors[[1]] + 
                Vertices[Triangle][[3
                  ]]], 
            tab[basicvectors[[2]] - 
                basicvectors[[3]] + 
                Vertices[Triangle][[2
                  ]], 
              basicvectors[[2]] - 
                basicvectors[[3]] + 
                Vertices[Triangle][[3
                  ]]], 
            tab[basicvectors[[1]] + 
                Vertices[DualTriangle][[1
                  ]], 
              basicvectors[[1]] + 
                Vertices[DualTriangle][[2
                  ]]], 
            skeleton2D[Triangle, red, red, {0, 0}, 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[2]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[3]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[3]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[3]] - 
                basicvectors[[2]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[3]] - 
                basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[3]] - 
                basicvectors[[1]] + 
                basicvectors[[3]], 1]}, 
          AspectRatio -> Automatic]]

icosahedron := 
      Module[{basicvectors}, basicvectors = 2 DualVertices[Triangle]; 
        Show[{tab[
              basicvectors[[3]] + 
                Vertices[DualTriangle][[3
                  ]], 
              basicvectors[[3]] + 
                Vertices[DualTriangle][[1
                  ]]], 
            tab[basicvectors[[1]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[1
                  ]], 
              basicvectors[[1]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[2
                  ]]], 
            tab[2 basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[1
                  ]], 
              2 basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[2
                  ]]], 
            tab[basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[Triangle][[2
                  ]], 
              basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[Triangle][[3
                  ]]], 
            tab[2 basicvectors[[2]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[2
                  ]], 
              2 basicvectors[[2]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[3
                  ]]], 
            tab[basicvectors[[2]] - 
                basicvectors[[1]] + 
                Vertices[Triangle][[3
                  ]], 
              basicvectors[[2]] - 
                basicvectors[[1]] + 
                Vertices[Triangle][[1
                  ]]], 
            skeleton2D[Triangle, red, red, {0, 0}, 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[2]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[3]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[1]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[1]] - 
                basicvectors[[3]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[1]] - 
                basicvectors[[2]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[1]] - 
                basicvectors[[3]] + 
                basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[3]] + 
                basicvectors[[2]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[3]], 1]}, 
          AspectRatio -> Automatic]]

revicosahedron[] := 
      Module[{Triangle, DualTriangle, tab, basicvectors}, 
        Triangle /: Vertices[Triangle] := 
          N[{{-1, 0}, {-Re[Exp[((2 π I)/3)]], 
                Im[Exp[((2 π I)/3)]]}, {
                -Re[Exp[((4 π I)/3)]], 
                Im[Exp[((4 π I)/3)]]}}]; 
        Triangle /: Edges[Triangle] := {{1, 2}, {2, 3}, {1, 3}}; 
        DualVertices[polygon_] := 
          Module[{vertices, edges}, vertices = Vertices[polygon]; 
            edges = Edges[polygon]; 
            (1/2) Apply[Plus, 
                (vertices[[#1]]&)/@
                  edges, 1]]; 
        Norm[vector_] := (Sqrt[Plus])@@(#(1^2)&)/@vector; 
        DualTriangle /: Vertices[DualTriangle] := 2 DualVertices[Triangle]; 
        DualTriangle /: Edges[DualTriangle] = Edges[Triangle]; 
        tab[a_, b_] := 
          Module[{alpha, v0, v1}, alpha = (1/10); 
            v0 = (1/10) 
                ((b - a)[[1]] + 
                    I (b - a)[[2]])
                   Exp[((π I)/4)]; v0 = {Re[v0], Im[v0]}; 
            v1 = (1/10) 
                ((b - a)[[1]] + 
                    I (b - a)[[2]])
                   Exp[-((π I)/4)]; v1 = {Re[v1], Im[v1]}; 
            Graphics[{grey, 
                Polygon[{(1 - alpha) a + alpha b, 
                    (1 - alpha) a + alpha b + v0, 
                    (1 - alpha) b + alpha a - v1, 
                    (1 - alpha) b + alpha a}]}]]; 
        basicvectors = 2 DualVertices[Triangle]; 
        Show[{tab[
              basicvectors[[3]] + 
                Vertices[DualTriangle][[3
                  ]], 
              basicvectors[[3]] + 
                Vertices[DualTriangle][[1
                  ]]], 
            tab[basicvectors[[1]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[1
                  ]], 
              basicvectors[[1]] - 
                basicvectors[[2]] + 
                Vertices[Triangle][[2
                  ]]], 
            tab[2 basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[1
                  ]], 
              2 basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[2
                  ]]], 
            tab[basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[Triangle][[2
                  ]], 
              basicvectors[[1]] - 
                basicvectors[[3]] + 
                Vertices[Triangle][[3
                  ]]], 
            tab[2 basicvectors[[2]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[2
                  ]], 
              2 basicvectors[[2]] - 
                basicvectors[[3]] + 
                Vertices[DualTriangle][[3
                  ]]], 
            tab[basicvectors[[2]] - 
                basicvectors[[1]] + 
                Vertices[Triangle][[3
                  ]], 
              basicvectors[[2]] - 
                basicvectors[[1]] + 
                Vertices[Triangle][[1
                  ]]], 
            skeleton2D[Triangle, red, red, {0, 0}, 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[2]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[3]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[1]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[1]] - 
                basicvectors[[3]], 1], 
            skeleton2D[Triangle, red, red, 
              basicvectors[[1]] - 
                basicvectors[[2]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[1]] - 
                basicvectors[[3]] + 
                basicvectors[[1]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[2]] - 
                basicvectors[[3]] + 
                basicvectors[[2]], 1], 
            skeleton2D[DualTriangle, red, red, 
              basicvectors[[3]], 1]}, 
          AspectRatio -> Automatic]]

dodecahedron := 
      Module[{basicvectors}, basicvectors = 2 DualVertices[Pentagon]; 
        Show[{skeleton2D[Pentagon, red, red, {0, 0}, 1], 
            Table[{tab[
                  basicvectors[[i]] + 
                    Vertices[DualPentagon][[Mod[i, 5] + 
                        1]], 
                  basicvectors[[i]] + 
                    Vertices[DualPentagon]
                        [[Mod[i + 1, 5] + 1
                        ]]], 
                tab[basicvectors[[i]] + 
                    Vertices[DualPentagon]
                        [[Mod[i + 1, 5] + 1
                        ]], 
                  basicvectors[[i]] + 
                    Vertices[DualPentagon]
                        [[Mod[i + 2, 5] + 1
                        ]]], 
                skeleton2D[DualPentagon, red, red, 
                  basicvectors[[i]], 
                  1]}, {i, 1, 5}]}, AspectRatio -> Automatic]]

revdodecahedron := 
      Module[{basicvectors, Pentagon, DualPentagon, tab}, 
        Pentagon /: Vertices[Pentagon] := 
          complexToCartesian/@
            Table[N[Exp[-(2/5) π I k]], {k, 0, 4}]; 
        DualPentagon /: Vertices[DualPentagon] := 
          complexToCartesian/@
            Table[N[Exp[π I - ((2 π I k)/5)]], {k, 0, 4}]; 
        Pentagon /: 
          Edges[Pentagon] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 1}}; 
        DualPentagon /: Edges[DualPentagon] = Edges[Pentagon]; 
        tab[a_, b_] := 
          Module[{alpha, v0, v1}, alpha = (1/10); 
            v0 = (1/10) 
                ((b - a)[[1]] + 
                    I (b - a)[[2]])
                   Exp[((π I)/4)]; v0 = {Re[v0], Im[v0]}; 
            v1 = (1/10) 
                ((b - a)[[1]] + 
                    I (b - a)[[2]])
                   Exp[-((π I)/4)]; v1 = {Re[v1], Im[v1]}; 
            Graphics[{grey, 
                Polygon[{(1 - alpha) a + alpha b, 
                    (1 - alpha) a + alpha b + v0, 
                    (1 - alpha) b + alpha a - v1, 
                    (1 - alpha) b + alpha a}]}]]; 
        basicvectors = 2 DualVertices[Pentagon]; 
        Show[{skeleton2D[Pentagon, red, red, {0, 0}, 1], 
            Table[{tab[
                  basicvectors[[i]] + 
                    Vertices[DualPentagon][[Mod[i, 5] + 
                        1]], 
                  basicvectors[[i]] + 
                    Vertices[DualPentagon]
                        [[Mod[i + 1, 5] + 1
                        ]]], 
                tab[basicvectors[[i]] + 
                    Vertices[DualPentagon]
                        [[Mod[i + 1, 5] + 1
                        ]], 
                  basicvectors[[i]] + 
                    Vertices[DualPentagon]
                        [[Mod[i + 2, 5] + 1
                        ]]], 
                skeleton2D[DualPentagon, red, red, 
                  basicvectors[[i]], 
                  1]}, {i, 1, 5}]}, AspectRatio -> Automatic]]

tetrahedron[]cube[]octahedron[]icosahedron[]revicosahedron[]dodecahedron[]revdodecahedron[]