Sep 12, 2013

Tangram

Fig. 1 A standard tangram with rainbow colors: (red, orange, yellow, green, cyan, blue, purple)
The tangram (Chinese: 七巧板 - seven boards) is a set of boards (shown above) that can be put together to form specific shapes.  For example, different shapes of cat:
Fig. 2 several shapes of cat

Mathematica codes to draw the tangram shown in Fig. 1:
Graphics[{EdgeForm[{Darker@Gray, Thick, Opacity[0.4]}],
  Orange, Polygon[{{0, 0}, {0, 1}, {1/2, 1/2}}],
  Green, Polygon[{{0, 1}, {1, 1}, {1/2, 1/2}}],
  Red, Polygon[{{1, 1}, {1, 1/2}, {3/4, 3/4}}],
  Yellow, Polygon[{{3/4, 3/4}, {1, 1/2}, {3/4, 1/4}, {1/2, 1/2}}],
  Blue, Polygon[{{1/2, 1/2}, {3/4, 1/4}, {1/4, 1/4}}],
  Cyan, Polygon[{{1/4, 1/4}, {3/4, 1/4}, {1/2, 0}, {0, 0}}],
  Purple, Polygon[{{1/2, 0}, {1, 1/2}, {1, 0}}]
  }]

A Mathematica app to play with tangram:

Framed@DynamicModule[{O1 = {1/6, 1/2}, O2 = {1/2, 5/6}, 
   O3 = {11/12, 3/4}, O4 = {3/4, 1/2}, O5 = {1/2, 1/3}, 
   O6 = {3/8, 1/8}, O7 = {5/6, 1/6}, p1 = {-.25, -.25}, 
   p2 = {0, -.25}, p3 = {0.25, -.25}, p4 = {.5, -.25}, 
   p5 = {.75, -.25}, p6 = {1, -.25}, p7 = {1.25, -.25}, v1, v2, v3, 
   v4, v5, v6, v7, r = 0.08, v0 = {1, 0}, 
   g = Graphics[{Gray, PointSize[Medium], Point[{0, 0}]}], 
   gray = False},
  
  {v1, v2, v3, v4, v5, v6, 
    v7} = ({r, 0} + #) & /@ {p1, p2, p3, p4, p5, p6, p7};
  Column[{Row[{Text["check here to paint gray:"], 
      Checkbox[Dynamic[gray]]}], 
    LocatorPane[
     Dynamic[{v1, v2, v3, v4, v5, v6, v7, O1, O2, O3, O4, O5, O6, 
       O7}], Dynamic[
      Graphics[{EdgeForm[], If[gray, Gray, Orange], 
        Polygon[RotationTransform[{v0, Normalize[v1 - p1]}, 
           O1] /@ {O1 - {1/6, 1/2} + {0, 0}, O1 - {1/6, 1/2} + {0, 1},
            O1 - {1/6, 1/2} + {1/2, 1/2}}], If[gray, Gray, Green], 
        Polygon[RotationTransform[{v0, Normalize[v2 - p2]}, 
           O2] /@ {O2 - {1/2, 5/6} + {0, 1}, O2 - {1/2, 5/6} + {1, 1},
            O2 - {1/2, 5/6} + {1/2, 1/2}}], If[gray, Gray, Red], 
        Polygon[RotationTransform[{v0, Normalize[v3 - p3]}, 
           O3] /@ {O3 - {11/12, 3/4} + {1, 1}, 
           O3 - {11/12, 3/4} + {1, 1/2}, 
           O3 - {11/12, 3/4} + {3/4, 3/4}}], If[gray, Gray, Yellow], 
        Polygon[RotationTransform[{v0, Normalize[v4 - p4]}, 
           O4] /@ {O4 - {3/4, 1/2} + {3/4, 3/4}, 
           O4 - {3/4, 1/2} + {1, 1/2}, O4 - {3/4, 1/2} + {3/4, 1/4}, 
           O4 - {3/4, 1/2} + {1/2, 1/2}}], If[gray, Gray, Cyan], 
        Polygon[RotationTransform[{v0, Normalize[v5 - p5]}, 
           O5] /@ {O5 - {1/2, 1/3} + {1/2, 1/2}, 
           O5 - {1/2, 1/3} + {3/4, 1/4}, 
           O5 - {1/2, 1/3} + {1/4, 1/4}}], If[gray, Gray, Blue], 
        Polygon[RotationTransform[{v0, Normalize[v6 - p6]}, 
           O6] /@ {O6 - {3/8, 1/8} + {1/4, 1/4}, 
           O6 - {3/8, 1/8} + {3/4, 1/4}, O6 - {3/8, 1/8} + {1/2, 0}, 
           O6 - {3/8, 1/8} + {0, 0}}], If[gray, Gray, Purple], 
        Polygon[RotationTransform[{v0, Normalize[v7 - p7]}, 
           O7] /@ {O7 - {5/6, 1/6} + {1/2, 0}, 
           O7 - {5/6, 1/6} + {1, 1/2}, O7 - {5/6, 1/6} + {1, 0}}], 
        Opacity[0.6], Gray, PointSize[0.02], 
        Point[{O1, O2, O3, O4, O5, O6, O7}], Orange, Disk[p1, r], 
        Green, Disk[p2, r], Red, Disk[p3, r], Yellow, Disk[p4, r], 
        Cyan, Disk[p5, r], Blue, Disk[p6, r], Purple, Disk[p7, r], 
        Black, Arrowheads[Medium], 
        Arrow /@ {{p1, p1 + r Normalize[v1 - p1]}, {p2, 
           p2 + r Normalize[v2 - p2]}, {p3, 
           p3 + r Normalize[v3 - p3]}, {p4, 
           p4 + r Normalize[v4 - p4]}, {p5, 
           p5 + r Normalize[v5 - p5]}, {p6, 
           p6 + r Normalize[v6 - p6]}, {p7, 
           p7 + r Normalize[v7 - p7]}}}, 
       PlotRange -> {{-1/2, 3/2}, {-1/2, 3/2}}, ImageSize -> 600]], 
     Appearance -> None ]}]]

copy codes from gist: https://gist.github.com/anonymous/6564099
Fig. 3 use the app to form some shape

No comments:

Post a Comment